@stevecastaneda/paseo-progress 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/panel.tsx +13 -19
- package/client/spinner.tsx +11 -0
- package/client/ticket-dialog.tsx +4 -4
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/client/panel.tsx
CHANGED
|
@@ -3,7 +3,7 @@ import { Icon } from "@getpaseo/plugin/client/react-native";
|
|
|
3
3
|
import { DeliverablesList } from "./deliverables";
|
|
4
4
|
import { LauncherBanner, SkillBanner } from "./launcher";
|
|
5
5
|
import { AnsweredQuestionsList, QuestionsSection } from "./questions";
|
|
6
|
-
import { Spinner, StalledPulse } from "./spinner";
|
|
6
|
+
import { Spinner, StalledPulse, WaitingDot } from "./spinner";
|
|
7
7
|
import { IconSwap, Presence, StaggerRoot, nativeDriver } from "./motion";
|
|
8
8
|
import { SectionTitle } from "./section-title";
|
|
9
9
|
import { raised } from "./surfaces";
|
|
@@ -15,7 +15,7 @@ import { PROGRESS_FILE, type TicketStatus } from "../shared/events";
|
|
|
15
15
|
import { formatMinutes, formatWorkDone, minutesSince } from "../shared/format";
|
|
16
16
|
import { markPanelOpened } from "../shared/rpc";
|
|
17
17
|
import { useDashboard } from "./dashboard-query";
|
|
18
|
-
import {
|
|
18
|
+
import { STATUS_LABEL } from "./status-badge";
|
|
19
19
|
import { TicketDialogs } from "./ticket-dialog";
|
|
20
20
|
import { PressableRow } from "./row";
|
|
21
21
|
import { ShowMoreRow, usePaged } from "./show-more";
|
|
@@ -423,21 +423,14 @@ function TicketRow({ colors, ticket, live, now, onOpen, deliverables }: { colors
|
|
|
423
423
|
<PressableRow colors={colors} onSurface1={working} transparentAtRest={!working}
|
|
424
424
|
accessibilityRole="button" accessibilityLabel={`${ticket.id} details`} onPress={onOpen}
|
|
425
425
|
style={{ flexDirection: "row", alignItems: "flex-start", gap: 10, paddingHorizontal: 10, paddingVertical: 8, borderTopWidth: 1, borderTopColor: colors.border }}>
|
|
426
|
-
|
|
426
|
+
{/* The icon is the only status mark on the row; the ticket dialog spells it out in a badge. */}
|
|
427
|
+
<View accessible accessibilityLabel={ticket.waitingFor ? "Waiting" : STATUS_LABEL[ticket.status]} style={{ width: 16, paddingTop: 2, alignItems: "center" }}>
|
|
427
428
|
<IconSwap swapKey={ticket.waitingFor ? "waiting" : ticket.status === "working" ? `working-${live}` : ticket.status} size={14}><StatusIcon colors={colors} status={ticket.status} live={live} waiting={Boolean(ticket.waitingFor)} /></IconSwap>
|
|
428
429
|
</View>
|
|
429
430
|
<View style={{ flex: 1, minWidth: 0, gap: 2 }}>
|
|
430
|
-
{
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
<View accessibilityLabel={deliverables === 1 ? "Has a deliverable" : `Has ${deliverables} deliverables`} style={{ height: 18, justifyContent: "center" }}>
|
|
434
|
-
<Icon name="Paperclip" size={12} color={colors.foregroundMuted} />
|
|
435
|
-
</View>
|
|
436
|
-
) : null}
|
|
437
|
-
<Text style={{ flex: 1, color: muted ? colors.foregroundMuted : colors.foreground, fontSize: 13, lineHeight: 18, textDecorationLine: muted ? "line-through" : "none" }}>
|
|
438
|
-
{ticket.title}
|
|
439
|
-
</Text>
|
|
440
|
-
</View>
|
|
431
|
+
<Text style={{ color: muted ? colors.foregroundMuted : colors.foreground, fontSize: 13, lineHeight: 18, textDecorationLine: muted ? "line-through" : "none" }}>
|
|
432
|
+
{ticket.title}
|
|
433
|
+
</Text>
|
|
441
434
|
{ticket.status === "working" && ticket.stage && ticket.stageSince ? (
|
|
442
435
|
<Text style={{ color: colors.foregroundMuted, fontSize: 12, lineHeight: 17 }}>
|
|
443
436
|
{ticket.stage} stage started <When colors={colors} iso={ticket.stageSince} now={now} />
|
|
@@ -453,17 +446,18 @@ function TicketRow({ colors, ticket, live, now, onOpen, deliverables }: { colors
|
|
|
453
446
|
) : null}
|
|
454
447
|
{ticket.note ? <Text style={{ color: colors.foregroundMuted, fontSize: 12, lineHeight: 17 }}>{ticket.note}</Text> : null}
|
|
455
448
|
</View>
|
|
456
|
-
|
|
457
|
-
{
|
|
458
|
-
|
|
459
|
-
|
|
449
|
+
{/* Fixed slots so the Package icon and estimates line up down the list, whether or not a row has deliverables; they're listed in its dialog. */}
|
|
450
|
+
<View accessibilityLabel={deliverables ? (deliverables === 1 ? "Has a deliverable" : `Has ${deliverables} deliverables`) : undefined} style={{ width: 12, height: 18, justifyContent: "center" }}>
|
|
451
|
+
{deliverables ? <Icon name="Package" size={12} color={colors.foregroundMuted} /> : null}
|
|
452
|
+
</View>
|
|
453
|
+
<Text style={{ minWidth: 44, textAlign: "right", color: colors.foregroundMuted, fontSize: 12, lineHeight: 18, fontVariant: ["tabular-nums"] }}>{ticket.estimateMin} min</Text>
|
|
460
454
|
<View style={{ paddingTop: 2 }}><Icon name="ChevronRight" size={14} color={colors.foregroundMuted} /></View>
|
|
461
455
|
</PressableRow>
|
|
462
456
|
);
|
|
463
457
|
}
|
|
464
458
|
|
|
465
459
|
function StatusIcon({ colors, status, live, waiting }: { colors: Colors; status: TicketStatus; live: boolean; waiting: boolean }) {
|
|
466
|
-
if (waiting) return <
|
|
460
|
+
if (waiting) return <WaitingDot color={colors.foregroundMuted} size={14} />;
|
|
467
461
|
switch (status) {
|
|
468
462
|
case "done":
|
|
469
463
|
return <Icon name="Check" size={14} color={colors.statusSuccess} />;
|
package/client/spinner.tsx
CHANGED
|
@@ -33,3 +33,14 @@ export function StalledPulse({ color, size = 12 }: { color: string; size?: numbe
|
|
|
33
33
|
</Animated.View>
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
|
+
|
|
37
|
+
// A ticket waiting on another one: a still, faded dot, so it reads as parked
|
|
38
|
+
// rather than busy. Centered in the same slot an icon would take.
|
|
39
|
+
export function WaitingDot({ color, size = 12 }: { color: string; size?: number }) {
|
|
40
|
+
const dot = Math.round(size / 2);
|
|
41
|
+
return (
|
|
42
|
+
<View accessibilityLabel="Waiting" style={{ width: size, height: size, alignItems: "center", justifyContent: "center" }}>
|
|
43
|
+
<View style={{ width: dot, height: dot, borderRadius: dot / 2, backgroundColor: color, opacity: 0.5 }} />
|
|
44
|
+
</View>
|
|
45
|
+
);
|
|
46
|
+
}
|
package/client/ticket-dialog.tsx
CHANGED
|
@@ -9,7 +9,7 @@ import { type Attachment, AttachmentList, deliverableAttachment } from "./attach
|
|
|
9
9
|
import { StackedDialog } from "./dialog-stack";
|
|
10
10
|
import { IconSwap } from "./motion";
|
|
11
11
|
import { PressableRow } from "./row";
|
|
12
|
-
import { Spinner, StalledPulse } from "./spinner";
|
|
12
|
+
import { Spinner, StalledPulse, WaitingDot } from "./spinner";
|
|
13
13
|
import { StatusBadge } from "./status-badge";
|
|
14
14
|
import { When } from "./when";
|
|
15
15
|
|
|
@@ -65,7 +65,7 @@ export function TicketStoryView({ colors, dashboard, ticket, now, live, onOpenAt
|
|
|
65
65
|
{ticket.waitingFor ? (
|
|
66
66
|
<View style={{ flexDirection: "row", gap: 4 }}>
|
|
67
67
|
{/* Held on the first line when a long title wraps. */}
|
|
68
|
-
<View style={{ height: 18, justifyContent: "center" }}><
|
|
68
|
+
<View style={{ height: 18, justifyContent: "center" }}><WaitingDot color={colors.foregroundMuted} /></View>
|
|
69
69
|
<Text style={{ flex: 1, color: colors.foregroundMuted, fontSize: 12, lineHeight: 18 }}>Waits for {ticket.waitingFor.id}: {ticket.waitingFor.title}</Text>
|
|
70
70
|
</View>
|
|
71
71
|
) : null}
|
|
@@ -158,8 +158,8 @@ function LinkNote({ colors, link }: { colors: Colors; link: Link }) {
|
|
|
158
158
|
// The same icons as the ticket rows, so a step reads like the status it was.
|
|
159
159
|
// Past stage steps get an accent ringed dot: work that happened, now over.
|
|
160
160
|
function Marker({ colors, step }: { colors: Colors; step: TimelineStep & { waiting?: boolean } }) {
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
if (step.waiting) return <WaitingDot color={colors.foregroundMuted} />;
|
|
162
|
+
const icon = step.label === "Added" ? { name: "CirclePlus", color: colors.foregroundMuted }
|
|
163
163
|
: step.status === "done" ? { name: "CircleCheck", color: colors.statusSuccess }
|
|
164
164
|
: step.status === "blocked" ? { name: "Ban", color: colors.statusDanger }
|
|
165
165
|
: step.status === "skipped" ? { name: "CircleSlash", color: colors.foregroundMuted }
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stevecastaneda/paseo-progress",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@stevecastaneda/paseo-progress",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.2",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@getpaseo/client": "^0.9.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stevecastaneda/paseo-progress",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "A live progress dashboard per worktree for Paseo, drawn from a file agents write with the paseo-progress command.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Steve Castaneda",
|