Skip to main content

Mode

Enum Mode 

Source
pub enum Mode {
Show 42 variants Board, BulkModal, TriageInbox, Cycle, Mentions, MentionNotice, RecurringWarning, WipOverride { buffer: String, }, Stats, HealthForm, TimeForm, TimeFilterForm, Schedule, Repos, Library, Portfolio, RolloverDialog, Detail, Form, ConfirmDelete, ConfirmArchive { filenames: Vec<String>, restore: bool, }, MoveIntoDone { buffer: String, }, ConfirmBlockedMove { warning: String, }, TransitionReason { reason: String, buffer: String, }, Help { return_to: Box<Mode>, }, Tips { return_to: Box<Mode>, }, ActionMenu { return_to: Box<Mode>, }, Filter { buffer: String, }, FilterModal, Views, Settings, PlanningManagement, PlanningForm, DatePicker { return_to: Box<Mode>, }, Comment { buffer: String, }, Asset { buffer: String, }, EditRepair { filename: String, message: String, key: Option<String>, problems: Vec<EditProblem>, temp: Option<PathBuf>, written: bool, discard_armed: bool, }, EditConflict { filename: String, temp: PathBuf, disk_path: PathBuf, }, LinkCreate { buffer: String, step: LinkStep, target: Option<u32>, }, LinkEdit { index: usize, buffer: String, step: LinkStep, target: Option<u32>, kind: Option<RelationKind>, }, ConfirmRemoveRelationship { index: usize, }, ParentPrompt { buffer: String, },
}

Variants§

§

Board

§

BulkModal

The batch modal (WP07). The modal’s state is in App::bulk; the mode says only that it is open, exactly as Mode::FilterModal does.

§

TriageInbox

The triage inbox (WP06, T029). A modal over the board like settings and the batch modal, so the board, its tabs and its card cursor are all still there underneath and unchanged when it closes.

The inbox’s own cursor and selection live in App::triage rather than in BoardState, which is what makes “the normal board/detail selection is unchanged when the inbox is not active” a property of which struct each cursor is in rather than something a test has to remember to restore.

§

Cycle

The F3 Cycle mode (tui-cycle-mode): cycles grouped current / future / archived with statistics for the selected one. Like the triage inbox it is the mode’s content, not a modal over the board; the planning-management surface is reached from it with m.

§

Mentions

The all-issues mentions view (OpenSpec change issue-mentions): every pending @mention the local user holds, across issues. A modal over the board like the batch modal, so the cards stay on screen underneath.

Its state is crate::ui::mentions::MentionsView, held as App::mentions_view — Some exactly while it is open, so a closed view has no rows to act on.

§

MentionNotice

The per-issue mention notice (OpenSpec change issue-mentions): the issue just opened carries unread mentions for the local user.

Deliberately non-mutating: dismissing it (Esc, or i for “ignore”) writes nothing, which is what makes the mention reappear the next time the issue is opened. Only “mark read” reaches the store. Its keys are raw (see handle_key), for the reason the recurring warning’s are: the board binds some of the same letters and the binding layer would rewrite them first.

§

RecurringWarning

The recurring-issue due warning (mission recurring-issues-01M3C7G7, WP07): a non-mutating overlay over the board, Some exactly while it is open. Its state is crate::ui::recurring_warning::RecurringWarning.

The rows come from the shared detector, and each of the four answers is an explicit press — the overlay itself never generates, defers or ignores anything, which is what makes “detection is read-only” true in the TUI. Its keys are raw (see handle_key): the board’s d/g bindings would rewrite them into Esc.

§

WipOverride

The WIP override confirmation (mission configurable-wip-limits-01M3C6WX, WP05 T026): a blocking limit refused a move and the user is supplying the reason that authorizes it. An overlay over the board, like the due warning; it carries the one free-text field, so the reason is typed rather than pressed.

Fields

§buffer: String

The reason being typed.

§

Stats

The F7 Stats page’s Health tab (mission project-issue-health-status-01M3C8HX, WP06): one row per scope, with its state, layer and derived value, and the diagnostics below. Read-only — the mutations live in the detail view’s form.

§

HealthForm

The health form (mission project-issue-health-status-01M3C8HX, WP06 T032): the audit fields a mutation needs, opened from the detail pane. An overlay over the pane, like the WIP override: it carries free text, so Tab walks the fields and Enter submits.

§

TimeForm

