@model ProjectIndexViewModel @{ ViewData["Title"] = "Projects"; var trial = Model.Trial; }

Series planning

Projects

Import JSON New project
@if (trial is not null) {

Free trial status

@trial.StatusLabel on @trial.PlanName

Your 30-day trial expires on @FormatDate(trial.ExpiryDateUtc). Upgrade whenever you are ready.

Upgrade
} @if (TempData["ArchiveMessage"] is string archiveMessage) {
@archiveMessage
} @if (TempData["ArchiveError"] is string archiveError) {
@archiveError
} @if (TempData["ProjectExportMessage"] is string projectExportMessage) {
@projectExportMessage
} @if (!Model.ActiveProjects.Any() && !Model.ArchivedProjects.Any()) {

Start with a series or standalone novel

Create a project, then add books, chapters and scenes in narrative order.

Create your first project
} else {

Active Projects

@if (!Model.ActiveProjects.Any()) {

No active projects.

} else {
@foreach (var project in Model.ActiveProjects) {

@project.ProjectName

@project.AccessRole

@(string.IsNullOrWhiteSpace(project.Description) ? "No description yet." : project.Description)

Open Edit @if (project.IsOwner) { Download backup
}
}
}

Archived Projects

@if (!Model.ArchivedProjects.Any()) {

No archived projects.

} else {
@foreach (var project in Model.ArchivedProjects) { var archivedDateLabel = project.ArchivedDate?.ToLocalTime().ToString("yyyy-MM-dd");

@project.ProjectName

Archived @if (!string.IsNullOrWhiteSpace(archivedDateLabel)) { / @archivedDateLabel }

@(string.IsNullOrWhiteSpace(project.Description) ? "No description yet." : project.Description)

Download backup
@if (project.IsOwner) { }
}
}
} @functions { private static string FormatDate(DateTime value) => value.ToLocalTime().ToString("yyyy-MM-dd"); } @section Scripts { }