Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,31 @@

All notable changes to PaperRoute Tracker will be documented here.

## [Unreleased] — v0.8 Insights & Reports

v0.8.0-rc.1 is available on the Preview channel. Development is tracked in [PR #80](https://github.com/JUhalt/PaperRoute-Tracker/pull/80) and the [v0.8 milestone](https://github.com/JUhalt/PaperRoute-Tracker/milestone/10); certification in [#85](https://github.com/JUhalt/PaperRoute-Tracker/issues/85).

### Added

- An **Insights** page (Ctrl+5) with route statistics from your own records ([#30](https://github.com/JUhalt/PaperRoute-Tracker/issues/30)): median time to a first decision and from first submission to acceptance, each with its sample size, and **Your Routes**: journals, revision rounds, and days to acceptance and publication for every submitted manuscript. Missing dates are left out, never estimated.
- **Your Journals** ([#62](https://github.com/JUhalt/PaperRoute-Tracker/issues/62)): submissions, outcomes, and median days to a first decision and in review for each journal you have used, grouped by Journal Library record or exact name, never by guess. The Journals page shows the same history for the selected journal.
- **Pipeline Report...** and **Route Report...** ([#63](https://github.com/JUhalt/PaperRoute-Tracker/issues/63), [#30](https://github.com/JUhalt/PaperRoute-Tracker/issues/30)): self-contained web pages to print or save as PDF, previewed before saving. They never include notes, correspondence, reviewer comments, file paths, or contact details.

- **Route maps** ([#82](https://github.com/JUhalt/PaperRoute-Tracker/issues/82)): a manuscript's Route opens on its whole route drawn to scale, each stretch colored by who held it (the journal, you, or production), journals named above, and every event numbered and explained ("after 48 days of rerouting"). Insights gains **Route Map**, every published route lined up at day 0 with the median time to publication and the share spent waiting on journals versus revising; work not yet published can be included, drawn to today. Time the record does not assign is hatched as not recorded, never estimated.
- **Work types and tags** ([#64](https://github.com/JUhalt/PaperRoute-Tracker/issues/64)): a type (journal article, preprint, conference paper or abstract, poster, book chapter, thesis, other) and your own colored tags on each manuscript's Overview. Tags show on board cards and in the Library, and both are searchable. Imports set the type when the source states it; nothing is inferred. CV export can group by type, and the Excel workbook keeps both.

### Changed

- Import & Export moves to **Ctrl+6**; Insights takes Ctrl+5.

### Fixed

- A second launch of PaperRoute brings the open window forward instead of opening another window on the same library, where a save in one could overwrite the other ([#77](https://github.com/JUhalt/PaperRoute-Tracker/issues/77)).

### Storage

- **Schema 8** adds work types, tags, and tag colors. As with Schema 7, the upgrade validates the library and changes only the schema marker; records start with no type and no tags.

## [0.7.0] - 2026-09-28

PaperRoute v0.7.0 — **Deadline Center** — was released on September 28, 2026 from [PR #78](https://github.com/JUhalt/PaperRoute-Tracker/pull/78), after the v0.7.0-rc.1 Preview. Certification is recorded in [#79](https://github.com/JUhalt/PaperRoute-Tracker/issues/79). v0.7 upgrades the library to Schema 7.
Expand Down
9 changes: 9 additions & 0 deletions ManualCertification/V04Demo/BoardDemo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,15 @@ internal static void CreateSamples(string sessionRoot, bool empty = false)
draft.Versions.Add(draftVersion);
draft.SubmissionPackets.Add(new SubmissionPacket { ReadinessProfileId = readiness.Id, JournalName = readiness.JournalName, Label = "Initial submission", ManuscriptVersionId = draftVersion.Id });
manuscripts[0].Reminders.Add(new ManuscriptReminder { Title = "Outline the introduction", DueDate = today.AddDays(12) });
// Types and tags (#64) on a few cards.
manuscripts[0].Tags.Add("grant");
manuscripts[3].WorkType = WorkType.JournalArticle;
manuscripts[3].Tags.AddRange(new[] { "preregistered", "lab project" });
manuscripts[4].WorkType = WorkType.JournalArticle;
manuscripts[4].Tags.AddRange(new[] { "teaching", "mixed methods", "nursing" });
manuscripts[5].WorkType = WorkType.JournalArticle;
manuscripts[6].WorkType = WorkType.JournalArticle;
manuscripts[8].WorkType = WorkType.ConferencePaper;

var library = new AuthorLibraryData();
library.Journals.Add(openPsychology);
Expand Down
13 changes: 11 additions & 2 deletions ManualCertification/V04Demo/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace PaperRoute.V04Demo;
internal static class Program
{
private const string Usage = "PaperRoute workflow manual demo\n\n" +
"Surfaces: vault (default), readiness, packet, packet-new, file, file-new, notes, submission, responses, workflow, board, publications, fill\n" +
"Surfaces: vault (default), readiness, packet, packet-new, file, file-new, notes, submission, responses, workflow, board, publications, fill, about, route\n" +
"Options: --minimum, --primary, --empty (vault/readiness/board), --integrity (populated vault only), --dark or --system, --help\n\n" +
"Default surfaces discard manuscript changes when the window closes.\n" +
"workflow and board save only in a new disposable temporary session.\n" +
Expand All @@ -27,7 +27,7 @@ private static void Main(string[] args)
return;
}

var surfaces = new[] { "vault", "readiness", "packet", "packet-new", "file", "file-new", "notes", "submission", "responses", "workflow", "board", "publications", "fill", "about" };
var surfaces = new[] { "vault", "readiness", "packet", "packet-new", "file", "file-new", "notes", "submission", "responses", "workflow", "board", "publications", "fill", "about", "route" };
var positional = args.Where(argument => !argument.StartsWith("--")).ToArray();
var surface = positional.FirstOrDefault()?.ToLowerInvariant() ?? "vault";
var minimum = args.Contains("--minimum", StringComparer.OrdinalIgnoreCase);
Expand Down Expand Up @@ -86,6 +86,15 @@ private static void Main(string[] args)
return;
}

if (surface == "route")
{
using var route = RouteMapDemo.Create();
route.Text += " [DEMO - fictional route; nothing saved]";
ConfigureDisplayEvidence(route, primary);
route.ShowDialog();
return;
}

if (surface == "publications" || surface == "fill")
{
using var check = PublicationDemo.Create(surface);
Expand Down
40 changes: 40 additions & 0 deletions ManualCertification/V04Demo/RouteMapDemo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using ManuscriptPipeline.Forms;
using ManuscriptPipeline.Models;

namespace PaperRoute.V04Demo;

// One route drawn to scale (#82) on a fictional manuscript: a desk
// rejection, rerouting, two revision rounds with recorded returns to
// review, acceptance, and publication. Nothing is saved.
internal static class RouteMapDemo
{
internal static Form Create()
{
var manuscript = new Manuscript
{
Title = "DEMO A preregistered replication of anchoring effects in clinical risk estimates",
CurrentStage = PaperStage.Published,
Location = ManuscriptLocation.Published,
TargetJournal = "Fictional Open Psychology"
};
manuscript.Submissions.Add(Submission("Fictional Psychological Letters", new DateTime(2026, 1, 5),
(EditorialDecision.DeskRejected, new DateTime(2026, 1, 12))));
manuscript.Submissions.Add(Submission("Fictional Open Psychology", new DateTime(2026, 3, 1),
(EditorialDecision.MajorRevision, new DateTime(2026, 4, 2)),
(EditorialDecision.MinorRevision, new DateTime(2026, 7, 22)),
(EditorialDecision.Accepted, new DateTime(2026, 8, 29))));
manuscript.History.Add(new HistoryEvent { Stage = PaperStage.UnderReview, EventDate = new DateTime(2026, 6, 10), Note = "Resubmitted after major revision" });
manuscript.History.Add(new HistoryEvent { Stage = PaperStage.UnderReview, EventDate = new DateTime(2026, 8, 5), Note = "Resubmitted after minor revision" });
manuscript.Metadata.PublishedDate = new DateTime(2026, 9, 26);
manuscript.Metadata.PublicationJournal = "Fictional Open Psychology";
return new ManuscriptRouteViewForm(manuscript);
}

private static JournalSubmission Submission(string journal, DateTime submitted, params (EditorialDecision Decision, DateTime Date)[] decisions)
{
var submission = new JournalSubmission { JournalName = journal, SubmittedDate = submitted };
foreach (var decision in decisions)
submission.Decisions.Add(new EditorialDecisionEvent { Decision = decision.Decision, DecisionDate = decision.Date });
return submission;
}
}
7 changes: 7 additions & 0 deletions ManuscriptPipeline/Controls/RailItems.vb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Namespace Controls
FollowUp
Checklist
Publication
Insights
End Enum

' Paints one left-rail item: an icon, its label, and an optional count.
Expand Down Expand Up @@ -162,6 +163,12 @@ Namespace Controls
Case RailGlyph.Checklist
g.DrawRectangle(pen, Rectangle.Round(r(3, 3, 10, 10)))
g.DrawLines(pen, {p(5.5F, 8.2F), p(7.3F, 10), p(10.7F, 6)})
Case RailGlyph.Insights
' Three bars on a baseline.
g.DrawLine(pen, p(2, 13.5F), p(14, 13.5F))
g.DrawRectangle(pen, Rectangle.Round(r(3.5F, 8, 2, 5)))
g.DrawRectangle(pen, Rectangle.Round(r(7, 3, 2, 10)))
g.DrawRectangle(pen, Rectangle.Round(r(10.5F, 6, 2, 7)))
Case RailGlyph.Publication
' An open book.
g.DrawLines(pen, {p(8, 4.5F), p(3, 3.5F), p(3, 12), p(8, 13)})
Expand Down
Loading