The time-entry form (mission per-issue-time-tracking-01M3C9A4, WP05 T025): the audit fields an add, a correction or a deletion needs, opened from the F7 Stats page’s Time tab. An overlay over the page, like the health form: it carries free text, so Tab walks the fields and Enter submits.

The form’s own state is App::time_form, and the tab underneath keeps drawing, so the entry rows the correction is about stay on screen while its fields are typed.

§

TimeFilterForm

The Time tab’s filter editor (WP05 T026): the issue, assignee and period criteria the shared TimeFilter is built from. A separate mode only because it is a separate field set — the keys (Tab/Enter/Esc) are the time form’s.

§

Schedule

The F8 Schedule page (tix #1593): the recurring series and their state on its Series tab, and the configured cycle schedules with the cycles they generated on its Cycle schedules tab (mission repeating-cycle-schedules-01M3C7W1, tix #181), each with the keys that act on them. A top-level mode like F4/F5/F6.

§

Repos

The F6 Repos mode (tix #1529): the child (and parent) repositories this project coordinates. j/k walk the rows and Enter runs tix inside the selected repository. With none configured, the body explains how to add one under [repos].

§

Library

The F11 Library page (tix #1593): the saved views and the issue/form templates that already exist, listed with the selected record’s detail. Tab switches registries, j/k walk rows, and Enter applies the selected view to the board. Read-only apart from that apply — see crate::ui::library.

§

Portfolio

The F10 Portfolio page (WP06): the project registry this mission introduces, listed with each project’s derived member count and the selected project’s record and members beside it. Read-only — see crate::ui::portfolio.

§

RolloverDialog

§

Detail

§

Form

§

ConfirmDelete

§

ConfirmArchive

Archive or restore one issue, or every marked issue, after a y/N confirmation.

Fields

§filenames: Vec<String>
§restore: bool
§

MoveIntoDone

Fields

§buffer: String
§

ConfirmBlockedMove

The blocked-move acknowledgement prompt (WP04, FR-004).

Reached instead of applying a move toward the board’s completion column when the issue has open blockers. warning is the shared text from commands::blocked_note, so the TUI says exactly what the CLI says.

Fields

§warning: String
§

TransitionReason

The reasoned-override prompt (WP05, FR-002, contract §3.3).

Reached instead of applying a move that leaves a terminal category when the board declares a category_map. reason is the shared diagnostic from the service, so the TUI says exactly what the CLI says — parity includes the message, not only the accept/refuse decision.

This prompt is the whole reason WP05 exists on this path. Until it, a terminal-exit transition was refused by the seam with a message naming tix move … --reason, and the TUI had no way to supply one — the flag is a CLI spelling and the TUI has no flags. So a user who moved an issue to done in the TUI could not move it back, in the TUI, at all.

Fields

§reason: String

The refusal being overridden, rendered verbatim.

§buffer: String

What the user has typed so far.

§

Help

Fields

§return_to: Box<Mode>
§

Tips

The startup tips modal (tix #1632): one tip from the embedded crate::tips list, over the board opened by bare tix. return_to is the mode it was opened from, so closing it lands exactly where the session was headed.

Its own state is App::tips, Some exactly while it is open. Its keys are raw (see handle_key): the board binds some of the same letters, and the binding layer would rewrite them first.

Fields

§return_to: Box<Mode>
§

ActionMenu

The issue action menu (Enter, a plain left click, or right-click); return_to is the mode it was opened from. Activation runs the exact action the equivalent key binding would.

Fields

§return_to: Box<Mode>
§

Filter

Fields

§buffer: String
§

FilterModal

§

Views

The saved-views modal (WP05, T024–T027). A modal over the board like settings and the batch modal, so the board, its tabs, and its card cursor are all still there underneath and unchanged when it closes.

Its own state lives in App::views rather than in BoardState, so “navigation is unchanged when the view list is not open” is a property of which struct holds the cursor rather than something a test remembers to restore.

§

Settings

The F12 Config mode (tui-config-mode): the sectioned surface over dashboards, cycles, and milestones. Like the triage inbox and the cycle listing it is the mode’s content, not a modal over the board. Its state is App::settings, and its cycles/milestones sections drive App::planning too.

§

PlanningManagement

§

PlanningForm

§

DatePicker

Calendar date picker popup; return_to is the modal it overlays.

Fields

§return_to: Box<Mode>
§

Comment

Fields

§buffer: String
§

Asset

Fields

§buffer: String
§

EditRepair

The editor round trip left a file with a problem (tix #1506).

One prompt for every post-edit problem: a file that will not parse, a file tix lint is unhappy about, or an edit that lost its title. It lists each problem with its diagnostic and a proposal, and offers the fix tix can apply, the editor again on the retained copy, an explicit declaration of an undeclared key, acknowledgement, and a discard that needs a second confirmation.

Nothing is discarded automatically: the retained copy (temp) survives acknowledgement and is only removed by the confirmed discard. When written is true the edited content is already on disk (tix lint findings arrive after the write, tix #1510’s #1506 behaviour), so the prompt is a report; when it is false nothing has been written and the fix writes the repaired file for the first time.

key is the undeclared top-level frontmatter key the prompt can declare, Some only for an unknown_key problem with a non-empty value. It is what confirm/declare_key write into tix.toml; every other problem leaves it None, so those chords say there is nothing to declare.

Fields

§filename: String
§message: String

kind: message of the first problem, for the status line and the prompt’s heading.

§problems: Vec<EditProblem>

Every classified problem, in the order the diagnostics arrived.

§temp: Option<PathBuf>

The retained edited copy — the editor’s temp file when one exists. The only thing a confirmed discard removes.

§written: bool

Whether the edited content is already on disk.

§discard_armed: bool

A discard has been asked for once; the second keypress is the decision. Esc never sets it.

§

EditConflict

The issue file changed on disk while the editor had it open (tix #1510).

Entered instead of the write, so nothing about the raced edit is on disk: the newer file is untouched and the editor’s version is still the temp copy. The three keys the prompt names are the only way out, and two of them — a/Esc (keep the on-disk version) and c (compare in the editor) — never write the editor’s version at all. Only o/y overrides.

Fields

§filename: String

The issue file, relative to the store’s issues_dir.

§temp: PathBuf

The edited temp copy — the editor’s version, kept until the user decides (abandoning removes it, overriding writes it, comparing reopens it).

§disk_path: PathBuf

The newer on-disk file, shown so the user can open it by hand.

§

LinkCreate

Create a relationship from the detail view (#1359), in two steps.

Step::Target asks for the other issue as a selector — the same string tix link <from> <to> takes, so #4, 4, or a title fragment all work and an unresolvable one produces the CLI’s own error rather than a TUI-specific one. Step::Kind then asks for the kind, and it is required: C-001 forbids an untypeable relationship, so there is no default to fall back to and an empty or unrecognised answer is a refusal, not a guess.

Fields

§buffer: String
§target: Option<u32>

The target resolved by the Target step, carried forward to Kind.

Carried rather than re-resolved: the first step already applied the CLI’s selector rules and reported its errors, and re-reading the buffer’s meaning a second time would be a second place for the two to disagree. A Kind step with no target cannot happen — the mode is only entered in that state with one.

§

LinkEdit

Re-kind or retarget the relationship under the detail pane’s cursor.

Carries the target it was opened with so the kind step can submit an edit rather than a create: tix link edit <id> is an edit precisely because the stable id survives a re-kind, and a create-then-remove pair would lose it.

Fields

§index: usize
§buffer: String
§target: Option<u32>

The new target, when the user supplied one. None means keep the existing target and change only the kind — the same as tix link edit <id> --type … with no --to.

§kind: Option<RelationKind>

The new kind, when the user supplied one. None likewise means keep.

§

ConfirmRemoveRelationship

Confirm removing the relationship under the cursor.

A relationship is stored in exactly one issue’s file, so removing it is a write to another issue from the one on screen. It gets a confirmation for the same reason ConfirmDelete does, and the confirmation names the edge.

Fields

§index: usize
§

ParentPrompt

Set, change or clear the open issue’s parent (tix #1384).

The detail pane’s P opens it. Enter submits the typed selector and Esc cancels; an empty line clears the parent. The write goes through Store::set_parent/Store::clear_parent, the same hierarchy seam tix edit --parent uses, so one accepted change appends exactly one parent_set/parent_changed/parent_cleared History event — the TUI half of the CLI/TUI parity the create-only form could not express.

Fields

§buffer: String

Trait Implementations§

Source§

impl Clone for Mode

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Mode

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for Mode

Source§

impl PartialEq for Mode

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Mode

Auto Trait Implementations§

§

impl Freeze for Mode

§

impl RefUnwindSafe for Mode

§

impl Send for Mode

§

impl Sync for Mode

§

impl Unpin for Mode

§

impl UnsafeUnpin for Mode

§

impl UnwindSafe for Mode

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.