@skillcdn/console 0.1.16 → 0.1.18
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/README.md +4 -3
- package/dist/api.d.ts +4 -3
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +3 -2
- package/dist/api.js.map +1 -1
- package/dist/cli/cli.d.ts +12 -0
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +226 -21
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/format.d.ts +8 -3
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +31 -5
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +34 -8
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/install.d.ts +21 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +87 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/main.js +24 -4
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/notices.d.ts +13 -0
- package/dist/cli/notices.d.ts.map +1 -0
- package/dist/cli/notices.js +31 -0
- package/dist/cli/notices.js.map +1 -0
- package/dist/cli/terminal.d.ts +5 -0
- package/dist/cli/terminal.d.ts.map +1 -1
- package/dist/cli/terminal.js +11 -1
- package/dist/cli/terminal.js.map +1 -1
- package/dist/client.d.ts +43 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +69 -4
- package/dist/client.js.map +1 -1
- package/dist/compat.d.ts +66 -0
- package/dist/compat.d.ts.map +1 -0
- package/dist/compat.js +115 -0
- package/dist/compat.js.map +1 -0
- package/dist/components/calendar.d.ts +3 -1
- package/dist/components/calendar.d.ts.map +1 -1
- package/dist/components/calendar.js +21 -2
- package/dist/components/calendar.js.map +1 -1
- package/dist/components/comments.d.ts +59 -0
- package/dist/components/comments.d.ts.map +1 -0
- package/dist/components/comments.js +138 -0
- package/dist/components/comments.js.map +1 -0
- package/dist/components/event-feed.d.ts.map +1 -1
- package/dist/components/event-feed.js +2 -0
- package/dist/components/event-feed.js.map +1 -1
- package/dist/components/goals.d.ts +3 -1
- package/dist/components/goals.d.ts.map +1 -1
- package/dist/components/goals.js +23 -11
- package/dist/components/goals.js.map +1 -1
- package/dist/components/markdown.d.ts +6 -0
- package/dist/components/markdown.d.ts.map +1 -1
- package/dist/components/markdown.js +2 -1
- package/dist/components/markdown.js.map +1 -1
- package/dist/components/projects.d.ts.map +1 -1
- package/dist/components/projects.js +6 -1
- package/dist/components/projects.js.map +1 -1
- package/dist/components/roadmap.d.ts +37 -0
- package/dist/components/roadmap.d.ts.map +1 -0
- package/dist/components/roadmap.js +76 -0
- package/dist/components/roadmap.js.map +1 -0
- package/dist/components/task-view.d.ts +8 -3
- package/dist/components/task-view.d.ts.map +1 -1
- package/dist/components/task-view.js +6 -4
- package/dist/components/task-view.js.map +1 -1
- package/dist/components/tokens.d.ts +2 -0
- package/dist/components/tokens.d.ts.map +1 -1
- package/dist/components/tokens.js +13 -3
- package/dist/components/tokens.js.map +1 -1
- package/dist/console.css +314 -2
- package/dist/console.d.ts.map +1 -1
- package/dist/console.js +30 -11
- package/dist/console.js.map +1 -1
- package/dist/data.d.ts +5 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +3 -1
- package/dist/data.js.map +1 -1
- package/dist/i18n/en.d.ts +38 -2
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +38 -2
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +38 -2
- package/dist/i18n/ko.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/limits.d.ts +3 -0
- package/dist/limits.d.ts.map +1 -1
- package/dist/limits.js +3 -0
- package/dist/limits.js.map +1 -1
- package/dist/router.d.ts +6 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +10 -1
- package/dist/router.js.map +1 -1
- package/dist/rules.js +2 -2
- package/dist/rules.js.map +1 -1
- package/dist/schemas.d.ts +147 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +50 -1
- package/dist/schemas.js.map +1 -1
- package/dist/vocabulary.d.ts +1 -1
- package/dist/vocabulary.d.ts.map +1 -1
- package/dist/vocabulary.js +1 -0
- package/dist/vocabulary.js.map +1 -1
- package/docs/specs/cli.md +17 -10
- package/docs/specs/rest.md +17 -6
- package/package.json +3 -2
- package/skills/working-the-board/SKILL.md +8 -5
- package/src/api.ts +35 -0
- package/src/cli/cli.ts +273 -22
- package/src/cli/format.ts +36 -4
- package/src/cli/help.ts +38 -7
- package/src/cli/install.ts +111 -0
- package/src/cli/main.ts +25 -4
- package/src/cli/notices.ts +48 -0
- package/src/cli/terminal.ts +12 -1
- package/src/client.ts +142 -8
- package/src/compat.ts +173 -0
- package/src/components/calendar.tsx +41 -1
- package/src/components/comments.tsx +342 -0
- package/src/components/event-feed.tsx +2 -0
- package/src/components/goals.tsx +86 -7
- package/src/components/markdown.tsx +9 -1
- package/src/components/projects.tsx +16 -3
- package/src/components/roadmap.tsx +242 -0
- package/src/components/task-view.tsx +32 -33
- package/src/components/tokens.tsx +38 -1
- package/src/console.tsx +45 -3
- package/src/data.ts +9 -1
- package/src/i18n/en.ts +40 -2
- package/src/i18n/ko.ts +40 -2
- package/src/index.ts +20 -0
- package/src/limits.ts +3 -0
- package/src/router.ts +13 -2
- package/src/rules.ts +2 -2
- package/src/schemas.ts +60 -1
- package/src/styles/console.css +314 -2
- package/src/vocabulary.ts +1 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { RestCategory, RestGoal } from "../api.js";
|
|
2
|
+
/** How many months the roadmap shows at once when the address names no other span. */
|
|
3
|
+
export declare const DEFAULT_TIMELINE_MONTHS = 6;
|
|
4
|
+
export interface TimelineBar {
|
|
5
|
+
readonly goal: RestGoal;
|
|
6
|
+
/** Where the bar begins and ends, as shares of the whole span, 0 to 1. */
|
|
7
|
+
readonly from: number;
|
|
8
|
+
readonly to: number;
|
|
9
|
+
/** Whether the goal begins within the span, and whether it ends within it. */
|
|
10
|
+
readonly begins: boolean;
|
|
11
|
+
readonly ends: boolean;
|
|
12
|
+
/** Whether the goal has one day only: a point on it, not a bar. */
|
|
13
|
+
readonly point: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The bars of the goals that touch the span of `months` from `from` on, cut to it: from the
|
|
17
|
+
* goal's start, or the span's first day when it began before, to its target day whole, or the
|
|
18
|
+
* span's end when it ends after. A goal with a start or a target alone sits on that day; a goal
|
|
19
|
+
* with neither is left out.
|
|
20
|
+
*/
|
|
21
|
+
export declare function timelineBars(goals: readonly RestGoal[], from: string, months: number): TimelineBar[];
|
|
22
|
+
export interface GoalTimelineProps {
|
|
23
|
+
readonly goals: readonly RestGoal[];
|
|
24
|
+
/** The first month shown: `2026-10`. */
|
|
25
|
+
readonly from: string;
|
|
26
|
+
/** How many months are shown; `DEFAULT_TIMELINE_MONTHS` when left out. */
|
|
27
|
+
readonly months?: number | undefined;
|
|
28
|
+
/** The day to count from; the browser's today when left out. */
|
|
29
|
+
readonly today?: string | undefined;
|
|
30
|
+
/** The workspace's categories, for the legend to say what the colours mean. */
|
|
31
|
+
readonly categories?: readonly RestCategory[] | undefined;
|
|
32
|
+
readonly goalHref: (goal: RestGoal) => string;
|
|
33
|
+
/** Where the roadmap is from another month on. */
|
|
34
|
+
readonly fromHref: (month: string) => string;
|
|
35
|
+
}
|
|
36
|
+
export declare function GoalTimeline(props: GoalTimelineProps): import("react").JSX.Element;
|
|
37
|
+
//# sourceMappingURL=roadmap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../src/components/roadmap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAWxD,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAKD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,WAAW,EAAE,CA4Bf;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAC;IAC9C,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAID,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BA2JpD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { addMonths, daysBetween, formatMonth, monthOf, today as todayOf } from "../dates.js";
|
|
3
|
+
import { useLanguage, useWords } from "../i18n/index.js";
|
|
4
|
+
import { cx, GoalStateBadge } from "./ui.js";
|
|
5
|
+
// The roadmap as months (ADR-0026): the months as columns, and each goal planned in days a bar
|
|
6
|
+
// from its start to its target in the colour of its category, filled as far as its tasks are
|
|
7
|
+
// done, with today a line down the months. A goal with one day alone sits on it as a point; one
|
|
8
|
+
// with no day is named below the months, since a plan without days is on none of them. Takes
|
|
9
|
+
// its data as props and nothing from the network; the months shown are the address's (ADR-0010).
|
|
10
|
+
/** How many months the roadmap shows at once when the address names no other span. */
|
|
11
|
+
export const DEFAULT_TIMELINE_MONTHS = 6;
|
|
12
|
+
/** The first day of a month, as a day. */
|
|
13
|
+
const firstDayOf = (month) => `${month}-01`;
|
|
14
|
+
/**
|
|
15
|
+
* The bars of the goals that touch the span of `months` from `from` on, cut to it: from the
|
|
16
|
+
* goal's start, or the span's first day when it began before, to its target day whole, or the
|
|
17
|
+
* span's end when it ends after. A goal with a start or a target alone sits on that day; a goal
|
|
18
|
+
* with neither is left out.
|
|
19
|
+
*/
|
|
20
|
+
export function timelineBars(goals, from, months) {
|
|
21
|
+
const first = firstDayOf(from);
|
|
22
|
+
const end = firstDayOf(addMonths(from, months));
|
|
23
|
+
const total = daysBetween(first, end);
|
|
24
|
+
if (total <= 0) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
return goals.flatMap((goal) => {
|
|
28
|
+
const startsOn = goal.startsOn ?? goal.dueOn;
|
|
29
|
+
const dueOn = goal.dueOn ?? goal.startsOn;
|
|
30
|
+
if (startsOn === null || dueOn === null || dueOn < first || startsOn >= end) {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
const begins = startsOn >= first;
|
|
34
|
+
const ends = dueOn < end;
|
|
35
|
+
const fromDay = begins ? daysBetween(first, startsOn) : 0;
|
|
36
|
+
const toDay = ends ? daysBetween(first, dueOn) + 1 : total;
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
goal,
|
|
40
|
+
from: fromDay / total,
|
|
41
|
+
to: toDay / total,
|
|
42
|
+
begins,
|
|
43
|
+
ends,
|
|
44
|
+
point: startsOn === dueOn,
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const percent = (share) => `${(share * 100).toFixed(3)}%`;
|
|
50
|
+
export function GoalTimeline(props) {
|
|
51
|
+
const words = useWords().roadmap;
|
|
52
|
+
const { tag } = useLanguage();
|
|
53
|
+
const months = Math.max(1, props.months ?? DEFAULT_TIMELINE_MONTHS);
|
|
54
|
+
const now = props.today ?? todayOf();
|
|
55
|
+
const first = firstDayOf(props.from);
|
|
56
|
+
const end = firstDayOf(addMonths(props.from, months));
|
|
57
|
+
const total = daysBetween(first, end);
|
|
58
|
+
const columns = Array.from({ length: months }, (_, index) => addMonths(props.from, index));
|
|
59
|
+
const shares = columns.map((month) => daysBetween(firstDayOf(month), firstDayOf(addMonths(month, 1))) / total);
|
|
60
|
+
const bars = timelineBars(props.goals, props.from, months);
|
|
61
|
+
const todayAt = now >= first && now < end ? daysBetween(first, now) / total : undefined;
|
|
62
|
+
const undated = props.goals.filter((goal) => goal.startsOn === null && goal.dueOn === null);
|
|
63
|
+
const doneShare = (goal) => {
|
|
64
|
+
const counts = goal.taskCounts;
|
|
65
|
+
const all = counts.idea + counts.ready + counts.in_progress + counts.in_review + counts.done;
|
|
66
|
+
return all === 0 ? 0 : counts.done / all;
|
|
67
|
+
};
|
|
68
|
+
return (_jsxs("div", { className: "sc-timeline", children: [_jsxs("div", { className: "sc-timeline-head", children: [_jsx("h2", { className: "sc-timeline-title", children: words.timeline.title }), _jsxs("nav", { className: "sc-calendar-nav", "aria-label": words.timeline.title, children: [_jsx("a", { className: "sc-button sc-button-ghost sc-button-sm", href: props.fromHref(addMonths(props.from, -1)), "aria-label": words.timeline.earlier, children: "<" }), _jsx("a", { className: "sc-button sc-button-ghost sc-button-sm", href: props.fromHref(monthOf(now)), children: words.timeline.thisMonth }), _jsx("a", { className: "sc-button sc-button-ghost sc-button-sm", href: props.fromHref(addMonths(props.from, 1)), "aria-label": words.timeline.later, children: ">" })] })] }), _jsxs("div", { className: "sc-timeline-grid", children: [_jsxs("div", { className: "sc-timeline-row sc-timeline-months", children: [_jsx("div", { className: "sc-timeline-label", "aria-hidden": "true" }), _jsxs("div", { className: "sc-timeline-track", children: [columns.map((month, index) => (_jsx("span", { className: "sc-timeline-month", style: { width: percent(shares[index] ?? 0) }, children: formatMonth(month, tag) }, month))), todayAt !== undefined && (_jsx("span", { className: "sc-timeline-today sc-timeline-today-mark", style: { left: percent(todayAt) }, title: words.timeline.today }))] })] }), bars.map(({ goal, from, to, begins, ends, point }) => {
|
|
69
|
+
const counts = goal.taskCounts;
|
|
70
|
+
const all = counts.idea + counts.ready + counts.in_progress + counts.in_review + counts.done;
|
|
71
|
+
return (_jsxs("div", { className: cx("sc-timeline-row", `sc-goal-${goal.state}`), children: [_jsxs("div", { className: "sc-timeline-label", children: [_jsx("a", { className: "sc-timeline-goal", href: props.goalHref(goal), children: goal.title }), _jsx(GoalStateBadge, { state: goal.state })] }), _jsxs("div", { className: "sc-timeline-track", children: [columns.map((month, index) => (_jsx("span", { className: "sc-timeline-column", style: { width: percent(shares[index] ?? 0) }, "aria-hidden": "true" }, month))), todayAt !== undefined && (_jsx("span", { className: "sc-timeline-today", style: { left: percent(todayAt) }, "aria-hidden": "true" })), _jsx("a", { className: cx(point ? "sc-timeline-point" : "sc-timeline-bar", `sc-category-${goal.category?.color ?? "gray"}`, begins && "sc-timeline-bar-begins", ends && "sc-timeline-bar-ends"), style: point
|
|
72
|
+
? { left: percent(from) }
|
|
73
|
+
: { left: percent(from), width: percent(to - from) }, href: props.goalHref(goal), "aria-label": `${goal.title}: ${words.progress(counts.done, all)}`, children: !point && (_jsxs(_Fragment, { children: [_jsx("span", { className: "sc-timeline-fill", style: { width: percent(doneShare(goal)) }, "aria-hidden": "true" }), _jsxs("span", { className: "sc-timeline-words", children: [counts.done, "/", all] })] })) })] })] }, goal.id));
|
|
74
|
+
})] }), bars.length === 0 && _jsx("p", { className: "sc-muted", children: words.timeline.nothing }), (props.categories ?? []).length > 0 && (_jsx("dl", { className: "sc-calendar-legend", "aria-label": words.timeline.legend, children: (props.categories ?? []).map((category) => (_jsxs("div", { children: [_jsx("dt", { children: _jsx("span", { className: cx("sc-calendar-dot", `sc-category-${category.color}`) }) }), _jsx("dd", { children: category.name })] }, category.key))) })), undated.length > 0 && (_jsxs("p", { className: "sc-timeline-undated", children: [_jsxs("span", { className: "sc-muted", children: [words.timeline.noDays, ": "] }), undated.map((goal, index) => (_jsxs("span", { children: [index > 0 && ", ", _jsx("a", { className: "sc-timeline-goal", href: props.goalHref(goal), children: goal.title })] }, goal.id)))] }))] }));
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=roadmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap.js","sourceRoot":"","sources":["../../src/components/roadmap.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { RestAnswerInput,
|
|
1
|
+
import type { RestAnswerInput, RestCategory, RestComment, RestDecision, RestDecisionInput, RestDecisionPatch, RestEvent, RestGoal, RestPerson, RestRun, RestTask, RestTaskInput, TaskState } from "../api.js";
|
|
2
2
|
import type { TaskFormKind } from "../router.js";
|
|
3
|
+
import { type CommentDraft } from "./comments.js";
|
|
3
4
|
export interface TaskViewProps {
|
|
4
5
|
readonly task: RestTask;
|
|
5
6
|
readonly people: readonly RestPerson[];
|
|
@@ -8,6 +9,8 @@ export interface TaskViewProps {
|
|
|
8
9
|
readonly decisions: readonly RestDecision[];
|
|
9
10
|
/** The runs of the board, or of this task; the ones on this task are shown. */
|
|
10
11
|
readonly runs?: readonly RestRun[] | undefined;
|
|
12
|
+
/** The comments on the task, oldest first, when the page has read them. */
|
|
13
|
+
readonly comments?: readonly RestComment[] | undefined;
|
|
11
14
|
/** Everything that happened to the task, oldest first, when the page has read it. */
|
|
12
15
|
readonly history?: readonly RestEvent[] | undefined;
|
|
13
16
|
/** The categories of the workspace, for the form. */
|
|
@@ -19,8 +22,8 @@ export interface TaskViewProps {
|
|
|
19
22
|
readonly decisionHref?: ((decisionId: string) => string) | undefined;
|
|
20
23
|
/** Where a goal of the roadmap is read. */
|
|
21
24
|
readonly goalHref?: ((goalId: string) => string) | undefined;
|
|
22
|
-
/** Where a file a run handed in
|
|
23
|
-
readonly fileHref?: ((
|
|
25
|
+
/** Where a file of the project is read, by its id: one a run handed in, or one put in a comment. */
|
|
26
|
+
readonly fileHref?: ((fileId: string) => string) | undefined;
|
|
24
27
|
/** Where a document of the project is read, by its path, for the links in what was written. */
|
|
25
28
|
readonly docHref?: ((path: string) => string) | undefined;
|
|
26
29
|
/** The day to count due days from; the browser's today when left out. */
|
|
@@ -40,6 +43,8 @@ export interface TaskViewProps {
|
|
|
40
43
|
/** Called to grow a decision's record with what followed. */
|
|
41
44
|
readonly onUpdateDecision?: ((decision: RestDecision, patch: RestDecisionPatch) => void) | undefined;
|
|
42
45
|
readonly onAbandonRun?: ((run: RestRun) => void) | undefined;
|
|
46
|
+
/** Called with a word for the discussion, and the files put in it. Left out, nothing can be said here. */
|
|
47
|
+
readonly onComment?: ((draft: CommentDraft) => void) | undefined;
|
|
43
48
|
}
|
|
44
49
|
export declare function TaskView(props: TaskViewProps): import("react").JSX.Element;
|
|
45
50
|
//# sourceMappingURL=task-view.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-view.d.ts","sourceRoot":"","sources":["../../src/components/task-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"task-view.d.ts","sourceRoot":"","sources":["../../src/components/task-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { formatDay } from "../dates.js";
|
|
3
3
|
import { useLanguage, useWords } from "../i18n/index.js";
|
|
4
4
|
import { TASK_STATES } from "../vocabulary.js";
|
|
5
|
+
import { TaskThread } from "./comments.js";
|
|
5
6
|
import { DecisionForm } from "./decision-form.js";
|
|
6
|
-
import { DecisionCard } from "./decision-list.js";
|
|
7
7
|
import { EventFeed } from "./event-feed.js";
|
|
8
8
|
import { Markdown } from "./markdown.js";
|
|
9
|
-
import { RunList } from "./runs.js";
|
|
10
9
|
import { TaskForm } from "./task-form.js";
|
|
11
10
|
import { CategoryBadge, DueBadge, PersonChip, PriorityBadge, StateBadge, Time } from "./ui.js";
|
|
12
11
|
export function TaskView(props) {
|
|
@@ -19,7 +18,7 @@ export function TaskView(props) {
|
|
|
19
18
|
const subtasks = props.tasks.filter((candidate) => candidate.parentId === task.id);
|
|
20
19
|
const about = props.decisions.filter((decision) => decision.taskId === task.id);
|
|
21
20
|
const runs = (props.runs ?? []).filter((run) => run.taskId === task.id);
|
|
22
|
-
const
|
|
21
|
+
const comments = (props.comments ?? []).filter((comment) => comment.taskId === task.id);
|
|
23
22
|
const goal = task.goalId === null
|
|
24
23
|
? undefined
|
|
25
24
|
: props.goals?.find((candidate) => candidate.id === task.goalId);
|
|
@@ -27,6 +26,9 @@ export function TaskView(props) {
|
|
|
27
26
|
if (props.form === "edit") {
|
|
28
27
|
return (_jsxs("div", { className: "sc-task sc-task-editing", children: [_jsxs("h1", { className: "sc-task-title", children: [_jsxs("span", { className: "sc-card-number", children: ["#", task.number] }), " ", task.title] }), _jsx(TaskForm, { people: props.people, task: task, parents: props.tasks, categories: props.categories, goals: props.goals, busy: props.busy, error: props.error, onSubmit: (input) => props.onChange(task, input), onCancel: props.onCancel })] }));
|
|
29
28
|
}
|
|
30
|
-
return (_jsxs("div", { className: "sc-task", children: [_jsxs("header", { className: "sc-task-header", children: [parent !== undefined && (_jsxs("p", { className: "sc-task-parent", children: [words.task.partOf, " ", _jsxs("a", { href: props.taskHref(parent), children: ["#", parent.number, " ", parent.title] })] })), _jsxs("h1", { className: "sc-task-title", children: [_jsxs("span", { className: "sc-card-number", children: ["#", task.number] }), " ", task.title] }), _jsxs("div", { className: "sc-task-badges", children: [_jsx(StateBadge, { state: task.state }), task.category !== null && _jsx(CategoryBadge, { category: task.category }), _jsx(PriorityBadge, { priority: task.priority }), task.dueOn !== null && (_jsx(DueBadge, { dueOn: task.dueOn, state: task.state, today: props.today }))] })] }), _jsxs("div", { className: "sc-task-body", children: [_jsxs("div", { className: "sc-task-main", children: [props.error !== undefined && (_jsx("p", { className: "sc-form-error", role: "alert", children: props.error })), task.body.length > 0 ? (_jsx(Markdown, { source: task.body, docHref: props.docHref })) : (_jsx("p", { className: "sc-muted", children: words.task.nothingMore })), task.links.length > 0 && (_jsxs("section", { className: "sc-task-section", "aria-label": words.task.links, children: [_jsx("h2", { className: "sc-section-title", children: words.task.links }), _jsx("ul", { className: "sc-link-list", children: task.links.map((link) => (_jsx("li", { children: _jsx("a", { href: link.url, target: "_blank", rel: "noopener noreferrer nofollow", children: link.label ?? link.url }) }, link.url))) })] })), props.form === "ask" && (_jsxs("section", { className: "sc-task-section", "aria-label": words.task.raiseDecision, children: [_jsx("h2", { className: "sc-section-title", children: words.task.raiseDecision }), _jsx(DecisionForm, { tasks: props.tasks, taskId: task.id, busy: props.busy, onSubmit: props.onRaiseDecision, onCancel: props.onCancel })] })),
|
|
29
|
+
return (_jsxs("div", { className: "sc-task", children: [_jsxs("header", { className: "sc-task-header", children: [parent !== undefined && (_jsxs("p", { className: "sc-task-parent", children: [words.task.partOf, " ", _jsxs("a", { href: props.taskHref(parent), children: ["#", parent.number, " ", parent.title] })] })), _jsxs("h1", { className: "sc-task-title", children: [_jsxs("span", { className: "sc-card-number", children: ["#", task.number] }), " ", task.title] }), _jsxs("div", { className: "sc-task-badges", children: [_jsx(StateBadge, { state: task.state }), task.category !== null && _jsx(CategoryBadge, { category: task.category }), _jsx(PriorityBadge, { priority: task.priority }), task.dueOn !== null && (_jsx(DueBadge, { dueOn: task.dueOn, state: task.state, today: props.today }))] })] }), _jsxs("div", { className: "sc-task-body", children: [_jsxs("div", { className: "sc-task-main", children: [props.error !== undefined && (_jsx("p", { className: "sc-form-error", role: "alert", children: props.error })), task.body.length > 0 ? (_jsx(Markdown, { source: task.body, docHref: props.docHref })) : (_jsx("p", { className: "sc-muted", children: words.task.nothingMore })), task.links.length > 0 && (_jsxs("section", { className: "sc-task-section", "aria-label": words.task.links, children: [_jsx("h2", { className: "sc-section-title", children: words.task.links }), _jsx("ul", { className: "sc-link-list", children: task.links.map((link) => (_jsx("li", { children: _jsx("a", { href: link.url, target: "_blank", rel: "noopener noreferrer nofollow", children: link.label ?? link.url }) }, link.url))) })] })), props.form === "ask" && (_jsxs("section", { className: "sc-task-section", "aria-label": words.task.raiseDecision, children: [_jsx("h2", { className: "sc-section-title", children: words.task.raiseDecision }), _jsx(DecisionForm, { tasks: props.tasks, taskId: task.id, busy: props.busy, onSubmit: props.onRaiseDecision, onCancel: props.onCancel })] })), (runs.length > 0 ||
|
|
30
|
+
about.length > 0 ||
|
|
31
|
+
comments.length > 0 ||
|
|
32
|
+
props.onComment !== undefined) && (_jsxs("section", { className: "sc-task-section", "aria-label": words.comments.title, children: [_jsx("h2", { className: "sc-section-title", children: words.comments.title }), _jsx(TaskThread, { task: task, comments: comments, runs: runs, decisions: about, fileHref: props.fileHref, decisionHref: props.decisionHref, docHref: props.docHref, onAnswer: props.onAnswer, onUpdateDecision: props.onUpdateDecision, onAbandonRun: props.onAbandonRun, onComment: props.onComment, busy: props.busy, empty: _jsx("p", { className: "sc-muted", children: words.comments.empty }) })] })), props.history !== undefined && props.history.length > 0 && (_jsxs("section", { className: "sc-task-section", "aria-label": words.task.history, children: [_jsx("h2", { className: "sc-section-title", children: words.task.history }), _jsx(EventFeed, { events: props.history })] })), subtasks.length > 0 && (_jsxs("section", { className: "sc-task-section", "aria-label": words.task.subtasks, children: [_jsx("h2", { className: "sc-section-title", children: words.task.partOfIt }), _jsx("ul", { className: "sc-subtasks", children: subtasks.map((subtask) => (_jsxs("li", { children: [_jsxs("a", { href: props.taskHref(subtask), children: [_jsxs("span", { className: "sc-card-number", children: ["#", subtask.number] }), " ", subtask.title] }), " ", _jsx(StateBadge, { state: subtask.state })] }, subtask.id))) })] }))] }), _jsxs("aside", { className: "sc-task-aside", "aria-label": words.task.facts, children: [_jsxs("dl", { className: "sc-facts", children: [_jsxs("div", { children: [_jsx("dt", { children: words.task.state }), _jsx("dd", { children: _jsx("select", { className: "sc-input", "aria-label": words.task.state, value: task.state, disabled: props.busy === true, onChange: (event) => props.onMove(task, event.target.value), children: TASK_STATES.map((state) => (_jsx("option", { value: state, children: words.vocabulary.state[state] }, state))) }) })] }), _jsxs("div", { children: [_jsx("dt", { children: words.task.form.priority }), _jsx("dd", { children: words.vocabulary.priority[task.priority] })] }), task.category !== null && (_jsxs("div", { children: [_jsx("dt", { children: words.task.category }), _jsx("dd", { children: _jsx(CategoryBadge, { category: task.category }) })] })), task.goalId !== null && (_jsxs("div", { children: [_jsx("dt", { children: words.task.goal }), _jsx("dd", { children: props.goalHref === undefined ? ((goal?.title ?? task.goalId)) : (_jsx("a", { href: props.goalHref(task.goalId), children: goal?.title ?? task.goalId })) })] })), _jsxs("div", { children: [_jsx("dt", { children: words.task.owner }), _jsx("dd", { children: _jsx(PersonChip, { person: task.owner }) })] }), _jsxs("div", { children: [_jsx("dt", { children: words.task.assignee }), _jsx("dd", { children: task.assignee === null ? (_jsx("span", { className: "sc-muted", children: words.common.nobody })) : (_jsx(PersonChip, { person: task.assignee })) })] }), (task.startsOn !== null || task.dueOn !== null) && (_jsxs("div", { children: [_jsx("dt", { children: words.task.plan }), _jsx("dd", { children: words.task.planned(task.startsOn === null ? undefined : day(task.startsOn), task.dueOn === null ? undefined : day(task.dueOn)) })] })), task.startedAt !== null && (_jsxs("div", { children: [_jsx("dt", { children: words.task.started }), _jsx("dd", { children: _jsx(Time, { iso: task.startedAt }) })] })), task.doneAt !== null && (_jsxs("div", { children: [_jsx("dt", { children: words.task.done }), _jsx("dd", { children: _jsx(Time, { iso: task.doneAt }) })] })), _jsxs("div", { children: [_jsx("dt", { children: words.task.written }), _jsx("dd", { children: _jsx(Time, { iso: task.createdAt }) })] }), _jsxs("div", { children: [_jsx("dt", { children: words.task.changed }), _jsx("dd", { children: _jsx(Time, { iso: task.updatedAt }) })] })] }), props.formHref !== undefined && (_jsxs("div", { className: "sc-task-actions", children: [_jsx("a", { className: "sc-button sc-button-secondary", href: props.formHref("edit"), children: words.common.edit }), _jsx("a", { className: "sc-button sc-button-secondary", href: props.formHref("ask"), children: words.task.raiseDecision })] }))] })] })] }));
|
|
31
33
|
}
|
|
32
34
|
//# sourceMappingURL=task-view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-view.js","sourceRoot":"","sources":["../../src/components/task-view.tsx"],"names":[],"mappings":";AAeA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"task-view.js","sourceRoot":"","sources":["../../src/components/task-view.tsx"],"names":[],"mappings":";AAeA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAqB,UAAU,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AA0D/F,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,MAAM,MAAM,GACV,IAAI,CAAC,QAAQ,KAAK,IAAI;QACpB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,KAAK,IAAI;QAClB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAErD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAI,SAAS,EAAC,eAAe,aAC3B,gBAAM,SAAS,EAAC,gBAAgB,kBAAG,IAAI,CAAC,MAAM,IAAQ,OAAE,IAAI,CAAC,KAAK,IAC/D,EACL,KAAC,QAAQ,IACP,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,KAAK,CAAC,KAAK,EACpB,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAChD,QAAQ,EAAE,KAAK,CAAC,QAAQ,GACxB,IACE,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,SAAS,aACtB,kBAAQ,SAAS,EAAC,gBAAgB,aAC/B,MAAM,KAAK,SAAS,IAAI,CACvB,aAAG,SAAS,EAAC,gBAAgB,aAC1B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EACvB,aAAG,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAC3B,MAAM,CAAC,MAAM,OAAG,MAAM,CAAC,KAAK,IAC5B,IACF,CACL,EACD,cAAI,SAAS,EAAC,eAAe,aAC3B,gBAAM,SAAS,EAAC,gBAAgB,kBAAG,IAAI,CAAC,MAAM,IAAQ,OAAE,IAAI,CAAC,KAAK,IAC/D,EACL,eAAK,SAAS,EAAC,gBAAgB,aAC7B,KAAC,UAAU,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAI,EAChC,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAC,aAAa,IAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAI,EACrE,KAAC,aAAa,IAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAI,EACzC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,CACtB,KAAC,QAAQ,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAI,CACvE,IACG,IACC,EACT,eAAK,SAAS,EAAC,cAAc,aAC3B,eAAK,SAAS,EAAC,cAAc,aAC1B,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,CAC5B,YAAG,SAAS,EAAC,eAAe,EAAC,IAAI,EAAC,OAAO,YACtC,KAAK,CAAC,KAAK,GACV,CACL,EACA,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACtB,KAAC,QAAQ,IAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,GAAI,CACxD,CAAC,CAAC,CAAC,CACF,YAAG,SAAS,EAAC,UAAU,YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,GAAK,CACrD,EACA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CACxB,mBAAS,SAAS,EAAC,iBAAiB,gBAAa,KAAK,CAAC,IAAI,CAAC,KAAK,aAC/D,aAAI,SAAS,EAAC,kBAAkB,YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAM,EACxD,aAAI,SAAS,EAAC,cAAc,YACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACxB,uBACE,YAAG,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,8BAA8B,YAClE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,GACrB,IAHG,IAAI,CAAC,GAAG,CAIZ,CACN,CAAC,GACC,IACG,CACX,EACA,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,CACvB,mBAAS,SAAS,EAAC,iBAAiB,gBAAa,KAAK,CAAC,IAAI,CAAC,aAAa,aACvE,aAAI,SAAS,EAAC,kBAAkB,YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,GAAM,EAChE,KAAC,YAAY,IACX,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,IAAI,CAAC,EAAE,EACf,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,QAAQ,EAAE,KAAK,CAAC,eAAe,EAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,GACxB,IACM,CACX,EACA,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;gCACf,KAAK,CAAC,MAAM,GAAG,CAAC;gCAChB,QAAQ,CAAC,MAAM,GAAG,CAAC;gCACnB,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAClC,mBAAS,SAAS,EAAC,iBAAiB,gBAAa,KAAK,CAAC,QAAQ,CAAC,KAAK,aACnE,aAAI,SAAS,EAAC,kBAAkB,YAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAM,EAC5D,KAAC,UAAU,IACT,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,KAAK,EAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EACxC,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,YAAG,SAAS,EAAC,UAAU,YAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAK,GACzD,IACM,CACX,EACA,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1D,mBAAS,SAAS,EAAC,iBAAiB,gBAAa,KAAK,CAAC,IAAI,CAAC,OAAO,aACjE,aAAI,SAAS,EAAC,kBAAkB,YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,GAAM,EAC1D,KAAC,SAAS,IAAC,MAAM,EAAE,KAAK,CAAC,OAAO,GAAI,IAC5B,CACX,EACA,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CACtB,mBAAS,SAAS,EAAC,iBAAiB,gBAAa,KAAK,CAAC,IAAI,CAAC,QAAQ,aAClE,aAAI,SAAS,EAAC,kBAAkB,YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAM,EAC3D,aAAI,SAAS,EAAC,aAAa,YACxB,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACzB,yBACE,aAAG,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,aAC9B,gBAAM,SAAS,EAAC,gBAAgB,kBAAG,OAAO,CAAC,MAAM,IAAQ,OAAE,OAAO,CAAC,KAAK,IACtE,EAAC,GAAG,EACR,KAAC,UAAU,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,GAAI,KAJ7B,OAAO,CAAC,EAAE,CAKd,CACN,CAAC,GACC,IACG,CACX,IACG,EACN,iBAAO,SAAS,EAAC,eAAe,gBAAa,KAAK,CAAC,IAAI,CAAC,KAAK,aAC3D,cAAI,SAAS,EAAC,UAAU,aACtB,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,KAAK,GAAM,EAC3B,uBACE,iBACE,SAAS,EAAC,UAAU,gBACR,KAAK,CAAC,IAAI,CAAC,KAAK,EAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,QAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,EAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,KAAkB,CAAC,YAEvE,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC1B,iBAAoB,KAAK,EAAE,KAAK,YAC7B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IADnB,KAAK,CAET,CACV,CAAC,GACK,GACN,IACD,EACN,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAM,EACnC,uBAAK,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAM,IAC/C,EACL,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,CACzB,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAM,EAC9B,uBACE,KAAC,aAAa,IAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAI,GACvC,IACD,CACP,EACA,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,CACvB,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,IAAI,GAAM,EAC1B,uBACG,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAC9B,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,CAC7B,CAAC,CAAC,CAAC,CACF,YAAG,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,YAAG,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,GAAK,CACvE,GACE,IACD,CACP,EACD,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,KAAK,GAAM,EAC3B,uBACE,KAAC,UAAU,IAAC,MAAM,EAAE,IAAI,CAAC,KAAK,GAAI,GAC/B,IACD,EACN,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAM,EAC9B,uBACG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CACxB,eAAM,SAAS,EAAC,UAAU,YAAE,KAAK,CAAC,MAAM,CAAC,MAAM,GAAQ,CACxD,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,GAAI,CACtC,GACE,IACD,EACL,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAClD,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,IAAI,GAAM,EAC1B,uBACG,KAAK,CAAC,IAAI,CAAC,OAAO,CACjB,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EACvD,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAClD,GACE,IACD,CACP,EACA,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,CAC1B,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,OAAO,GAAM,EAC7B,uBACE,KAAC,IAAI,IAAC,GAAG,EAAE,IAAI,CAAC,SAAS,GAAI,GAC1B,IACD,CACP,EACA,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,CACvB,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,IAAI,GAAM,EAC1B,uBACE,KAAC,IAAI,IAAC,GAAG,EAAE,IAAI,CAAC,MAAM,GAAI,GACvB,IACD,CACP,EACD,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,OAAO,GAAM,EAC7B,uBACE,KAAC,IAAI,IAAC,GAAG,EAAE,IAAI,CAAC,SAAS,GAAI,GAC1B,IACD,EACN,0BACE,uBAAK,KAAK,CAAC,IAAI,CAAC,OAAO,GAAM,EAC7B,uBACE,KAAC,IAAI,IAAC,GAAG,EAAE,IAAI,CAAC,SAAS,GAAI,GAC1B,IACD,IACH,EACJ,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,CAC/B,eAAK,SAAS,EAAC,iBAAiB,aAC9B,YAAG,SAAS,EAAC,+BAA+B,EAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,YACtE,KAAK,CAAC,MAAM,CAAC,IAAI,GAChB,EACJ,YAAG,SAAS,EAAC,+BAA+B,EAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,YACrE,KAAK,CAAC,IAAI,CAAC,aAAa,GACvB,IACA,CACP,IACK,IACJ,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -11,6 +11,8 @@ export interface TokenListProps {
|
|
|
11
11
|
readonly onRevoke?: ((token: RestToken) => void) | undefined;
|
|
12
12
|
readonly busy?: boolean | undefined;
|
|
13
13
|
readonly empty?: ReactNode;
|
|
14
|
+
/** The console's version (ADR-0025), so that the version of the command an agent runs is said to be behind or ahead; left out, the version alone is shown. */
|
|
15
|
+
readonly consoleVersion?: string | undefined;
|
|
14
16
|
}
|
|
15
17
|
export declare function TokenList(props: TokenListProps): import("react").JSX.Element;
|
|
16
18
|
export interface TokenFormProps {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/components/tokens.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AACjE,OAAO,
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/components/tokens.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AACjE,OAAO,EAML,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,WAAW,CAAC;AAcnB;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,CAMnF;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,8JAA8J;IAC9J,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9C;AAgBD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAmE9C;AAED,MAAM,WAAW,cAAc;IAC7B,+FAA+F;IAC/F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,oFAAoF;IACpF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CAC9C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAgE9C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,+BA+B5C"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from "react";
|
|
3
|
-
import { DEFAULT_TOKEN_DAYS, MAX_TOKEN_NAME_LENGTH, } from "../api.js";
|
|
3
|
+
import { DEFAULT_TOKEN_DAYS, judgeClient, MAX_TOKEN_NAME_LENGTH, parseVersion, } from "../api.js";
|
|
4
4
|
import { useWords } from "../i18n/index.js";
|
|
5
|
-
import { Button, Callout, CopyButton, Time } from "./ui.js";
|
|
5
|
+
import { Badge, Button, Callout, CopyButton, Time } from "./ui.js";
|
|
6
6
|
// The tokens a person holds for their agents, scripts and consoles of their own, shown as the
|
|
7
7
|
// agents that hold them: the list, the way to make one by hand, and the one just made, whose
|
|
8
8
|
// secret is shown this once. Each takes its data as props and nothing from the network.
|
|
@@ -20,12 +20,22 @@ export function dayChoices(daysAtMost) {
|
|
|
20
20
|
const within = DAY_CHOICES.filter((choice) => choice !== "never" && Number(choice) < daysAtMost);
|
|
21
21
|
return [...within, String(daysAtMost)];
|
|
22
22
|
}
|
|
23
|
+
/** What a command's version is to the console's: nothing to say when they go together, else which way they differ. */
|
|
24
|
+
function verdictOf(client, consoleVersion) {
|
|
25
|
+
const command = parseVersion(client);
|
|
26
|
+
const server = parseVersion(consoleVersion);
|
|
27
|
+
if (command === undefined || server === undefined) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
const { verdict } = judgeClient(command, server);
|
|
31
|
+
return verdict === "current" ? undefined : verdict;
|
|
32
|
+
}
|
|
23
33
|
export function TokenList(props) {
|
|
24
34
|
const words = useWords().agents;
|
|
25
35
|
if (props.tokens.length === 0) {
|
|
26
36
|
return _jsx(_Fragment, { children: props.empty ?? null });
|
|
27
37
|
}
|
|
28
|
-
return (_jsx("ul", { className: "sc-token-list", "aria-label": words.list, children: props.tokens.map((token) => (_jsxs("li", { className: "sc-token", children: [_jsxs("div", { children: [_jsx("p", { className: "sc-token-name", children: token.name }), _jsxs("p", { className: "sc-token-meta", children: [_jsxs("span", { children: [words.connected, " ", _jsx(Time, { iso: token.createdAt })] }), _jsx("span", { children: token.expiresAt === null ? (words.doesNotExpire) : (_jsxs(_Fragment, { children: [words.goodUntil, " ", _jsx(Time, { iso: token.expiresAt })] })) }), _jsx("span", { children: token.lastUsedAt === null ? (words.notActive) : (_jsxs(_Fragment, { children: [words.lastActive, " ", _jsx(Time, { iso: token.lastUsedAt })] })) })] })] }), props.onRevoke !== undefined && (_jsx(Button, { variant: "danger", size: "sm", disabled: props.busy === true, onClick: () => props.onRevoke?.(token), children: words.disconnect }))] }, token.id))) }));
|
|
38
|
+
return (_jsx("ul", { className: "sc-token-list", "aria-label": words.list, children: props.tokens.map((token) => (_jsxs("li", { className: "sc-token", children: [_jsxs("div", { children: [_jsx("p", { className: "sc-token-name", children: token.name }), _jsxs("p", { className: "sc-token-meta", children: [_jsxs("span", { children: [words.connected, " ", _jsx(Time, { iso: token.createdAt })] }), token.client !== null && (_jsxs("span", { children: [words.command(token.client), ((verdict) => verdict === undefined ? null : (_jsxs(_Fragment, { children: [" ", _jsx(Badge, { tone: verdict === "outdated" || verdict === "too_new" ? "danger" : "warning", children: words.commandVerdict[verdict] })] })))(verdictOf(token.client, props.consoleVersion))] })), _jsx("span", { children: token.expiresAt === null ? (words.doesNotExpire) : (_jsxs(_Fragment, { children: [words.goodUntil, " ", _jsx(Time, { iso: token.expiresAt })] })) }), _jsx("span", { children: token.lastUsedAt === null ? (words.notActive) : (_jsxs(_Fragment, { children: [words.lastActive, " ", _jsx(Time, { iso: token.lastUsedAt })] })) })] })] }), props.onRevoke !== undefined && (_jsx(Button, { variant: "danger", size: "sm", disabled: props.busy === true, onClick: () => props.onRevoke?.(token), children: words.disconnect }))] }, token.id))) }));
|
|
29
39
|
}
|
|
30
40
|
export function TokenForm(props) {
|
|
31
41
|
const words = useWords();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/components/tokens.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkC,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/components/tokens.tsx"],"names":[],"mappings":"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"}
|