Lint / REUSE compliance (push) Failing after 13s
Build and Test / Build and run tests (push) Failing after 44s
Lint / clang-format (push) Failing after 57s
Build and Publish Flatpak / Build Flatpak (push) Failing after 14s
Build and Publish Flatpak / Deploy hosted repo to Pages (push) Skipped
- Spread columns by rank among the stages actually present, so sparse pipelines fill the width instead of leaving dead stretches - Top-align columns: the funnel's success path runs level along the top and drop-off ribbons only ever descend - Give each ribbon its slot per node side (outgoing by target height, incoming by source height) so ribbons stop braiding over each other - Move the last column's labels to its left so they always stay on-screen, with a theme halo to stay legible over ribbons - Never hide small-node labels; elide with tooltip instead - Guarantee columns and ribbons fit the viewport (clamp-aware scale, spill-proof ribbon thickness) - Debounce resize relayouts and stop re-querying SQLite on resize - Canonicalize stage names on write (CLI "rejected" -> "Rejected") and repair pre-existing rows on database open - Take Sankey node width/padding from Kirigami units - Add QuickShapesPrivate configure-time guard for QtQuick.Shapes - Extend sankeylayouttest: viewport fit, ribbon containment, slot ordering, sparse-column spread, canonicalization, degenerate sizes - README: build-dependency and generator fixes, document SettingsPage Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019FXfh48mASRsE1WEhy9jcM
46 lines
1.4 KiB
C++
46 lines
1.4 KiB
C++
/*
|
|
SPDX-FileCopyrightText: 2026 ToServeTheKing <[email protected]>
|
|
|
|
SPDX-License-Identifier: GPL-3.0-or-later
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <QColor>
|
|
#include <QString>
|
|
#include <QStringList>
|
|
|
|
/**
|
|
* The fixed set of stages an application can be in. Kept as a small closed
|
|
* vocabulary (rather than free text) so the Sankey diagram's columns and
|
|
* stacking order stay stable no matter what data is loaded.
|
|
*/
|
|
namespace JobStage
|
|
{
|
|
/// Stages in pipeline order. "Start" is a synthetic node (not a real stage,
|
|
/// never stored on a Job) representing "before the first recorded stage".
|
|
constexpr auto Start = "Start";
|
|
|
|
QStringList canonicalStages();
|
|
|
|
bool isValid(const QString &stage);
|
|
|
|
/// Canonical-case spelling for a stage matched case-insensitively
|
|
/// ("rejected" -> "Rejected", "start" -> Start). Unknown input is returned
|
|
/// unchanged.
|
|
QString canonical(const QString &stage);
|
|
|
|
/// Sankey column index. Start = 0; Applied..Offer walk the funnel; the three
|
|
/// terminal outcomes (Accepted/Rejected/Withdrawn/Ghosted) share the last
|
|
/// column so a rejection right after Applied is still a valid (longer) link.
|
|
int column(const QString &stage);
|
|
|
|
/// Stacking order of nodes within a column (top to bottom).
|
|
int orderInColumn(const QString &stage);
|
|
|
|
/// Stable color used for both the node box and its outgoing links.
|
|
QColor color(const QString &stage);
|
|
|
|
bool isTerminal(const QString &stage);
|
|
}
|