223 changed files with 4382 additions and 2847 deletions
@ -0,0 +1,11 @@
|
||||
{ |
||||
"version": "0.2.0", |
||||
"configurations": [ |
||||
{ |
||||
"name": "Launch and Debug Standalone Blazor WebAssembly App", |
||||
"type": "blazorwasm", |
||||
"request": "launch", |
||||
"cwd": "${workspaceFolder}/IGP" |
||||
} |
||||
] |
||||
} |
||||
@ -0,0 +1,41 @@
|
||||
{ |
||||
"version": "2.0.0", |
||||
"tasks": [ |
||||
{ |
||||
"label": "build", |
||||
"command": "dotnet", |
||||
"type": "process", |
||||
"args": [ |
||||
"build", |
||||
"${workspaceFolder}/IGP/IGP.csproj", |
||||
"/property:GenerateFullPaths=true", |
||||
"/consoleloggerparameters:NoSummary" |
||||
], |
||||
"problemMatcher": "$msCompile" |
||||
}, |
||||
{ |
||||
"label": "publish", |
||||
"command": "dotnet", |
||||
"type": "process", |
||||
"args": [ |
||||
"publish", |
||||
"${workspaceFolder}/IGP/IGP.csproj", |
||||
"/property:GenerateFullPaths=true", |
||||
"/consoleloggerparameters:NoSummary" |
||||
], |
||||
"problemMatcher": "$msCompile" |
||||
}, |
||||
{ |
||||
"label": "watch", |
||||
"command": "dotnet", |
||||
"type": "process", |
||||
"args": [ |
||||
"watch", |
||||
"run", |
||||
"--project", |
||||
"${workspaceFolder}/IGP/IGP.csproj" |
||||
], |
||||
"problemMatcher": "$msCompile" |
||||
} |
||||
] |
||||
} |
||||
@ -1,29 +1,27 @@
|
||||
<div class="paper"> |
||||
<div class="paperDisplay"> |
||||
@ChildContent |
||||
</div> |
||||
|
||||
<style> |
||||
.paper { |
||||
.paperDisplay { |
||||
padding-top: 24px; |
||||
padding-left: 24px; |
||||
padding-right: 24px; |
||||
padding-bottom: 24px; |
||||
margin: auto; |
||||
overflow-y: auto; |
||||
overflow-x: hidden; |
||||
border: 4px solid var(--paper-border); |
||||
background-color: var(--paper); |
||||
box-shadow: 0px 6px var(--paper-border); |
||||
width: 100%; |
||||
} |
||||
</style> |
||||
|
||||
@code { |
||||
|
||||
[Parameter] |
||||
public RenderFragment ChildContent { get; set; } |
||||
public RenderFragment ChildContent { get; set; } = default!; |
||||
|
||||
[Parameter] |
||||
public string Title { get; set; } |
||||
public string Title { get; set; } = default!; |
||||
|
||||
} |
||||
@ -0,0 +1,58 @@
|
||||
|
||||
<div class="layoutWithSidebar"> |
||||
<div class="layoutSidebar"> |
||||
@Sidebar |
||||
</div> |
||||
<div class="layoutContent"> |
||||
@Content |
||||
</div> |
||||
</div> |
||||
|
||||
<style scoped> |
||||
.layoutWithSidebar { |
||||
display: grid; |
||||
|
||||
gap: 16px; |
||||
width: 65%; |
||||
min-width: 1000px; |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
padding-top: 10px; |
||||
padding-bottom: 30px; |
||||
|
||||
grid-template-columns: 412px 1fr; |
||||
} |
||||
|
||||
.layoutSidebar { |
||||
background: var(--paper); |
||||
padding: 16px; |
||||
} |
||||
|
||||
.layoutContent { |
||||
} |
||||
|
||||
@@media only screen and (max-width: 1025px) { |
||||
.layoutWithSidebar { |
||||
flex-direction: column-reverse; |
||||
width: 100%; |
||||
min-width: 350px; |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
@@media only screen and (min-width: 1024px) { |
||||
.layoutWithSidebar { |
||||
margin-top: 50px; |
||||
} |
||||
} |
||||
|
||||
</style> |
||||
|
||||
@code { |
||||
[Parameter] |
||||
public RenderFragment Sidebar { get; set; } = default!; |
||||
|
||||
[Parameter] |
||||
public RenderFragment Content { get; set; } = default!; |
||||
} |
||||
@ -1,22 +1,15 @@
|
||||
@if (Markdown == null) { |
||||
<div>Loading...</div> |
||||
} |
||||
else { |
||||
@((MarkupString)Markdown) |
||||
} |
||||
@((MarkupString)MarkdownText) |
||||
|
||||
@code { |
||||
|
||||
[Inject] |
||||
protected HttpClient Http { get; set; } |
||||
protected HttpClient Http { get; set; } = default!; |
||||
|
||||
[Parameter] |
||||
public string MarkdownFileName { get; set; } |
||||
public string MarkdownFileName { get; set; } = default!; |
||||
|
||||
public string Markdown { get; set; } |
||||
private string MarkdownText { get; set; } = ""; |
||||
|
||||
protected override async Task OnInitializedAsync() { |
||||
Markdown = Markdig.Markdown.ToHtml(await Http.GetStringAsync($"markdown/{MarkdownFileName}.md")); |
||||
MarkdownText = Markdig.Markdown.ToHtml(await Http.GetStringAsync($"markdown/{MarkdownFileName}.md")); |
||||
} |
||||
|
||||
} |
||||
Binary file not shown.
@ -1,23 +1,24 @@
|
||||
@implements IDisposable |
||||
@inject IBuildOrderService buildOrderService |
||||
|
||||
@implements IDisposable |
||||
|
||||
<FormLayoutComponent> |
||||
<FormTextAreaComponent Label="JSON Data" |
||||
Rows="14" |
||||
Value="@BuildOrderService.AsJson()"> |
||||
Value="@buildOrderService.AsJson()"> |
||||
</FormTextAreaComponent> |
||||
</FormLayoutComponent> |
||||
|
||||
@code { |
||||
|
||||
[Inject] |
||||
IBuildOrderService BuildOrderService { get; set; } |
||||
|
||||
protected override void OnInitialized() { |
||||
BuildOrderService.Subscribe(StateHasChanged); |
||||
protected override void OnInitialized() |
||||
{ |
||||
buildOrderService.Subscribe(StateHasChanged); |
||||
} |
||||
|
||||
void IDisposable.Dispose() { |
||||
BuildOrderService.Unsubscribe(StateHasChanged); |
||||
void IDisposable.Dispose() |
||||
{ |
||||
buildOrderService.Unsubscribe(StateHasChanged); |
||||
} |
||||
|
||||
} |
||||
@ -1,100 +1,106 @@
|
||||
@if (Entity.IdPassives().Count > 0) { |
||||
@if (Entity!.IdPassives().Count > 0) |
||||
{ |
||||
@if (StyleType.Equals("Plain")) |
||||
{ |
||||
@foreach (var idPassive in Entity.IdPassives()) { |
||||
@foreach (var idPassive in Entity.IdPassives()) |
||||
{ |
||||
var passive = EntityModel.Get(idPassive.Id); |
||||
|
||||
var info = passive.Info(); |
||||
|
||||
|
||||
var production = passive.Production(); |
||||
|
||||
<div> |
||||
<div> |
||||
<b>Name:</b> @info.Name |
||||
<b>Name:</b> @info.Name |
||||
</div> |
||||
<div> |
||||
<b>- Description:</b> @((MarkupString)info.Description) |
||||
</div> |
||||
|
||||
@if (!info.Notes.Trim().Equals("")) { |
||||
|
||||
|
||||
@if (!info.Notes.Trim().Equals("")) |
||||
{ |
||||
<div> |
||||
<b>- Description:</b> @((MarkupString)info.Notes) |
||||
</div> |
||||
</div> |
||||
} |
||||
</div> |
||||
|
||||
@if (production != null) { |
||||
|
||||
@if (production != null) |
||||
{ |
||||
<div> |
||||
@if (production.Pyre != 0) { |
||||
@if (production.Pyre != 0) |
||||
{ |
||||
<div> |
||||
<b>- Pyre:</b> @production.Pyre |
||||
</div> |
||||
</div> |
||||
} |
||||
@if (production.Cooldown != 0) { |
||||
@if (production.Cooldown != 0) |
||||
{ |
||||
<div> |
||||
<b>- Cooldown:</b> @production.Cooldown.ToString()s |
||||
</div> |
||||
</div> |
||||
} |
||||
</div> |
||||
} |
||||
} |
||||
|
||||
} |
||||
else |
||||
{ |
||||
|
||||
<EntityDisplayComponent Title="Passives"> |
||||
@foreach (var idPassive in Entity.IdPassives()) { |
||||
@foreach (var idPassive in Entity.IdPassives()) |
||||
{ |
||||
var passive = EntityModel.Get(idPassive.Id); |
||||
|
||||
var info = passive.Info(); |
||||
|
||||
|
||||
var production = passive.Production(); |
||||
|
||||
<div> |
||||
<div> |
||||
<b>Name:</b> <EntityLabelComponent EntityId="@passive.DataType"/> |
||||
<b>Name:</b> <EntityLabelComponent EntityId="@passive.DataType"/> |
||||
</div> |
||||
<div> |
||||
<b>Description:</b> @((MarkupString)info.Description) |
||||
</div> |
||||
|
||||
@if (!info.Notes.Trim().Equals("")) { |
||||
|
||||
|
||||
@if (!info.Notes.Trim().Equals("")) |
||||
{ |
||||
<div> |
||||
<b>Description:</b> @((MarkupString)info.Notes) |
||||
</div> |
||||
</div> |
||||
} |
||||
</div> |
||||
|
||||
@if (production != null) { |
||||
|
||||
@if (production != null) |
||||
{ |
||||
<div> |
||||
@if (production.Pyre != 0) { |
||||
@if (production.Pyre != 0) |
||||
{ |
||||
<div> |
||||
<b>Pyre:</b> @production.Pyre |
||||
</div> |
||||
</div> |
||||
} |
||||
@if (production.Cooldown != 0) { |
||||
@if (production.Cooldown != 0) |
||||
{ |
||||
<div> |
||||
<b>Cooldown:</b> @production.Cooldown.ToString()s |
||||
</div> |
||||
</div> |
||||
} |
||||
</div> |
||||
} |
||||
} |
||||
</EntityDisplayComponent> |
||||
</EntityDisplayComponent> |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
@code { |
||||
|
||||
[CascadingParameter] |
||||
public EntityModel? Entity { get; set; } |
||||
public EntityModel? Entity { get; set; } = default!; |
||||
|
||||
|
||||
|
||||
[CascadingParameter] |
||||
public string StyleType { get; set; } = "Detailed"; |
||||
|
||||
|
||||
@ -0,0 +1,115 @@
|
||||
@layout PageLayout |
||||
|
||||
@inject IDocumentationService documentationService |
||||
@implements IDisposable |
||||
|
||||
@page "/docs" |
||||
|
||||
@if (!documentationService.IsLoaded()) |
||||
{ |
||||
<LoadingComponent/> |
||||
} |
||||
else |
||||
{ |
||||
<LayoutMediumContentComponent> |
||||
<PaperComponent> |
||||
@foreach (var docSection in documentationService.DocSectionModels) |
||||
{ |
||||
<div class="docSectionContainer"> |
||||
<div class="docSectionTitle">@docSection.Name</div> |
||||
<div class="docContentContainer"> |
||||
@foreach (var docContent in docSection.DocumentationModels) |
||||
{ |
||||
<NavLink class="docContentLink" href="@docContent.GetDocLink()"> |
||||
<div class="docContentName">@docContent.Name</div> |
||||
<div class="docContentDescription">@docContent.Description</div> |
||||
</NavLink> |
||||
} |
||||
</div> |
||||
</div> |
||||
} |
||||
</PaperComponent> |
||||
</LayoutMediumContentComponent> |
||||
} |
||||
|
||||
<style> |
||||
.docSectionContainer { |
||||
width: 100%; |
||||
padding: 8px; |
||||
} |
||||
|
||||
.docSectionTitle { |
||||
font-size: 3rem; |
||||
font-weight: bold; |
||||
text-align: center; |
||||
margin-bottom: 32px; |
||||
} |
||||
|
||||
.docContentContainer { |
||||
display: grid; |
||||
gap: 12px; |
||||
grid-template-columns: 1fr 1fr; |
||||
} |
||||
|
||||
@@media only screen and (max-width: 1025px) { |
||||
.docContentContainer { |
||||
grid-template-columns: 1fr; |
||||
} |
||||
} |
||||
|
||||
.docContentName { |
||||
font-weight: bold; |
||||
font-size: 1.6rem; |
||||
} |
||||
|
||||
.docContentDescription { |
||||
font-weight: normal; |
||||
} |
||||
|
||||
|
||||
.docContentLink { |
||||
background-color: var(--paper); |
||||
border: 1px solid var(--paper-border); |
||||
border-radius: 2px; |
||||
padding-left: 12px; |
||||
padding-right: 12px; |
||||
padding-top: 24px; |
||||
padding-bottom: 24px; |
||||
color: white; |
||||
display: flex; |
||||
flex-direction: column; |
||||
gap: 12px; |
||||
text-align: center; |
||||
margin-left: 12px; |
||||
margin-right: 12px; |
||||
} |
||||
|
||||
|
||||
.docContentLink:hover { |
||||
background-color: var(--paper-hover); |
||||
border-color: var(--paper-border-hover); |
||||
text-decoration: none; |
||||
box-shadow: 0 4px 6px rgba(0,0,0,0.6); |
||||
transform: translateY(-2px) scale(1.01); |
||||
} |
||||
</style> |
||||
|
||||
|
||||
@code { |
||||
|
||||
[Parameter] |
||||
public string? Text { get; set; } |
||||
|
||||
protected override void OnInitialized() |
||||
{ |
||||
documentationService.Subscribe(StateHasChanged); |
||||
|
||||
documentationService.Load(); |
||||
} |
||||
|
||||
public void Dispose() |
||||
{ |
||||
documentationService.Unsubscribe(StateHasChanged); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,35 @@
|
||||
<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(DocContentModel.Content))</div> |
||||
</div> |
||||
|
||||
<style> |
||||
.docTitle { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.docHeader { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
} |
||||
|
||||
.docDates { |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
|
||||
</style> |
||||
|
||||
@code { |
||||
|
||||
[Parameter] |
||||
public DocContentModel DocContentModel { get; set; } = default!; |
||||
|
||||
} |
||||
@ -0,0 +1,70 @@
|
||||
@if (Document!.DocumentationModels.Count > 0) |
||||
{ |
||||
<div class="docInnerNavContainer"> |
||||
@foreach (var innerDoc in Document.DocumentationModels) |
||||
{ |
||||
var linkStyle = $"docInnerNavButton inner_{Layers}"; |
||||
<NavLink class="@linkStyle" href="@innerDoc.GetDocLink()">@innerDoc.Name</NavLink> |
||||
<DocumentInnerNavComponent Document="@innerDoc" Layers="@IncrementLayers()"/> |
||||
} |
||||
</div> |
||||
} |
||||
|
||||
<style> |
||||
|
||||
.docInnerNavContainer { |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
|
||||
.docInnerNavButton a { |
||||
color: white; |
||||
} |
||||
|
||||
.docInnerNavButton a:hover { |
||||
color: white; |
||||
} |
||||
|
||||
.docInnerNavButton { |
||||
padding: 8px; |
||||
margin-left: 8px; |
||||
color: white; |
||||
} |
||||
|
||||
.inner_1 { |
||||
margin-left: 8px; |
||||
} |
||||
|
||||
.inner_2 { |
||||
margin-left: 16px; |
||||
} |
||||
|
||||
.inner_3 { |
||||
margin-left: 24px; |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
</style> |
||||
|
||||
@code { |
||||
|
||||
[Parameter] |
||||
public DocContentModel? Document { get; set; } = default!; |
||||
|
||||
[Parameter] |
||||
public int Layers { get; set; } = 1; |
||||
|
||||
public int IncrementLayers() |
||||
{ |
||||
return Layers + 1; |
||||
} |
||||
|
||||
|
||||
private string GetLink(DocContentModel doc) |
||||
{ |
||||
return $"docs/{doc.Href}"; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,46 @@
|
||||
<div class="docNavContainer"> |
||||
@foreach (var doc in Documents) |
||||
{ |
||||
if (doc.Parent == null) |
||||
{ |
||||
<NavLink class="docNavButton" href="@doc.GetDocLink()">@doc.Name</NavLink> |
||||
<DocumentInnerNavComponent Document="@doc"/> |
||||
} |
||||
} |
||||
</div> |
||||
|
||||
<style> |
||||
.docNavContainer { |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
|
||||
.docNavButton a { |
||||
color: white; |
||||
} |
||||
|
||||
.docNavButton a:hover { |
||||
color: white; |
||||
} |
||||
|
||||
.docNavButton { |
||||
padding: 8px; |
||||
color: white; |
||||
} |
||||
|
||||
</style> |
||||
|
||||
@code { |
||||
|
||||
[Parameter] |
||||
public List<DocContentModel> Documents { get; set; } = default!; |
||||
|
||||
[Parameter] |
||||
public List<DocConnectionModel> Connections { get; set; } = default!; |
||||
|
||||
private string GetLink(DocContentModel doc) |
||||
{ |
||||
return $"docs/{doc.Href}"; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,82 @@
|
||||
@layout PageLayout; |
||||
|
||||
@page "/immortal-home" |
||||
|
||||
<LayoutMediumContentComponent> |
||||
<PaperComponent> |
||||
<div class="mainContainer"> |
||||
<div class="mainTitle"> |
||||
Fan Reference |
||||
</div> |
||||
|
||||
<div> |
||||
Refer to various aspects of "IMMORTAL: Gates of Pyre" from this external reference! |
||||
</div> |
||||
</div> |
||||
</PaperComponent> |
||||
|
||||
<ContentDividerComponent></ContentDividerComponent> |
||||
|
||||
<PaperComponent> |
||||
<div class="heroesContainer"> |
||||
|
||||
<ContentHighlightComponent |
||||
Title="Database" |
||||
Description="Review the units!" |
||||
Href="/database" |
||||
ImageHref="image/hero/Database.png"/> |
||||
|
||||
<ContentHighlightComponent |
||||
Title="Build Calculator" |
||||
Description="Make a build!" |
||||
Href="/build-calculator" |
||||
ImageHref="image/hero/Build.png"/> |
||||
|
||||
<ContentHighlightComponent |
||||
Title="Notes" |
||||
Description="Read some notes!" |
||||
Href="/notes" |
||||
ImageHref="image/hero/Notes.png"/> |
||||
|
||||
<ContentHighlightComponent |
||||
Title="Streams" |
||||
Description="Watch live development!" |
||||
Href="/streams" |
||||
ImageHref="image/hero/Streams.png"/> |
||||
</div> |
||||
</PaperComponent> |
||||
|
||||
<ContentDividerComponent></ContentDividerComponent> |
||||
|
||||
<AlertComponent> |
||||
<Title>Under Construction</Title> |
||||
<Message>Website is still being made. Check out <NavLink Href="/immortal-roadmap">Road Map</NavLink> for future plans, <NavLink Href="/immortal-agile">Agile</NavLink> for present tasks, and <NavLink Href="/immortal-changelog">Change Log</NavLink> for past changes.</Message> |
||||
|
||||
</AlertComponent> |
||||
|
||||
</LayoutMediumContentComponent> |
||||
|
||||
<style> |
||||
.mainContainer { |
||||
padding-bottom: 32px; |
||||
} |
||||
|
||||
.mainTitle { |
||||
font-size: 2.2rem; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.heroesContainer { |
||||
display: grid; |
||||
gap: 64px; |
||||
justify-content: center; |
||||
margin: auto; |
||||
grid-template-columns: 1fr 1fr; |
||||
} |
||||
|
||||
|
||||
@@media only screen and (max-width: 1025px) { |
||||
.heroesContainer { |
||||
grid-template-columns: 1fr; } |
||||
} |
||||
</style> |
||||
@ -0,0 +1,76 @@
|
||||
<NavLink Href="@Href" class="contentHighlight"> |
||||
<div class="contentHighlightTitle"> |
||||
@Title |
||||
</div> |
||||
<img src="@ImageHref" class="contentHighlightImage" alt="@Title"/> |
||||
<div class="contentHighlightCallToAction"> |
||||
@Description |
||||
</div> |
||||
</NavLink> |
||||
|
||||
|
||||
<style> |
||||
.contentHighlight { |
||||
background-color: var(--paper); |
||||
border: 1px solid var(--paper-border); |
||||
border-radius: 2px; |
||||
padding-left: 12px; |
||||
padding-right: 12px; |
||||
padding-top: 24px; |
||||
padding-bottom: 24px; |
||||
color: white; |
||||
display: flex; |
||||
flex-direction: column; |
||||
gap: 12px; |
||||
text-align: center; |
||||
margin-left: 12px; |
||||
margin-right: 12px; |
||||
} |
||||
|
||||
.contentHighlight:hover { |
||||
background-color: var(--paper-hover); |
||||
border-color: var(--paper-border-hover); |
||||
text-decoration: none; |
||||
box-shadow: 0 4px 6px rgba(0,0,0,0.6); |
||||
transform: translateY(-2px) scale(1.01); |
||||
} |
||||
|
||||
|
||||
.contentHighlightTitle { |
||||
font-weight: 800; |
||||
font-size: 1.3rem; |
||||
margin: auto; |
||||
} |
||||
|
||||
.contentHighlightImage { |
||||
border: 1px solid rgba(0,0,0,0.5); |
||||
box-shadow: 2px 2px 2px rgba(0,0,0,0.5); |
||||
height: 400px; |
||||
width: 400px; |
||||
margin: auto; |
||||
} |
||||
|
||||
.contentHighlightCallToAction { |
||||
font-weight: 700; |
||||
font-size: 1.1rem; |
||||
margin: auto; |
||||
padding: 16px; |
||||
} |
||||
</style> |
||||
|
||||
@code { |
||||
|
||||
[Parameter] |
||||
public string Href { get; set; } = default!; |
||||
|
||||
[Parameter] |
||||
public string Title { get; set; } = default!; |
||||
|
||||
[Parameter] |
||||
public string Description { get; set; } = default!; |
||||
|
||||
[Parameter] |
||||
public string ImageHref { get; set; } = default!; |
||||
|
||||
|
||||
} |
||||
@ -1,149 +0,0 @@
|
||||
@layout PageLayout; |
||||
|
||||
@page "/immortal-home" |
||||
|
||||
<LayoutMediumContentComponent> |
||||
<div class="mainContainer"> |
||||
<div class="mainTitle"> |
||||
Fan Reference |
||||
</div> |
||||
|
||||
<div> |
||||
Refer to various aspects of "IMMORTAL: Gates of Pyre" from this external reference! |
||||
</div> |
||||
</div> |
||||
|
||||
<ContentDividerComponent></ContentDividerComponent> |
||||
|
||||
<div class="herosContainer"> |
||||
<div class="hero"> |
||||
<div class="heroTitle"> |
||||
Database |
||||
</div> |
||||
<img src="image/hero/Database.png" class="heroImage"/> |
||||
<NavLink Href="/database" class="heroCallToAction"> |
||||
Review the units! |
||||
</NavLink> |
||||
</div> |
||||
|
||||
|
||||
<div class="hero"> |
||||
<div class="heroTitle"> |
||||
Build Calculator |
||||
</div> |
||||
<img src="image/hero/Build.png" class="heroImage"/> |
||||
<NavLink Href="/build-calculator" class="heroCallToAction"> |
||||
Make a build! |
||||
</NavLink> |
||||
</div> |
||||
|
||||
|
||||
<div class="hero"> |
||||
<div class="heroTitle"> |
||||
Notes |
||||
</div> |
||||
<img src="image/hero/Notes.png" class="heroImage"/> |
||||
<NavLink Href="/notes" class="heroCallToAction"> |
||||
Read some notes! |
||||
</NavLink> |
||||
</div> |
||||
|
||||
|
||||
<div class="hero"> |
||||
<div class="heroTitle"> |
||||
Streams |
||||
</div> |
||||
<img src="image/hero/Streams.png" class="heroImage"/> |
||||
<NavLink Href="/streams" class="heroCallToAction"> |
||||
Watch live development! |
||||
</NavLink> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
<ContentDividerComponent></ContentDividerComponent> |
||||
|
||||
<AlertComponent> |
||||
<Title>Under Construction</Title> |
||||
<Message>Website is still being made. Check out <NavLink Href="/immortal-roadmap">Road Map</NavLink> for future plans, <NavLink Href="/immortal-agile">Agile</NavLink> for present tasks, and <NavLink Href="/immortal-changelog">Change Log</NavLink> for past changes.</Message> |
||||
|
||||
</AlertComponent> |
||||
|
||||
</LayoutMediumContentComponent> |
||||
|
||||
<style> |
||||
.mainContainer { |
||||
padding-bottom: 32px; |
||||
} |
||||
|
||||
.mainTitle { |
||||
font-size: 2.2rem; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.quoteContainer { |
||||
display: flex; |
||||
flex-direction: column; |
||||
gap: 8px; |
||||
max-width: 600px; |
||||
margin: auto; |
||||
} |
||||
|
||||
|
||||
|
||||
.quoteTitle { |
||||
font-weight: 800; |
||||
margin-bottom: 8px; |
||||
} |
||||
|
||||
.quoteText { |
||||
margin: auto; |
||||
font-style: italic; |
||||
} |
||||
|
||||
.herosContainer { |
||||
display: flex; |
||||
flex-wrap: wrap; |
||||
gap: 64px; |
||||
justify-content: center; |
||||
} |
||||
|
||||
.hero { |
||||
padding: 32px; |
||||
display: flex; |
||||
flex-direction: column; |
||||
gap: 32px; |
||||
} |
||||
|
||||
|
||||
.heroTitle { |
||||
font-weight: 800; |
||||
font-size: 1.3rem; |
||||
margin: auto; |
||||
} |
||||
|
||||
.heroImage { |
||||
border: 1px solid rgba(0,0,0,0.5); |
||||
box-shadow: 2px 2px 2px rgba(0,0,0,0.5); |
||||
height: 400px; |
||||
width: 400px; |
||||
margin: auto; |
||||
} |
||||
|
||||
.heroCallToAction { |
||||
font-weight: 700; |
||||
font-size: 1.1rem; |
||||
margin: auto; |
||||
background-color: var(--primary); |
||||
border: 1px solid var(--primary); |
||||
padding: 16px; |
||||
cursor: pointer; |
||||
color: white; |
||||
} |
||||
|
||||
.heroCallToAction:hover { |
||||
background-color: var(--primary-hover); |
||||
border-color: var(--primary-border-hover); |
||||
} |
||||
|
||||
</style> |
||||
@ -0,0 +1,140 @@
|
||||
@layout PageLayout |
||||
|
||||
@inject INoteService noteService |
||||
@implements IDisposable |
||||
|
||||
@page "/notes" |
||||
|
||||
|
||||
@if (!noteService.IsLoaded()) |
||||
{ |
||||
<LoadingComponent/> |
||||
} |
||||
else |
||||
{ |
||||
<LayoutMediumContentComponent> |
||||
|
||||
<PaperComponent> |
||||
@foreach (var noteSection in noteService.NoteSectionModels) |
||||
{ |
||||
<div class="noteSectionContainer"> |
||||
<div class="noteSectionTitle">@noteSection.Name</div> |
||||
<div class="noteContentContainer"> |
||||
@foreach (var noteContent in noteSection.NoteContentModels) |
||||
{ |
||||
<NavLink class="noteContentLink" href="@noteContent.GetNoteLink()"> |
||||
<div class="noteContentName">@noteContent.Name</div> |
||||
<div class="noteContentDescription">@noteContent.Description</div> |
||||
</NavLink> |
||||
} |
||||
</div> |
||||
</div> |
||||
} |
||||
</PaperComponent> |
||||
</LayoutMediumContentComponent> |
||||
} |
||||
<style> |
||||
.noteSectionContainer { |
||||
width: 100%; |
||||
padding: 8px; |
||||
} |
||||
|
||||
.noteSectionTitle { |
||||
font-size: 3rem; |
||||
font-weight: bold; |
||||
text-align: center; |
||||
margin-bottom: 32px; |
||||
} |
||||
|
||||
.noteContentContainer { |
||||
display: grid; |
||||
gap: 12px; |
||||
grid-template-columns: 1fr 1fr; |
||||
} |
||||
|
||||
@@media only screen and (max-width: 1025px) { |
||||
.noteContentContainer { |
||||
grid-template-columns: 1fr; |
||||
} |
||||
} |
||||
|
||||
.noteContentName { |
||||
font-weight: bold; |
||||
font-size: 1.6rem; |
||||
} |
||||
|
||||
.noteContentDescription { |
||||
font-weight: normal; |
||||
} |
||||
|
||||
|
||||
.noteContentLink { |
||||
background-color: var(--paper); |
||||
border: 1px solid var(--paper-border); |
||||
border-radius: 2px; |
||||
padding-left: 12px; |
||||
padding-right: 12px; |
||||
padding-top: 24px; |
||||
padding-bottom: 24px; |
||||
color: white; |
||||
display: flex; |
||||
flex-direction: column; |
||||
gap: 12px; |
||||
text-align: center; |
||||
margin-left: 12px; |
||||
margin-right: 12px; |
||||
} |
||||
|
||||
|
||||
.noteContentLink:hover { |
||||
background-color: var(--paper-hover); |
||||
border-color: var(--paper-border-hover); |
||||
text-decoration: none; |
||||
box-shadow: 0 4px 6px rgba(0,0,0,0.6); |
||||
transform: translateY(-2px) scale(1.01); |
||||
} |
||||
|
||||
</style> |
||||
|
||||
@code { |
||||
|
||||
[Parameter] |
||||
public string? Href1 { get; set; } |
||||
|
||||
[Parameter] |
||||
public string? Href2 { get; set; } |
||||
|
||||
[Parameter] |
||||
public string? Href3 { get; set; } |
||||
|
||||
[Parameter] |
||||
public string? Href4 { get; set; } |
||||
|
||||
[Parameter] |
||||
public string? Href5 { get; set; } |
||||
|
||||
private string Href => Href5 ?? Href4 ?? Href3 ?? Href2 ?? Href1 ?? ""; |
||||
|
||||
string selectedSection = "All"; |
||||
|
||||
protected override void OnInitialized() |
||||
{ |
||||
noteService.Subscribe(StateHasChanged); |
||||
|
||||
noteService.Load(); |
||||
} |
||||
|
||||
|
||||
public void Dispose() |
||||
{ |
||||
noteService.Unsubscribe(StateHasChanged); |
||||
} |
||||
|
||||
|
||||
void OnSectionChanged(ChangeEventArgs e) |
||||
{ |
||||
selectedSection = e.Value!.ToString()!; |
||||
StateHasChanged(); |
||||
} |
||||
|
||||
} |
||||
@ -1,109 +1,71 @@
|
||||
@layout PageLayout |
||||
|
||||
@inject INoteService NoteService |
||||
@inject INoteService noteService |
||||
@implements IDisposable |
||||
|
||||
@page "/notes" |
||||
@page "/notes/{href1}/{href2?}/{href3?}/{href4?}/{href5?}" |
||||
|
||||
|
||||
@if (!NoteService.IsLoaded()) |
||||
@if (!noteService.IsLoaded()) |
||||
{ |
||||
<LoadingComponent></LoadingComponent> |
||||
<LoadingComponent/> |
||||
} |
||||
else |
||||
{ |
||||
<LayoutMediumContentComponent> |
||||
<WebsiteTitleComponent>Notes</WebsiteTitleComponent> |
||||
|
||||
<div class="section"> |
||||
<div for="noteSection">Section: </div> |
||||
<div style="flex: 1"></div> |
||||
<select @oninput="OnSectionChanged" style="background-color: #36393F; width: 250px; margin-right: 16px;" name="noteSection"> |
||||
<option value="All">All</option> |
||||
|
||||
</select> |
||||
</div> |
||||
|
||||
<div class="notesContainer"> |
||||
@foreach (var note in NoteService.NoteModels) { |
||||
if (note.IsHidden) { |
||||
continue; |
||||
<LayoutWithSidebarComponent> |
||||
<Sidebar> |
||||
<NoteNavComponent |
||||
Connections="noteService.NoteConnectionModels" |
||||
Notes="noteService.NoteContentModels"/> |
||||
</Sidebar> |
||||
<Content> |
||||
<PaperComponent> |
||||
@foreach (var note in noteService.NoteContentModels) |
||||
{ |
||||
if (!note.Href.Equals(Href)) |
||||
{ |
||||
continue; |
||||
} |
||||
<NoteComponent NoteContentModel="note"/> |
||||
} |
||||
if (selectedSection != "All" && note.Section != selectedSection) { |
||||
continue; |
||||
} |
||||
@if (note.IsPreAlpha) { |
||||
<AlertComponent Type=SeverityType.Warning> |
||||
<Title>Pre Alpha</Title> |
||||
<Message>This note refers to content that is in pre-alpha. It won't be accurate in future updates to IGP.</Message> |
||||
</AlertComponent> |
||||
} |
||||
<PaperComponent> |
||||
<div style="display: flex; flex-direction: row;"> |
||||
<span style="font-weight: bold; font-style:italic;">@note.Section</span> |
||||
<div style="flex: 1"></div> |
||||
<span style="font-weight: bold; font-style:italic;">Last Updated on @note.LastUpdated</span> |
||||
</div> |
||||
<div> |
||||
<div id="@note.DEPRECATED_Id()" style="font-weight: bold; font-size: 1.4rem;">@note.Name</div> |
||||
|
||||
<div style="white-space:break-spaces;">@((MarkupString)note.Description)</div> |
||||
</div> |
||||
</PaperComponent> |
||||
} |
||||
</div> |
||||
</LayoutMediumContentComponent> |
||||
|
||||
</PaperComponent> |
||||
</Content> |
||||
</LayoutWithSidebarComponent> |
||||
} |
||||
<style> |
||||
.section { |
||||
display: flex; |
||||
width: 500px; |
||||
flex-direction: row; |
||||
background-color: var(--paper); |
||||
justify-content: center; |
||||
padding: 24px; |
||||
border: 4px solid var(--paper-border); |
||||
box-shadow: 0px 6px var(--paper-border); |
||||
} |
||||
|
||||
.notesContainer { |
||||
display: flex; |
||||
flex-direction: column; |
||||
gap: 16px; |
||||
} |
||||
<style> |
||||
|
||||
.noteContainer { |
||||
padding: 24px; |
||||
border: 2px solid black; |
||||
margin: auto; |
||||
overflow-y: auto; |
||||
overflow-x: hidden; |
||||
background-color: var(--paper); |
||||
} |
||||
</style> |
||||
|
||||
@code { |
||||
|
||||
string selectedSection = "All"; |
||||
[Parameter] |
||||
public string? Href1 { get; set; } |
||||
|
||||
[Parameter] |
||||
public string? Href2 { get; set; } |
||||
|
||||
[Parameter] |
||||
public string? Href3 { get; set; } |
||||
|
||||
[Parameter] |
||||
public string? Href4 { get; set; } |
||||
|
||||
[Parameter] |
||||
public string? Href5 { get; set; } |
||||
|
||||
private string Href => Href5 ?? Href4 ?? Href3 ?? Href2 ?? Href1 ?? ""; |
||||
|
||||
protected override void OnInitialized() |
||||
{ |
||||
NoteService.Subscribe(StateHasChanged); |
||||
|
||||
NoteService.Load(); |
||||
noteService.Subscribe(StateHasChanged); |
||||
|
||||
noteService.Load(); |
||||
} |
||||
|
||||
|
||||
|
||||
public void Dispose() |
||||
{ |
||||
NoteService.Unsubscribe(StateHasChanged); |
||||
|
||||
noteService.Unsubscribe(StateHasChanged); |
||||
} |
||||
|
||||
|
||||
void OnSectionChanged(ChangeEventArgs e) { |
||||
selectedSection = e.Value.ToString(); |
||||
StateHasChanged(); |
||||
} |
||||
} |
||||
@ -0,0 +1,35 @@
|
||||
<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(NoteContentModel.Content))</div> |
||||
</div> |
||||
|
||||
<style> |
||||
.noteTitle { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.noteHeader { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
} |
||||
|
||||
.noteDates { |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
|
||||
</style> |
||||
|
||||
@code { |
||||
|
||||
[Parameter] |
||||
public NoteContentModel NoteContentModel { get; set; } = default!; |
||||
|
||||
} |
||||
@ -0,0 +1,75 @@
|
||||
@if (Note!.NoteContentModels.Count > 0) |
||||
{ |
||||
<div class="noteInnerNavContainer"> |
||||
@foreach (var innerNote in Note.NoteContentModels) |
||||
{ |
||||
var linkStyle = $"noteInnerNavButton inner_{Layers}"; |
||||
<NavLink class="@linkStyle" href="@innerNote.GetNoteLink()">@innerNote.Name</NavLink> |
||||
<NoteInnerNavComponent Note="@innerNote" Layers="@IncrementLayers()"/> |
||||
} |
||||
</div> |
||||
} |
||||
|
||||
<style> |
||||
|
||||
.noteInnerNavContainer { |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
|
||||
.noteInnerNavButton a { |
||||
color: white; |
||||
} |
||||
|
||||
.noteInnerNavButton a:hover { |
||||
color: white; |
||||
} |
||||
|
||||
.noteInnerNavButton { |
||||
padding: 8px; |
||||
margin-left: 8px; |
||||
color: white; |
||||
} |
||||
|
||||
.noteInnerNavButton:hover { |
||||
|
||||
} |
||||
|
||||
|
||||
.inner_1 { |
||||
margin-left: 8px; |
||||
} |
||||
|
||||
.inner_2 { |
||||
margin-left: 16px; |
||||
} |
||||
|
||||
.inner_3 { |
||||
margin-left: 24px; |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
</style> |
||||
|
||||
@code { |
||||
|
||||
[Parameter] |
||||
public NoteContentModel? Note { get; set; } = default!; |
||||
|
||||
[Parameter] |
||||
public int Layers { get; set; } = 1; |
||||
|
||||
public int IncrementLayers() |
||||
{ |
||||
return Layers + 1; |
||||
} |
||||
|
||||
|
||||
private string GetLink(NoteContentModel note) |
||||
{ |
||||
return $"notes/{note.Href}"; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,43 @@
|
||||
<div class="noteNavContainer"> |
||||
@foreach (var note in Notes) |
||||
{ |
||||
if (note.Parent == null) |
||||
{ |
||||
<NavLink class="noteNavButton" href="@note.GetNoteLink()">@note.Name</NavLink> |
||||
<NoteInnerNavComponent Note="@note"/> |
||||
} |
||||
} |
||||
</div> |
||||
|
||||
<style> |
||||
.noteNavContainer { |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
|
||||
.noteNavButton a { |
||||
color: white; |
||||
} |
||||
|
||||
.noteNavButton a:hover { |
||||
color: white; |
||||
background-color: var(--primary-hover); |
||||
|
||||
} |
||||
|
||||
.noteNavButton { |
||||
padding: 8px; |
||||
color: white; |
||||
} |
||||
|
||||
</style> |
||||
|
||||
@code { |
||||
|
||||
[Parameter] |
||||
public List<NoteContentModel> Notes { get; set; } = default!; |
||||
|
||||
[Parameter] |
||||
public List<NoteConnectionModel> Connections { get; set; } = default!; |
||||
|
||||
} |
||||
@ -1,229 +0,0 @@
|
||||
@layout PageLayout |
||||
@page "/sandbox" |
||||
@inject IJSRuntime JS |
||||
|
||||
<LayoutLargeContentComponent> |
||||
<WebsiteTitleComponent>Sandbox</WebsiteTitleComponent> |
||||
|
||||
<div> |
||||
Generic Page of Testing In Progress code |
||||
</div> |
||||
|
||||
<button @onclick="() => DownloadFile(typeof(WebPageModel))"> |
||||
WebPageModel |
||||
</button> |
||||
|
||||
<button @onclick="() => DownloadFile(typeof(WebSectionModel))"> |
||||
WebSectionModel |
||||
</button> |
||||
|
||||
<button @onclick="() => DownloadFile(typeof(PatchModel))"> |
||||
PatchModel |
||||
</button> |
||||
|
||||
<button @onclick="() => DownloadFile(typeof(ChangeModel))"> |
||||
ChangeModel |
||||
</button> |
||||
|
||||
<button @onclick="() => DownloadFile(typeof(SprintModel))"> |
||||
SprintModel |
||||
</button> |
||||
|
||||
<button @onclick="() => DownloadFile(typeof(TaskModel))"> |
||||
TaskModel |
||||
</button> |
||||
|
||||
<FormLayoutComponent> |
||||
<FormTextAreaComponent Value="@infoText"></FormTextAreaComponent> |
||||
</FormLayoutComponent> |
||||
|
||||
|
||||
</LayoutLargeContentComponent> |
||||
|
||||
|
||||
@code { |
||||
readonly List<EntityModel> entities = EntityModel.GetList(); |
||||
|
||||
List<EntityInfoModel> infos = new(); |
||||
|
||||
string infoText = ""; |
||||
string weaponText = ""; |
||||
|
||||
readonly List<ChangeModel> changes = new(); |
||||
readonly List<PatchModel> patches = new(); |
||||
|
||||
private async Task DownloadFile(Type type) { |
||||
var fileName = $"{type.ToString().Split(".").Last()}s.csv"; |
||||
|
||||
var objectData = |
||||
type == typeof(PatchModel) ? new List<object>(patches) |
||||
: type == typeof(ChangeModel) ? new List<object>(changes) |
||||
: new List<object>(); |
||||
|
||||
await JS.InvokeVoidAsync("download", fileName, Generate(type, objectData)); |
||||
} |
||||
|
||||
void GenerateEntityModels() { |
||||
var properties = typeof(EntityInfoModel).GetProperties(); |
||||
|
||||
infoText += "Id,Name,Descriptive,Description,Notes\n"; |
||||
|
||||
var id = 1; |
||||
foreach (var entity in entities) { |
||||
infoText += $"{id++},{entity.Info().Name},{entity.Info().Descriptive},{entity.Info().Description},{entity.Info().Notes}\n"; |
||||
} |
||||
} |
||||
|
||||
string Generate(Type type, List<object> dataList) { |
||||
var properties = type.GetProperties(); |
||||
|
||||
var generatedText = ""; |
||||
|
||||
for (var index = 0; index < properties.Count(); index++) { |
||||
var property = properties[index]; |
||||
|
||||
if (property.GetAccessors().First().IsVirtual) { |
||||
continue; |
||||
} |
||||
|
||||
var attributes = property.GetCustomAttributes().OfType<ObsoleteAttribute>(); |
||||
if (attributes.Count() > 0) { |
||||
continue; |
||||
} |
||||
|
||||
generatedText += property.Name; |
||||
if (index != properties.Count() - 1) { |
||||
generatedText += ","; |
||||
} |
||||
} |
||||
|
||||
generatedText = generatedText.Trim(); |
||||
if (generatedText.EndsWith(",")) { |
||||
generatedText = generatedText.Remove(generatedText.Length - 1); |
||||
} |
||||
|
||||
|
||||
generatedText += "\n"; |
||||
|
||||
foreach (var data in dataList) { |
||||
for (var index = 0; index < properties.Count(); index++) { |
||||
var property = properties[index]; |
||||
|
||||
if (property.GetAccessors().First().IsVirtual) { |
||||
continue; |
||||
} |
||||
|
||||
var attributes = property.GetCustomAttributes().OfType<ObsoleteAttribute>(); |
||||
if (attributes.Count() > 0) { |
||||
continue; |
||||
} |
||||
|
||||
|
||||
if (property.GetValue(data) != null) { |
||||
generatedText += "\"" + property.GetValue(data).ToString().Replace("\"", "\"\"") + "\""; |
||||
if (index != properties.Count() - 1) { |
||||
generatedText += ","; |
||||
} |
||||
} |
||||
else { |
||||
generatedText += "\"" + " " + "\""; |
||||
if (index != properties.Count() - 1) { |
||||
generatedText += ","; |
||||
} |
||||
} |
||||
} |
||||
|
||||
generatedText = generatedText.Trim(); |
||||
if (generatedText.EndsWith(",")) { |
||||
generatedText = generatedText.Remove(generatedText.Length - 1); |
||||
} |
||||
|
||||
generatedText += "\n"; |
||||
} |
||||
|
||||
|
||||
return generatedText; |
||||
} |
||||
|
||||
|
||||
void GenerateWeapons() { |
||||
var properties = typeof(EntityWeaponModel).GetProperties(); |
||||
|
||||
for (var index = 0; index < properties.Count(); index++) { |
||||
var property = properties[index]; |
||||
|
||||
if (property.GetAccessors().First().IsVirtual) { |
||||
continue; |
||||
} |
||||
|
||||
var attributes = property.GetCustomAttributes().OfType<ObsoleteAttribute> |
||||
(); |
||||
if (attributes.Count() > 0) { |
||||
continue; |
||||
} |
||||
|
||||
weaponText += property.Name; |
||||
if (index != properties.Count() - 1) { |
||||
weaponText += ","; |
||||
} |
||||
} |
||||
|
||||
weaponText += "\n"; |
||||
|
||||
foreach (var entity in entities) { |
||||
foreach (var weapon in entity.Weapons()) { |
||||
for (var index = 0; index < properties.Count(); index++) { |
||||
var property = properties[index]; |
||||
|
||||
if (property.GetAccessors().First().IsVirtual) { |
||||
continue; |
||||
} |
||||
|
||||
|
||||
var attributes = property.GetCustomAttributes().OfType<ObsoleteAttribute> |
||||
(); |
||||
if (attributes.Count() > 0) { |
||||
continue; |
||||
} |
||||
|
||||
|
||||
weaponText += property.GetValue(weapon); |
||||
if (index != properties.Count() - 1) { |
||||
weaponText += ","; |
||||
} |
||||
} |
||||
|
||||
weaponText += "\n"; |
||||
} |
||||
} |
||||
} |
||||
|
||||
void GenerateExample() { |
||||
var properties = typeof(EntityInfoModel).GetProperties(); |
||||
|
||||
for (var index = 0; index < properties.Count(); index++) { |
||||
var property = properties[index]; |
||||
infoText += property.Name; |
||||
if (index != properties.Count() - 1) { |
||||
infoText += ","; |
||||
} |
||||
} |
||||
|
||||
infoText += "\n"; |
||||
|
||||
foreach (var entity in entities) { |
||||
if (entity.Info() != null) { |
||||
for (var index = 0; index < properties.Count(); index++) { |
||||
var property = properties[index]; |
||||
infoText += property.GetValue(entity.Info()); |
||||
if (index != properties.Count() - 1) { |
||||
infoText += ","; |
||||
} |
||||
} |
||||
|
||||
infoText += "\n"; |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +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":[]}] |
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue