PlotDirector/PlotLine/ViewModels/CoreViewModels.cs
2026-06-01 09:03:59 +01:00

738 lines
28 KiB
C#

using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc.Rendering;
using PlotLine.Models;
namespace PlotLine.ViewModels;
public sealed class ProjectEditViewModel
{
public int ProjectID { get; set; }
[Required, StringLength(200)]
[Display(Name = "Project / Series name")]
public string ProjectName { get; set; } = string.Empty;
public string? Description { get; set; }
}
public sealed class ProjectDetailViewModel
{
public Project Project { get; set; } = new();
public IReadOnlyList<Book> Books { get; set; } = [];
}
public sealed class BookEditViewModel
{
public int BookID { get; set; }
public int ProjectID { get; set; }
[Required, StringLength(200)]
[Display(Name = "Book title")]
public string BookTitle { get; set; } = string.Empty;
[Display(Name = "Book number")]
public int BookNumber { get; set; } = 1;
public string? Description { get; set; }
public Project? Project { get; set; }
}
public sealed class BookDetailViewModel
{
public Project Project { get; set; } = new();
public Book Book { get; set; } = new();
public IReadOnlyList<Chapter> Chapters { get; set; } = [];
}
public sealed class ChapterEditViewModel
{
public int ChapterID { get; set; }
public int BookID { get; set; }
[Display(Name = "Chapter number")]
public decimal ChapterNumber { get; set; } = 1;
[Required, StringLength(200)]
[Display(Name = "Chapter title")]
public string ChapterTitle { get; set; } = string.Empty;
public string? Summary { get; set; }
[Display(Name = "Revision status")]
public int RevisionStatusID { get; set; }
public Book? Book { get; set; }
public Project? Project { get; set; }
public IReadOnlyList<SelectListItem> RevisionStatuses { get; set; } = [];
}
public sealed class ChapterDetailViewModel
{
public Project Project { get; set; } = new();
public Book Book { get; set; } = new();
public Chapter Chapter { get; set; } = new();
public IReadOnlyList<Scene> Scenes { get; set; } = [];
}
public sealed class SceneEditViewModel
{
public int SceneID { get; set; }
public int ChapterID { get; set; }
[Display(Name = "Scene number")]
public decimal SceneNumber { get; set; } = 1;
[Required, StringLength(200)]
[Display(Name = "Scene title")]
public string SceneTitle { get; set; } = string.Empty;
public string? Summary { get; set; }
[Display(Name = "Time mode")]
public int TimeModeID { get; set; }
[Display(Name = "Start date/time")]
public DateTime? StartDateTime { get; set; }
[Display(Name = "End date/time")]
public DateTime? EndDateTime { get; set; }
[Display(Name = "Duration")]
public decimal? DurationAmount { get; set; }
[Display(Name = "Duration unit")]
public int? DurationUnitID { get; set; }
[Display(Name = "Relative time")]
public string? RelativeTimeText { get; set; }
[Display(Name = "Time confidence")]
public int TimeConfidenceID { get; set; }
[Display(Name = "Purpose notes")]
public string? ScenePurposeNotes { get; set; }
[Display(Name = "Outcome notes")]
public string? SceneOutcomeNotes { get; set; }
[Display(Name = "Revision status")]
public int RevisionStatusID { get; set; }
[Display(Name = "Primary location")]
public int? PrimaryLocationID { get; set; }
[Display(Name = "Scene purposes")]
public List<int> SelectedPurposeTypeIds { get; set; } = [];
public List<SceneMetricInputViewModel> Metrics { get; set; } = [];
public IReadOnlyList<ThreadEvent> ThreadEvents { get; set; } = [];
public ThreadEventCreateViewModel NewThreadEvent { get; set; } = new();
public IReadOnlyList<AssetEvent> AssetEvents { get; set; } = [];
public IReadOnlyList<AssetCustodyEvent> AssetCustodyEvents { get; set; } = [];
public IReadOnlyList<SceneAssetLocation> SceneAssetLocations { get; set; } = [];
public AssetEventCreateViewModel NewAssetEvent { get; set; } = new();
public AssetCustodyCreateViewModel NewAssetCustodyEvent { get; set; } = new();
public SceneAssetLocationCreateViewModel NewSceneAssetLocation { get; set; } = new();
public IReadOnlyList<SceneCharacter> SceneCharacters { get; set; } = [];
public IReadOnlyList<CharacterAttributeEvent> CharacterAttributeEvents { get; set; } = [];
public IReadOnlyList<CharacterKnowledgeItem> CharacterKnowledge { get; set; } = [];
public IReadOnlyList<RelationshipEvent> RelationshipEvents { get; set; } = [];
public SceneCharacterCreateViewModel NewSceneCharacter { get; set; } = new();
public CharacterAttributeEventCreateViewModel NewCharacterAttributeEvent { get; set; } = new();
public CharacterKnowledgeCreateViewModel NewCharacterKnowledge { get; set; } = new();
public RelationshipEventCreateViewModel NewRelationshipEvent { get; set; } = new();
public IReadOnlyList<SelectListItem> PlotLineOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> PlotThreadOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> ThreadTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> ThreadEventTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> AssetOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> AssetKindOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> AssetStateOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> AssetEventTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> AssetCustodyEventTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> CustodyRoleOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> CharacterOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> CharacterRoleOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> PresenceTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> CharacterAttributeTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> KnowledgeStateOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> RelationshipOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> RelationshipTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> RelationshipStateOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> LocationOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> SceneOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> ChapterOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> SceneDependencyTypeOptions { get; set; } = [];
public IReadOnlyList<string> AssetDependencyMessages { get; set; } = [];
public IReadOnlyList<string> LocationConsistencyMessages { get; set; } = [];
public IReadOnlyList<ContinuityWarning> Warnings { get; set; } = [];
public IReadOnlyList<SceneDependency> DependenciesThisSceneNeeds { get; set; } = [];
public IReadOnlyList<SceneDependency> DependenciesNeedingThisScene { get; set; } = [];
public SceneDependencyCreateViewModel NewDependency { get; set; } = new();
public SceneMoveRequestViewModel MoveRequest { get; set; } = new();
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
public bool ReturnToTimeline { get; set; }
public Chapter? Chapter { get; set; }
public Book? Book { get; set; }
public Project? Project { get; set; }
public IReadOnlyList<SelectListItem> RevisionStatuses { get; set; } = [];
public IReadOnlyList<SelectListItem> TimeModes { get; set; } = [];
public IReadOnlyList<SelectListItem> DurationUnits { get; set; } = [];
public IReadOnlyList<SelectListItem> TimeConfidences { get; set; } = [];
public IReadOnlyList<ScenePurposeType> ScenePurposeTypes { get; set; } = [];
}
public sealed class TimelineViewModel
{
public Project Project { get; set; } = new();
public int? SelectedBookID { get; set; }
public int? SelectedSceneID { get; set; }
public SceneEditViewModel? SelectedScene { get; set; }
public IReadOnlyList<BookTimelineViewModel> Books { get; set; } = [];
public IReadOnlyList<SelectListItem> BookOptions { get; set; } = [];
public IReadOnlyList<Scene> OrderedScenes { get; set; } = [];
public IReadOnlyList<MetricGraphViewModel> MetricGraphs { get; set; } = [];
public IReadOnlyList<PlotLineLaneViewModel> PlotLanes { get; set; } = [];
public IReadOnlyList<AssetLaneViewModel> AssetLanes { get; set; } = [];
public IReadOnlyList<CharacterLaneViewModel> CharacterLanes { get; set; } = [];
public ContinuityValidationSummary? LastValidationSummary { get; set; }
}
public sealed class BookTimelineViewModel
{
public Book Book { get; set; } = new();
public IReadOnlyList<ChapterTimelineViewModel> Chapters { get; set; } = [];
}
public sealed class ChapterTimelineViewModel
{
public Chapter Chapter { get; set; } = new();
public IReadOnlyList<Scene> Scenes { get; set; } = [];
}
public sealed class SceneMetricInputViewModel
{
public int MetricTypeID { get; set; }
public string MetricName { get; set; } = string.Empty;
public string? Description { get; set; }
public int MinValue { get; set; }
public int MaxValue { get; set; }
public int Value { get; set; }
public string? Notes { get; set; }
}
public sealed class MetricGraphViewModel
{
public int MetricTypeID { get; set; }
public string MetricName { get; set; } = string.Empty;
public IReadOnlyList<MetricGraphPointViewModel> Points { get; set; } = [];
}
public sealed class MetricGraphPointViewModel
{
public int SceneID { get; set; }
public decimal SceneNumber { get; set; }
public string SceneTitle { get; set; } = string.Empty;
public int Value { get; set; }
public int Percent { get; set; }
}
public sealed class PlotLineEditViewModel
{
public int PlotLineID { get; set; }
public int ProjectID { get; set; }
[Required, StringLength(200)]
[Display(Name = "Plot line name")]
public string PlotLineName { get; set; } = string.Empty;
[Display(Name = "Type")]
public int PlotLineTypeID { get; set; }
public int? BookID { get; set; }
public string? Description { get; set; }
[Display(Name = "Parent plot line")]
public int? ParentPlotLineID { get; set; }
[Display(Name = "Sort order")]
public int SortOrder { get; set; }
[Display(Name = "Colour")]
public string Colour { get; set; } = "#2f6f63";
[Display(Name = "Main plot")]
public bool IsMainPlot { get; set; }
[Display(Name = "Visible on timeline")]
public bool IsVisibleOnTimeline { get; set; } = true;
public Project? Project { get; set; }
public IReadOnlyList<SelectListItem> PlotLineTypes { get; set; } = [];
public IReadOnlyList<SelectListItem> BookOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> ParentPlotLineOptions { get; set; } = [];
}
public sealed class PlotLineListViewModel
{
public Project Project { get; set; } = new();
public IReadOnlyList<PlotLineItem> PlotLines { get; set; } = [];
}
public sealed class PlotThreadEditViewModel
{
public int PlotThreadID { get; set; }
public int ProjectID { get; set; }
[Display(Name = "Plot line")]
public int PlotLineID { get; set; }
[Required, StringLength(200)]
[Display(Name = "Thread title")]
public string ThreadTitle { get; set; } = string.Empty;
[Display(Name = "Type")]
public int ThreadTypeID { get; set; }
[Display(Name = "Status")]
public int ThreadStatusID { get; set; }
[Range(1, 10)]
public int Importance { get; set; } = 5;
public string? Summary { get; set; }
[Display(Name = "Introduced scene")]
public int? IntroducedSceneID { get; set; }
[Display(Name = "Planned resolution scene")]
public int? PlannedResolutionSceneID { get; set; }
[Display(Name = "Actual resolution scene")]
public int? ActualResolutionSceneID { get; set; }
public Project? Project { get; set; }
public IReadOnlyList<SelectListItem> PlotLineOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> ThreadTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> ThreadStatusOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> SceneOptions { get; set; } = [];
}
public sealed class PlotThreadListViewModel
{
public Project Project { get; set; } = new();
public IReadOnlyList<PlotThread> PlotThreads { get; set; } = [];
}
public sealed class ThreadEventCreateViewModel
{
public int SceneID { get; set; }
public int? PlotLineID { get; set; }
public int? PlotThreadID { get; set; }
public string? NewThreadTitle { get; set; }
public int? NewThreadTypeID { get; set; }
public int EventTypeID { get; set; }
public string EventTitle { get; set; } = string.Empty;
public string? EventDescription { get; set; }
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class PlotLineLaneViewModel
{
public PlotLineItem PlotLine { get; set; } = new();
public IReadOnlyList<PlotLaneSceneViewModel> SceneSlots { get; set; } = [];
}
public sealed class PlotLaneSceneViewModel
{
public Scene Scene { get; set; } = new();
public IReadOnlyList<ThreadEvent> Events { get; set; } = [];
}
public sealed class StoryAssetListViewModel
{
public Project Project { get; set; } = new();
public IReadOnlyList<StoryAsset> Assets { get; set; } = [];
}
public sealed class StoryAssetEditViewModel
{
public int StoryAssetID { get; set; }
public int ProjectID { get; set; }
[Required, StringLength(200)]
[Display(Name = "Asset name")]
public string AssetName { get; set; } = string.Empty;
[Display(Name = "Kind")]
public int AssetKindID { get; set; }
public string? Description { get; set; }
[Range(1, 10)]
public int Importance { get; set; } = 5;
[Display(Name = "Current state")]
public int? CurrentStateID { get; set; }
[Display(Name = "Current location")]
public int? CurrentLocationID { get; set; }
[Display(Name = "Resolved")]
public bool IsResolved { get; set; }
public Project? Project { get; set; }
public IReadOnlyList<SelectListItem> AssetKindOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> AssetStateOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> LocationOptions { get; set; } = [];
}
public sealed class StoryAssetDetailViewModel
{
public Project Project { get; set; } = new();
public StoryAsset Asset { get; set; } = new();
public IReadOnlyList<StoryAsset> ProjectAssets { get; set; } = [];
public IReadOnlyList<AssetEvent> Events { get; set; } = [];
public IReadOnlyList<AssetDependency> Dependencies { get; set; } = [];
public IReadOnlyList<AssetCustodyEvent> CustodyEvents { get; set; } = [];
public AssetDependencyEditViewModel NewDependency { get; set; } = new();
public IReadOnlyList<SelectListItem> AssetOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> AssetDependencyTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> AssetStateOptions { get; set; } = [];
}
public sealed class AssetEventCreateViewModel
{
public int SceneID { get; set; }
public int? StoryAssetID { get; set; }
public string? NewAssetName { get; set; }
public int? NewAssetKindID { get; set; }
public int AssetEventTypeID { get; set; }
public int? FromStateID { get; set; }
public int? ToStateID { get; set; }
public string EventTitle { get; set; } = string.Empty;
public string? EventDescription { get; set; }
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class AssetCustodyCreateViewModel
{
public int SceneID { get; set; }
public int StoryAssetID { get; set; }
public int AssetCustodyEventTypeID { get; set; }
public int CustodyRoleID { get; set; }
public List<int> CustodianCharacterIds { get; set; } = [];
public string CustodianNames { get; set; } = string.Empty;
public string? Description { get; set; }
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class SceneAssetLocationCreateViewModel
{
public int SceneAssetLocationID { get; set; }
public int SceneID { get; set; }
public int StoryAssetID { get; set; }
public int LocationID { get; set; }
public string? Description { get; set; }
public bool UpdateCurrentLocation { get; set; } = true;
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class AssetDependencyEditViewModel
{
public int AssetDependencyID { get; set; }
public int ProjectID { get; set; }
public int SourceAssetID { get; set; }
public int TargetAssetID { get; set; }
public int AssetDependencyTypeID { get; set; }
public int? SourceRequiredStateID { get; set; }
public int? TargetBlockedStateID { get; set; }
public string? Description { get; set; }
}
public sealed class AssetLaneViewModel
{
public StoryAsset Asset { get; set; } = new();
public IReadOnlyList<AssetLaneSceneViewModel> SceneSlots { get; set; } = [];
}
public sealed class AssetLaneSceneViewModel
{
public Scene Scene { get; set; } = new();
public IReadOnlyList<AssetEvent> Events { get; set; } = [];
}
public sealed class CharacterListViewModel
{
public Project Project { get; set; } = new();
public IReadOnlyList<Character> Characters { get; set; } = [];
}
public sealed class CharacterEditViewModel
{
public int CharacterID { get; set; }
public int ProjectID { get; set; }
[Required, StringLength(200)]
[Display(Name = "Character name")]
public string CharacterName { get; set; } = string.Empty;
[Display(Name = "Short name")]
public string? ShortName { get; set; }
public string? Sex { get; set; }
[Display(Name = "Birth date")]
public DateTime? BirthDate { get; set; }
[Display(Name = "Age at series start")]
public int? AgeAtSeriesStart { get; set; }
public string? Height { get; set; }
[Display(Name = "Eye colour")]
public string? EyeColour { get; set; }
[Display(Name = "Default description")]
public string? DefaultDescription { get; set; }
public Project? Project { get; set; }
}
public sealed class CharacterDetailViewModel
{
public Project Project { get; set; } = new();
public Character Character { get; set; } = new();
public string DisplayAge { get; set; } = "Unknown";
public IReadOnlyList<SceneCharacter> Appearances { get; set; } = [];
public IReadOnlyList<CharacterAttributeEvent> AttributeEvents { get; set; } = [];
public IReadOnlyList<CharacterKnowledgeItem> KnowledgeItems { get; set; } = [];
public IReadOnlyList<CharacterRelationship> Relationships { get; set; } = [];
public IReadOnlyList<RelationshipEvent> RelationshipEvents { get; set; } = [];
}
public sealed class SceneCharacterCreateViewModel
{
public int SceneID { get; set; }
public int? CharacterID { get; set; }
public string? NewCharacterName { get; set; }
public int? RoleInSceneTypeID { get; set; }
public int? PresenceTypeID { get; set; }
public int? LocationID { get; set; }
public int? EntryLocationID { get; set; }
public int? ExitLocationID { get; set; }
public string? AppearanceNotes { get; set; }
public string? OutfitDescription { get; set; }
public string? PhysicalCondition { get; set; }
public string? EmotionalState { get; set; }
public string? KnowledgeNotes { get; set; }
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class CharacterAttributeEventCreateViewModel
{
public int SceneID { get; set; }
public int CharacterID { get; set; }
public int CharacterAttributeTypeID { get; set; }
public string AttributeValue { get; set; } = string.Empty;
public string? Description { get; set; }
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class CharacterKnowledgeCreateViewModel
{
public int SceneID { get; set; }
public int CharacterID { get; set; }
public int? StoryAssetID { get; set; }
public int? PlotThreadID { get; set; }
public int KnowledgeStateID { get; set; }
public string? Description { get; set; }
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class RelationshipEventCreateViewModel
{
public int SceneID { get; set; }
public int? CharacterRelationshipID { get; set; }
public int? CharacterAID { get; set; }
public int? CharacterBID { get; set; }
public int? RelationshipTypeID { get; set; }
public int RelationshipStateID { get; set; }
public int? Intensity { get; set; }
public bool IsKnownToOtherCharacter { get; set; }
public string? Description { get; set; }
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class CharacterLaneViewModel
{
public Character Character { get; set; } = new();
public IReadOnlyList<CharacterLaneSceneViewModel> SceneSlots { get; set; } = [];
}
public sealed class CharacterLaneSceneViewModel
{
public Scene Scene { get; set; } = new();
public IReadOnlyList<SceneCharacter> Appearances { get; set; } = [];
}
public sealed class LocationListViewModel
{
public Project Project { get; set; } = new();
public IReadOnlyList<LocationItem> Locations { get; set; } = [];
}
public sealed class LocationEditViewModel
{
public int LocationID { get; set; }
public int ProjectID { get; set; }
public int? ParentLocationID { get; set; }
[Required, StringLength(200)]
[Display(Name = "Location name")]
public string LocationName { get; set; } = string.Empty;
[Display(Name = "Location type")]
public int? LocationTypeID { get; set; }
public string? Description { get; set; }
public Project? Project { get; set; }
public IReadOnlyList<SelectListItem> ParentLocationOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> LocationTypeOptions { get; set; } = [];
}
public sealed class LocationDetailViewModel
{
public Project Project { get; set; } = new();
public LocationItem Location { get; set; } = new();
public IReadOnlyList<LocationItem> ChildLocations { get; set; } = [];
public IReadOnlyList<LocationRelationship> Relationships { get; set; } = [];
public IReadOnlyList<Scene> Scenes { get; set; } = [];
public IReadOnlyList<SceneCharacter> Characters { get; set; } = [];
public IReadOnlyList<SceneAssetLocation> Assets { get; set; } = [];
public LocationRelationshipEditViewModel NewRelationship { get; set; } = new();
public IReadOnlyList<SelectListItem> LocationOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> RelationshipTypeOptions { get; set; } = [];
}
public sealed class LocationRelationshipEditViewModel
{
public int LocationRelationshipID { get; set; }
public int ProjectID { get; set; }
public int FromLocationID { get; set; }
public int ToLocationID { get; set; }
public int LocationRelationshipTypeID { get; set; }
public bool IsBidirectional { get; set; }
public int? Strength { get; set; }
public bool CanHearNormalSpeech { get; set; }
public bool CanHearLoudNoise { get; set; }
public bool CanSeeMovement { get; set; }
public bool CanSeeClearly { get; set; }
public bool CanTravelDirectly { get; set; }
public string? Notes { get; set; }
}
public sealed class WarningDashboardViewModel
{
public Project Project { get; set; } = new();
public int? BookID { get; set; }
public int? SceneID { get; set; }
public int? WarningTypeID { get; set; }
public int? WarningSeverityID { get; set; }
public string? EntityType { get; set; }
public bool IncludeDismissed { get; set; }
public bool IncludeIntentional { get; set; }
public IReadOnlyList<ContinuityWarning> Warnings { get; set; } = [];
public IReadOnlyList<SelectListItem> BookOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> WarningTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> SeverityOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> EntityTypeOptions { get; set; } = [];
public IReadOnlyDictionary<string, int> CountsBySeverity { get; set; } = new Dictionary<string, int>();
public IReadOnlyDictionary<string, int> CountsByType { get; set; } = new Dictionary<string, int>();
public ContinuityValidationSummary? LastValidationSummary { get; set; }
}
public sealed class SceneDependencyCreateViewModel
{
public int SceneDependencyID { get; set; }
public int ProjectID { get; set; }
public int CurrentSceneID { get; set; }
public int RelatedSceneID { get; set; }
public string Direction { get; set; } = "CurrentDependsOnRelated";
public int SceneDependencyTypeID { get; set; }
public bool IsHardDependency { get; set; }
public string? Description { get; set; }
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class SceneMoveRequestViewModel
{
public int SceneID { get; set; }
public int TargetChapterID { get; set; }
public string Position { get; set; } = "End";
public bool RenumberScenes { get; set; }
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class SceneMovePreviewViewModel
{
public SceneMovePreview Preview { get; set; } = new();
public SceneMoveRequestViewModel Request { get; set; } = new();
public IReadOnlyList<ContinuityWarning> CurrentWarnings { get; set; } = [];
}
public sealed class AnalyticsViewModel
{
public Project Project { get; set; } = new();
public int? BookID { get; set; }
public decimal? StartChapterNumber { get; set; }
public decimal? EndChapterNumber { get; set; }
public decimal? StartSceneNumber { get; set; }
public decimal? EndSceneNumber { get; set; }
public IReadOnlyList<SelectListItem> BookOptions { get; set; } = [];
public IReadOnlyList<AnalyticsMetricGraphViewModel> MetricGraphs { get; set; } = [];
public IReadOnlyList<AnalyticsRevisionSummary> RevisionSummary { get; set; } = [];
public IReadOnlyList<AnalyticsRevisionScene> RevisionAttentionScenes { get; set; } = [];
public IReadOnlyList<AnalyticsPurposeSummary> PurposeSummary { get; set; } = [];
public IReadOnlyList<AnalyticsSceneGap> SceneGaps { get; set; } = [];
public IReadOnlyList<AnalyticsThreadHealth> ThreadHealth { get; set; } = [];
public IReadOnlyList<AnalyticsAssetHealth> AssetHealth { get; set; } = [];
public IReadOnlyList<AnalyticsWarningSeverityCount> WarningSeverityCounts { get; set; } = [];
public IReadOnlyList<AnalyticsWarningTypeCount> WarningTypeCounts { get; set; } = [];
public IReadOnlyList<AnalyticsWarningHotspot> WarningHotspots { get; set; } = [];
public IReadOnlyList<AnalyticsPovSummary> PovSummary { get; set; } = [];
public IReadOnlyList<AnalyticsMultiPovChapter> MultiPovChapters { get; set; } = [];
public IReadOnlyList<AnalyticsCharacterAppearance> CharacterAppearances { get; set; } = [];
public IReadOnlyList<AnalyticsBusyScene> BusyScenes { get; set; } = [];
public IReadOnlyList<AnalyticsLocationUsage> LocationUsage { get; set; } = [];
public IReadOnlyList<AnalyticsReviewNote> PacingReviewNotes { get; set; } = [];
}
public sealed class AnalyticsMetricGraphViewModel
{
public string MetricName { get; set; } = string.Empty;
public IReadOnlyList<AnalyticsMetricPoint> Points { get; set; } = [];
}
public sealed class AnalyticsReviewNote
{
public string MetricName { get; set; } = string.Empty;
public string SceneRange { get; set; } = string.Empty;
public string ValuePattern { get; set; } = string.Empty;
public string ReviewNote { get; set; } = string.Empty;
public int? SceneID { get; set; }
}