signalk-maintenance-tracker 1.1.1 → 1.3.0
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/CHANGELOG.md +79 -0
- package/README.md +1 -1
- package/dist/api/router.js +1 -1
- package/dist/api/router.js.map +1 -1
- package/dist/domain/status.js +18 -8
- package/dist/domain/status.js.map +1 -1
- package/dist/signalk/notifications.js +3 -3
- package/dist/signalk/notifications.js.map +1 -1
- package/dist/signalk/runtime.js +9 -2
- package/dist/signalk/runtime.js.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/public/app/components/MarkdownView.js +7 -3
- package/public/app/components/StatTable.js +27 -0
- package/public/app/components/TaskFormModal.js +26 -1
- package/public/app/lib/autolink.js +136 -0
- package/public/app/lib/format.js +10 -0
- package/public/app/lib/softbreak.js +163 -0
- package/public/app/pages/TaskDetailPage.js +214 -119
- package/public/app/types.js +2 -1
- package/public/styles/main.css +63 -15
- package/public/styles/tokens.css +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,82 @@
|
|
|
1
|
+
# v1.3.0
|
|
2
|
+
|
|
3
|
+
Notes and descriptions now render the way you typed them: pasted URLs become
|
|
4
|
+
links, and line breaks stay where you put them. And the `unknown` task status
|
|
5
|
+
is now `info`.
|
|
6
|
+
|
|
7
|
+
## Highlights
|
|
8
|
+
|
|
9
|
+
- **Bare URLs in notes and descriptions become links.** Pasting a manual's URL
|
|
10
|
+
into a note used to leave dead text, since markdown only links explicit
|
|
11
|
+
`[text](url)`. Bare `http(s)://` and `www.` runs are now anchored, with the
|
|
12
|
+
hostname as the link text (a pasted tracking URL is unreadable inline) and the
|
|
13
|
+
full URL on hover. Linking runs over the already-sanitized HTML and skips text
|
|
14
|
+
inside existing links, `code` and `pre`, so it can't reintroduce a
|
|
15
|
+
`javascript:` URL.
|
|
16
|
+
- **Line breaks survive.** A note typed over several lines came out as one
|
|
17
|
+
run-on line, because a lone newline means whitespace to markdown but a line
|
|
18
|
+
break to whoever typed it into a textarea. Single newlines are now kept as
|
|
19
|
+
breaks and runs of blank lines are no longer collapsed, while fenced code
|
|
20
|
+
blocks and list spacing are left exactly as markdown intends them.
|
|
21
|
+
- **The `unknown` task status is now `info`.** A task with no intervals is a
|
|
22
|
+
plain informational record, not one whose state we failed to work out — but
|
|
23
|
+
the badge read "unknown", which sounds like something is missing. The rename
|
|
24
|
+
goes all the way through: badge, CSS tokens, API filter value, and the status
|
|
25
|
+
the notification manager declines to publish for. Precedence is unchanged:
|
|
26
|
+
`overdue` > `due_soon` > `ok` > `info`.
|
|
27
|
+
|
|
28
|
+
## Breaking changes
|
|
29
|
+
|
|
30
|
+
- `GET /tasks?status=unknown` no longer matches anything. Unrecognized filter
|
|
31
|
+
values are dropped rather than rejected, so an old caller gets an unfiltered
|
|
32
|
+
list instead of an error — pass `status=info` instead. Task status values in
|
|
33
|
+
API responses and on published SignalK paths change from `unknown` to `info`
|
|
34
|
+
as well.
|
|
35
|
+
|
|
36
|
+
## Smaller changes and fixes
|
|
37
|
+
|
|
38
|
+
- The task detail page no longer shows a "Description" heading (or a "No
|
|
39
|
+
description." placeholder) for a task that only has consumables.
|
|
40
|
+
|
|
41
|
+
# v1.2.0
|
|
42
|
+
|
|
43
|
+
A task detail page that puts the numbers you actually compare side by side,
|
|
44
|
+
plus figures for tasks that have no schedule at all.
|
|
45
|
+
|
|
46
|
+
## Highlights
|
|
47
|
+
|
|
48
|
+
- **Schedule and Runtime are now their own tabular cards.** The old prose
|
|
49
|
+
readout ("Current 1360 h · last done at 1240.5 h · due at 1440.5 h") buried
|
|
50
|
+
the numbers. Each dimension gets its own card with an Interval / Today /
|
|
51
|
+
Last / Elapsed / Next / Remaining table — current reading above the
|
|
52
|
+
last-service one, elapsed as their difference right below — with the
|
|
53
|
+
progress bar under the table and the remaining figure colored by status.
|
|
54
|
+
Rows that don't apply simply fall away, and the runtime card disappears
|
|
55
|
+
entirely for tasks that don't track runtime.
|
|
56
|
+
- **Interval-less tasks now show their figures too.** "Last done" and "hours
|
|
57
|
+
since" only ever needed a logged completion, not an interval, so a purely
|
|
58
|
+
informational task now reports how long (and how many engine hours) it has
|
|
59
|
+
been since it was last serviced. The new `elapsed_time_ms` field is on the
|
|
60
|
+
task API alongside `elapsed_runtime`.
|
|
61
|
+
- **The task edit form explains its read-only fields.** Last maintenance and
|
|
62
|
+
runtime-at-last-maintenance are shown with a note that they come from the
|
|
63
|
+
task's most recent log entry, and that **Mark complete** (or editing the log)
|
|
64
|
+
is how you change them.
|
|
65
|
+
|
|
66
|
+
## Smaller changes and fixes
|
|
67
|
+
|
|
68
|
+
- Runtime subscriptions now throttle with `minPeriod` instead of `period`.
|
|
69
|
+
Pairing `period` with policy `instant` made the SignalK server log a warning
|
|
70
|
+
and ignore the throttle; each path is now limited to one delta per 5s as
|
|
71
|
+
intended.
|
|
72
|
+
- Tags moved from the description card into the task's title bar, and the
|
|
73
|
+
description card is dropped entirely when a task has neither a description
|
|
74
|
+
nor consumables.
|
|
75
|
+
- Log notes are muted wherever the log is rendered, so they read as annotation
|
|
76
|
+
rather than data.
|
|
77
|
+
- Danger and success buttons use the theme's accent text color instead of a
|
|
78
|
+
hardcoded white, which was low-contrast in some MFD themes.
|
|
79
|
+
|
|
1
80
|
# v1.1.1
|
|
2
81
|
|
|
3
82
|
A small release with one important fix for your SD card's lifespan.
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ else that comes due by engine hours, by calendar time, or both.
|
|
|
11
11
|
(days/weeks/months/years). Add a one-time calendar due date for a one-off
|
|
12
12
|
job, or leave every interval blank to keep a plain informational record.
|
|
13
13
|
- **Status tracking** — each task is `overdue`, `due soon`, `ok`, or
|
|
14
|
-
`
|
|
14
|
+
`info`; the task list sorts most-urgent first. Any task can override the
|
|
15
15
|
plugin-wide "due soon" lead windows with its own runtime-hours and
|
|
16
16
|
calendar-days thresholds.
|
|
17
17
|
- **Maintenance log** — per-task history plus a master log across all tasks,
|
package/dist/api/router.js
CHANGED
|
@@ -163,7 +163,7 @@ function parseTaskListQuery(req) {
|
|
|
163
163
|
return {
|
|
164
164
|
search: str(req.query.search),
|
|
165
165
|
tags: csv(req.query.tags),
|
|
166
|
-
status: csv(req.query.status)?.filter((s) => ['overdue', 'due_soon', 'ok', '
|
|
166
|
+
status: csv(req.query.status)?.filter((s) => ['overdue', 'due_soon', 'ok', 'info'].includes(s)),
|
|
167
167
|
sort: pickEnum(req.query.sort, [
|
|
168
168
|
'name',
|
|
169
169
|
'remaining_runtime',
|
package/dist/api/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/status.js
CHANGED
|
@@ -35,7 +35,7 @@ function addMonths(d, n) {
|
|
|
35
35
|
}
|
|
36
36
|
function mostUrgent(statuses) {
|
|
37
37
|
if (statuses.length === 0)
|
|
38
|
-
return '
|
|
38
|
+
return 'info';
|
|
39
39
|
return statuses.reduce((a, b) => (types_1.STATUS_RANK[a] <= types_1.STATUS_RANK[b] ? a : b));
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
@@ -54,6 +54,7 @@ function computeTask(task, currentRuntime, now, cfg) {
|
|
|
54
54
|
due_runtime_at: null,
|
|
55
55
|
runtime_fraction: null,
|
|
56
56
|
runtime_status: null,
|
|
57
|
+
elapsed_time_ms: null,
|
|
57
58
|
scheduled_due_date: null,
|
|
58
59
|
scheduled_remaining_ms: null,
|
|
59
60
|
scheduled_fraction: null,
|
|
@@ -64,16 +65,25 @@ function computeTask(task, currentRuntime, now, cfg) {
|
|
|
64
65
|
remaining_time_ms: null,
|
|
65
66
|
time_fraction: null,
|
|
66
67
|
time_status: null,
|
|
67
|
-
status: '
|
|
68
|
-
status_rank: types_1.STATUS_RANK.
|
|
68
|
+
status: 'info',
|
|
69
|
+
status_rank: types_1.STATUS_RANK.info,
|
|
69
70
|
urgency: -Infinity,
|
|
70
71
|
};
|
|
72
|
+
// Elapsed-since-last-service figures stand on their own: they need only a
|
|
73
|
+
// logged completion (plus, for runtime, a live reading), not an interval. A
|
|
74
|
+
// task with no schedule at all still shows "last done X, N hours since".
|
|
75
|
+
if (task.last_runtime != null && currentRuntime != null) {
|
|
76
|
+
out.elapsed_runtime = currentRuntime - task.last_runtime;
|
|
77
|
+
}
|
|
78
|
+
if (task.last_maintenance != null) {
|
|
79
|
+
out.elapsed_time_ms =
|
|
80
|
+
now.getTime() - new Date(task.last_maintenance).getTime();
|
|
81
|
+
}
|
|
71
82
|
// Runtime dimension: configured when both interval and path are set.
|
|
72
83
|
if (task.runtime_interval != null && task.runtime_path != null) {
|
|
73
84
|
if (task.last_runtime != null && currentRuntime != null) {
|
|
74
85
|
const elapsed = currentRuntime - task.last_runtime;
|
|
75
86
|
const remaining = task.runtime_interval - elapsed;
|
|
76
|
-
out.elapsed_runtime = elapsed;
|
|
77
87
|
out.remaining_runtime = remaining;
|
|
78
88
|
out.due_runtime_at = task.last_runtime + task.runtime_interval;
|
|
79
89
|
out.runtime_fraction = elapsed / task.runtime_interval;
|
|
@@ -85,7 +95,7 @@ function computeTask(task, currentRuntime, now, cfg) {
|
|
|
85
95
|
: 'ok';
|
|
86
96
|
}
|
|
87
97
|
else {
|
|
88
|
-
out.runtime_status = '
|
|
98
|
+
out.runtime_status = 'info';
|
|
89
99
|
}
|
|
90
100
|
}
|
|
91
101
|
// Recurring time-interval dimension: configured when magnitude + unit are set.
|
|
@@ -100,7 +110,7 @@ function computeTask(task, currentRuntime, now, cfg) {
|
|
|
100
110
|
out.scheduled_status = dateStatus(out.scheduled_remaining_ms, timeLead);
|
|
101
111
|
}
|
|
102
112
|
else {
|
|
103
|
-
out.scheduled_status = '
|
|
113
|
+
out.scheduled_status = 'info';
|
|
104
114
|
}
|
|
105
115
|
}
|
|
106
116
|
// One-time due-date dimension: the stored deadline. Fraction runs from task
|
|
@@ -115,8 +125,8 @@ function computeTask(task, currentRuntime, now, cfg) {
|
|
|
115
125
|
}
|
|
116
126
|
// Merged "time" dimension = the more urgent of the two: whichever has the
|
|
117
127
|
// lower remaining drives remaining_time_ms + time_fraction; time_status is
|
|
118
|
-
// the most-urgent of the sub-statuses (so a configured-but-
|
|
119
|
-
// dimension still surfaces as
|
|
128
|
+
// the most-urgent of the sub-statuses (so a configured-but-uncomputable
|
|
129
|
+
// recurring dimension still surfaces as info).
|
|
120
130
|
const timeSubs = [
|
|
121
131
|
{ remaining: out.scheduled_remaining_ms, fraction: out.scheduled_fraction },
|
|
122
132
|
{ remaining: out.due_date_remaining_ms, fraction: out.due_date_fraction },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/domain/status.ts"],"names":[],"mappings":";;AAoBA,kCAcC;AAuBD,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/domain/status.ts"],"names":[],"mappings":";;AAoBA,kCAcC;AAuBD,kCAyIC;AAlMD,oCAMkB;AAOlB,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B;;;;GAIG;AACH,SAAgB,WAAW,CAAC,GAAW,EAAE,CAAS,EAAE,IAAc;IAChE,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;YACjC,OAAO,CAAC,CAAC;QACX,KAAK,OAAO;YACV,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,CAAO,EAAE,CAAS;IACnC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,IAAI,IAAI,CAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CACrD,CAAC,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,UAAU,CAAC,QAAkB;IACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,mBAAW,CAAC,CAAC,CAAC,IAAI,mBAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,SAAgB,WAAW,CACzB,IAYC,EACD,cAA6B,EAC7B,GAAS,EACT,GAAiB;IAEjB,4EAA4E;IAC5E,6EAA6E;IAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,IAAI,GAAG,CAAC,sBAAsB,CAAC;IAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,IAAI,GAAG,CAAC,kBAAkB,CAAC;IAClE,MAAM,GAAG,GAAmB;QAC1B,eAAe,EAAE,cAAc;QAC/B,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAE,IAAI;QACvB,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,IAAI;QACrB,kBAAkB,EAAE,IAAI;QACxB,sBAAsB,EAAE,IAAI;QAC5B,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EAAE,IAAI;QACtB,qBAAqB,EAAE,IAAI;QAC3B,iBAAiB,EAAE,IAAI;QACvB,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAE,IAAI;QACvB,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,mBAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,CAAC,QAAQ;KACnB,CAAC;IAEF,0EAA0E;IAC1E,4EAA4E;IAC5E,yEAAyE;IACzE,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;QACxD,GAAG,CAAC,eAAe,GAAG,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC;IAC3D,CAAC;IACD,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC;QAClC,GAAG,CAAC,eAAe;YACjB,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9D,CAAC;IAED,qEAAqE;IACrE,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;QAC/D,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC;YACnD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;YAClD,GAAG,CAAC,iBAAiB,GAAG,SAAS,CAAC;YAClC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAC/D,GAAG,CAAC,gBAAgB,GAAG,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACvD,GAAG,CAAC,cAAc;gBAChB,SAAS,IAAI,CAAC;oBACZ,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,SAAS,IAAI,WAAW;wBACxB,CAAC,CAAC,UAAU;wBACZ,CAAC,CAAC,IAAI,CAAC;QACf,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,cAAc,GAAG,MAAM,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,EAAE,CAAC;QAClE,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC;YACvD,MAAM,GAAG,GAAG,WAAW,CACrB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,kBAAkB,CACxB,CAAC,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,kBAAkB,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YACrD,GAAG,CAAC,sBAAsB,GAAG,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;YACxB,GAAG,CAAC,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,GAAG,CAAC,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAChC,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,4EAA4E;IAC5E,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9C,GAAG,CAAC,qBAAqB,GAAG,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;QACzB,GAAG,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,GAAG,CAAC,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,wEAAwE;IACxE,+CAA+C;IAC/C,MAAM,QAAQ,GAAG;QACf,EAAE,SAAS,EAAE,GAAG,CAAC,sBAAsB,EAAE,QAAQ,EAAE,GAAG,CAAC,kBAAkB,EAAE;QAC3E,EAAE,SAAS,EAAE,GAAG,CAAC,qBAAqB,EAAE,QAAQ,EAAE,GAAG,CAAC,iBAAiB,EAAE;KAC1E,CAAC,MAAM,CAAC,CAAC,CAAC,EAAuD,EAAE,CAClE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAmB,CAAC,CACvC,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACnC,CAAC;QACF,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;QAC1C,GAAG,CAAC,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;IACvC,CAAC;IACD,GAAG,CAAC,WAAW,GAAG,gBAAgB,CAAC;QACjC,GAAG,CAAC,gBAAgB;QACpB,GAAG,CAAC,eAAe;KACpB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CACvD,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,IAAI,IAAI,CAC9B,CAAC;IACF,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG,CAAC,WAAW,GAAG,mBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAChE,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,IAAI,IAAI,CAC9B,CAAC;IACF,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACpE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;oEACoE;AACpE,SAAS,UAAU,CAAC,WAAmB,EAAE,QAAgB;IACvD,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,IAAI,WAAW,IAAI,QAAQ,GAAG,UAAU;QAAE,OAAO,UAAU,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,SAAS,gBAAgB,CAAC,QAA2B;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC"}
|
|
@@ -27,7 +27,7 @@ class NotificationManager {
|
|
|
27
27
|
case 'overdue':
|
|
28
28
|
return this.opts.alarmStateOverdue;
|
|
29
29
|
default:
|
|
30
|
-
return undefined; //
|
|
30
|
+
return undefined; // info
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
publishAll(tasks) {
|
|
@@ -36,10 +36,10 @@ class NotificationManager {
|
|
|
36
36
|
for (const task of tasks) {
|
|
37
37
|
const state = this.stateForStatus(task.status);
|
|
38
38
|
if (!state) {
|
|
39
|
-
//
|
|
39
|
+
// info: publish nothing, but clear a previously-raised notification
|
|
40
40
|
const last = this.lastState.get(task.slug);
|
|
41
41
|
if (last && last !== 'none') {
|
|
42
|
-
this.send(task.slug, 'none', `${task.name}: status
|
|
42
|
+
this.send(task.slug, 'none', `${task.name}: status info`);
|
|
43
43
|
}
|
|
44
44
|
continue;
|
|
45
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/signalk/notifications.ts"],"names":[],"mappings":";;;AA8FA,oCA6BC;AAxHD;;;;;GAKG;AACH,MAAa,mBAAmB;IAIpB;IACA;IACA;IALF,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;IAElD,YACU,GAAQ,EACR,QAAgB,EAChB,IAMP;QARO,QAAG,GAAH,GAAG,CAAK;QACR,aAAQ,GAAR,QAAQ,CAAQ;QAChB,SAAI,GAAJ,IAAI,CAMX;IACA,CAAC;IAEI,cAAc,CAAC,MAAc;QACnC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,IAAI;gBACP,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;YAChC,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACrC,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACrC;gBACE,OAAO,SAAS,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/signalk/notifications.ts"],"names":[],"mappings":"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"}
|
package/dist/signalk/runtime.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RuntimeManager = exports.FLUSH_INTERVAL_MS = void 0;
|
|
3
|
+
exports.RuntimeManager = exports.SUBSCRIBE_MIN_PERIOD_MS = exports.FLUSH_INTERVAL_MS = void 0;
|
|
4
4
|
/** Floor between runtime_cache commits — deltas can arrive many times per
|
|
5
5
|
* second, and persisting each one hammers the disk. */
|
|
6
6
|
exports.FLUSH_INTERVAL_MS = 60_000;
|
|
7
|
+
/** Throttle applied to each subscribed path (policy 'instant'): the first
|
|
8
|
+
* delta arrives immediately, then at most one per interval. */
|
|
9
|
+
exports.SUBSCRIBE_MIN_PERIOD_MS = 5000;
|
|
7
10
|
/**
|
|
8
11
|
* Subscribes to the union of all task runtime paths on vessels.self, keeps an
|
|
9
12
|
* in-memory map of the latest value, and persists it to runtime_cache so
|
|
@@ -65,7 +68,11 @@ class RuntimeManager {
|
|
|
65
68
|
context: 'vessels.self',
|
|
66
69
|
subscribe: next.map((path) => ({
|
|
67
70
|
path,
|
|
68
|
-
period
|
|
71
|
+
// minPeriod (not period) is the throttle that goes with policy
|
|
72
|
+
// 'instant' — period implies policy 'fixed' and the server logs a
|
|
73
|
+
// warning if both are given. Runtime hours creep upward slowly, so
|
|
74
|
+
// one delta per SUBSCRIBE_MIN_PERIOD_MS per path is plenty.
|
|
75
|
+
minPeriod: exports.SUBSCRIBE_MIN_PERIOD_MS,
|
|
69
76
|
policy: 'instant',
|
|
70
77
|
})),
|
|
71
78
|
}, this.unsubscribes, (err) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/signalk/runtime.ts"],"names":[],"mappings":";;;AAEA;uDACuD;AAC1C,QAAA,iBAAiB,GAAG,MAAM,CAAC;AAExC;;;;;;;;;;GAUG;AACH,MAAa,cAAc;IAUf;IACA;IACA;IAXF,MAAM,GAAG,IAAI,GAAG,EAAgD,CAAC;IACjE,KAAK,GAAa,EAAE,CAAC;IACrB,YAAY,GAAmB,EAAE,CAAC;IAClC,SAAS,GAAmB,EAAE,CAAC;IAC/B,UAAU,GAAkB,IAAI,CAAC;IACjC,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1B,UAAU,GAA0B,IAAI,CAAC;IAEjD,YACU,GAAQ,EACR,EAAgB,EAChB,kBAA0B,yBAAiB;QAF3C,QAAG,GAAH,GAAG,CAAK;QACR,OAAE,GAAF,EAAE,CAAc;QAChB,oBAAe,GAAf,eAAe,CAA4B;QAEnD,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAEO,SAAS;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,kDAAkD,CAAC;aAC3D,GAAG,EAAqE,CAAC;QAC5E,KAAK,MAAM,CAAC,IAAI,IAAI;YAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,iEAAiE;IACjE,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;IAC9C,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,EAAc;QACrB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,0EAA0E;IAC1E,QAAQ,CAAC,KAAe;QACtB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO;QACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,CACpC;YACE,OAAO,EAAE,cAAc;YACvB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI;gBACJ,
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/signalk/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAe,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAI9D,QAAA,WAAW,GAA2B;IACjD,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,EAAE,EAAE,CAAC;IACL,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAe,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAI9D,QAAA,WAAW,GAA2B;IACjD,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,EAAE,EAAE,CAAC;IACL,IAAI,EAAE,CAAC;CACR,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The single place raw HTML is set (§7.8):
|
|
3
|
-
* dangerouslySetInnerHTML. Nothing else may
|
|
2
|
+
* The single place raw HTML is set (§7.8): mark blank lines → snarkdown →
|
|
3
|
+
* sanitize → autolink → soft breaks → dangerouslySetInnerHTML. Nothing else may
|
|
4
|
+
* set raw HTML.
|
|
4
5
|
*/
|
|
5
6
|
import snarkdown from '../../vendor/snarkdown.js';
|
|
7
|
+
import { autolinkHtml } from '../lib/autolink.js';
|
|
6
8
|
import { html } from '../lib/html.js';
|
|
7
9
|
import { sanitizeHtml } from '../lib/sanitize.js';
|
|
10
|
+
import { keepBlankLines, softBreakHtml } from '../lib/softbreak.js';
|
|
8
11
|
|
|
9
12
|
/** @param {{ markdown: string|null|undefined }} props */
|
|
10
13
|
export function MarkdownView(props) {
|
|
11
14
|
if (!props.markdown) return null;
|
|
12
|
-
const
|
|
15
|
+
const rendered = snarkdown(keepBlankLines(props.markdown));
|
|
16
|
+
const clean = softBreakHtml(autolinkHtml(sanitizeHtml(rendered)));
|
|
13
17
|
return html`<div
|
|
14
18
|
class="markdown"
|
|
15
19
|
dangerouslySetInnerHTML=${{ __html: clean }}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { html } from '../lib/html.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Label/value readout for the task detail page's Schedule and Runtime cards
|
|
5
|
+
* (§7.4). Rows whose value is null are dropped, so a caller can list every
|
|
6
|
+
* field its dimension could have and let the inapplicable ones fall away.
|
|
7
|
+
*
|
|
8
|
+
* @param {{ rows: { label: string, value: any }[] }} props
|
|
9
|
+
*/
|
|
10
|
+
export function StatTable(props) {
|
|
11
|
+
const rows = props.rows.filter((r) => r.value !== null);
|
|
12
|
+
if (!rows.length) return null;
|
|
13
|
+
return html`
|
|
14
|
+
<table class="stat-table">
|
|
15
|
+
<tbody>
|
|
16
|
+
${rows.map(
|
|
17
|
+
(r) => html`
|
|
18
|
+
<tr key=${r.label}>
|
|
19
|
+
<th scope="row">${r.label}</th>
|
|
20
|
+
<td>${r.value}</td>
|
|
21
|
+
</tr>
|
|
22
|
+
`,
|
|
23
|
+
)}
|
|
24
|
+
</tbody>
|
|
25
|
+
</table>
|
|
26
|
+
`;
|
|
27
|
+
}
|
|
@@ -13,6 +13,7 @@ import { ConsumablesPicker } from './ConsumablesPicker.js';
|
|
|
13
13
|
import { PathPicker } from './PathPicker.js';
|
|
14
14
|
import { createTask, updateTask, useTags, useHealth } from '../api/hooks.js';
|
|
15
15
|
import { slugify } from '../lib/slug.js';
|
|
16
|
+
import { formatDate, formatHours } from '../lib/format.js';
|
|
16
17
|
import { toast } from '../lib/toasts.js';
|
|
17
18
|
|
|
18
19
|
/** @typedef {import('../types.js').TaskDTO} TaskDTO */
|
|
@@ -421,7 +422,31 @@ export function TaskFormModal(props) {
|
|
|
421
422
|
</div>
|
|
422
423
|
</div>
|
|
423
424
|
`
|
|
424
|
-
:
|
|
425
|
+
: html`
|
|
426
|
+
<div class="field-row">
|
|
427
|
+
<div class="field">
|
|
428
|
+
<label class="field-label">Last maintenance</label>
|
|
429
|
+
<div class="input input-static">
|
|
430
|
+
${formatDate(task.last_maintenance)}
|
|
431
|
+
</div>
|
|
432
|
+
</div>
|
|
433
|
+
<div class="field">
|
|
434
|
+
<label class="field-label"
|
|
435
|
+
>Runtime at last maintenance</label
|
|
436
|
+
>
|
|
437
|
+
<div class="input input-static">
|
|
438
|
+
${formatHours(task.last_runtime)}
|
|
439
|
+
</div>
|
|
440
|
+
</div>
|
|
441
|
+
</div>
|
|
442
|
+
<div class="field-hint" style="margin-top:-10px">
|
|
443
|
+
<i class="bi bi-info-circle" /> These come from the task's
|
|
444
|
+
most recent log entry, so they aren't editable here. Use${' '}
|
|
445
|
+
<strong>Mark complete</strong>${' '}
|
|
446
|
+
to record work — it accepts a past date and runtime — or edit
|
|
447
|
+
the latest entry in the maintenance log to correct them.
|
|
448
|
+
</div>
|
|
449
|
+
`
|
|
425
450
|
}
|
|
426
451
|
</form>
|
|
427
452
|
<//>
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bare-URL autolinking for markdown output (§7.8). snarkdown only links
|
|
3
|
+
* explicit [text](url), so a note that just pastes a URL renders as dead text.
|
|
4
|
+
* This turns http(s):// and www. runs in the text into anchors.
|
|
5
|
+
*
|
|
6
|
+
* Runs *after* sanitizeHtml() on already-clean HTML: every href here is built
|
|
7
|
+
* from a match that must start with http://, https:// or www., so this pass
|
|
8
|
+
* cannot reintroduce a javascript: URL. Text inside existing links and inside
|
|
9
|
+
* code is left alone. Only <MarkdownView/> consumes this.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** Bare URL run: everything up to whitespace or a tag; trimmed below. */
|
|
13
|
+
const URL_RE = /(?:https?:\/\/|www\.)[^\s<]+/gi;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Elements whose text must not be linkified.
|
|
17
|
+
* @type {Record<string, boolean>}
|
|
18
|
+
*/
|
|
19
|
+
const SKIP_TAGS = {
|
|
20
|
+
A: true,
|
|
21
|
+
CODE: true,
|
|
22
|
+
PRE: true,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Sentence punctuation that follows a URL far more often than it ends one. */
|
|
26
|
+
const TRAILING = '.,;:!?\'"';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {string} clean sanitized HTML from sanitizeHtml()
|
|
30
|
+
* @returns {string} the same HTML with bare URLs wrapped in anchors
|
|
31
|
+
*/
|
|
32
|
+
export function autolinkHtml(clean) {
|
|
33
|
+
const doc = new DOMParser().parseFromString(clean, 'text/html');
|
|
34
|
+
autolinkNode(doc.body);
|
|
35
|
+
return doc.body.innerHTML;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** @param {Node} parent */
|
|
39
|
+
function autolinkNode(parent) {
|
|
40
|
+
// Snapshot: linkifying replaces text nodes with fragments as we walk.
|
|
41
|
+
const children = Array.prototype.slice.call(parent.childNodes);
|
|
42
|
+
for (let i = 0; i < children.length; i++) {
|
|
43
|
+
const node = children[i];
|
|
44
|
+
if (node.nodeType === 3) {
|
|
45
|
+
linkifyText(/** @type {Text} */ (node));
|
|
46
|
+
} else if (
|
|
47
|
+
node.nodeType === 1 &&
|
|
48
|
+
!SKIP_TAGS[/** @type {Element} */ (node).tagName]
|
|
49
|
+
) {
|
|
50
|
+
autolinkNode(node);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Replace one text node with its text plus <a> elements for any URLs in it.
|
|
57
|
+
* @param {Text} node
|
|
58
|
+
*/
|
|
59
|
+
function linkifyText(node) {
|
|
60
|
+
const text = node.nodeValue || '';
|
|
61
|
+
const doc = node.ownerDocument;
|
|
62
|
+
if (!doc) return;
|
|
63
|
+
let frag = null;
|
|
64
|
+
let last = 0;
|
|
65
|
+
let match;
|
|
66
|
+
URL_RE.lastIndex = 0;
|
|
67
|
+
while ((match = URL_RE.exec(text)) !== null) {
|
|
68
|
+
const url = trimTrailing(match[0]);
|
|
69
|
+
// Resume after what we kept, so trimmed punctuation stays plain text.
|
|
70
|
+
URL_RE.lastIndex = match.index + url.length;
|
|
71
|
+
if (!url) continue;
|
|
72
|
+
if (!frag) frag = doc.createDocumentFragment();
|
|
73
|
+
if (match.index > last) {
|
|
74
|
+
frag.appendChild(doc.createTextNode(text.slice(last, match.index)));
|
|
75
|
+
}
|
|
76
|
+
const href = url.indexOf('www.') === 0 ? 'https://' + url : url;
|
|
77
|
+
const a = doc.createElement('a');
|
|
78
|
+
a.setAttribute('href', href);
|
|
79
|
+
// The host is the readable part; the full URL stays on hover.
|
|
80
|
+
a.setAttribute('title', href);
|
|
81
|
+
a.textContent = hostnameOf(href) || url;
|
|
82
|
+
frag.appendChild(a);
|
|
83
|
+
last = match.index + url.length;
|
|
84
|
+
}
|
|
85
|
+
if (!frag) return;
|
|
86
|
+
if (last < text.length) {
|
|
87
|
+
frag.appendChild(doc.createTextNode(text.slice(last)));
|
|
88
|
+
}
|
|
89
|
+
node.parentNode && node.parentNode.replaceChild(frag, node);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The host is what identifies a link to a reader; a pasted path is usually
|
|
94
|
+
* noise ("example.com" beats a 90-character tracking URL). Returns '' if the
|
|
95
|
+
* URL will not parse, and the caller falls back to showing it whole.
|
|
96
|
+
*
|
|
97
|
+
* @param {string} href
|
|
98
|
+
* @returns {string}
|
|
99
|
+
*/
|
|
100
|
+
function hostnameOf(href) {
|
|
101
|
+
try {
|
|
102
|
+
return new URL(href).hostname;
|
|
103
|
+
} catch (_e) {
|
|
104
|
+
return '';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Drop punctuation a sentence left on the end of a URL: "see https://x.com."
|
|
110
|
+
* A closing paren only counts as the URL's when the URL opened one, so both
|
|
111
|
+
* "(see https://x.com)" and "https://x.com/a_(b)" come out right.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} url
|
|
114
|
+
* @returns {string}
|
|
115
|
+
*/
|
|
116
|
+
function trimTrailing(url) {
|
|
117
|
+
let end = url.length;
|
|
118
|
+
while (end > 0) {
|
|
119
|
+
const ch = url.charAt(end - 1);
|
|
120
|
+
if (TRAILING.indexOf(ch) !== -1) {
|
|
121
|
+
end--;
|
|
122
|
+
} else if (ch === ')' && closesMoreThanOpens(url.slice(0, end))) {
|
|
123
|
+
end--;
|
|
124
|
+
} else {
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return url.slice(0, end);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** @param {string} s */
|
|
132
|
+
function closesMoreThanOpens(s) {
|
|
133
|
+
const opens = s.match(/\(/g);
|
|
134
|
+
const closes = s.match(/\)/g);
|
|
135
|
+
return (closes ? closes.length : 0) > (opens ? opens.length : 0);
|
|
136
|
+
}
|
package/public/app/lib/format.js
CHANGED
|
@@ -62,6 +62,16 @@ export function formatRemainingTime(ms) {
|
|
|
62
62
|
return humanizeMs(ms);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
/**
|
|
66
|
+
* Elapsed span since something happened: "3 days". Negative spans (a
|
|
67
|
+
* future-dated log entry) read as "in 3 days".
|
|
68
|
+
* @param {number|null|undefined} ms
|
|
69
|
+
*/
|
|
70
|
+
export function formatElapsedTime(ms) {
|
|
71
|
+
if (ms === null || ms === undefined) return '—';
|
|
72
|
+
return ms < 0 ? 'in ' + humanizeMs(-ms) : humanizeMs(ms);
|
|
73
|
+
}
|
|
74
|
+
|
|
65
75
|
/**
|
|
66
76
|
* Value for <input type="date">: today (local) by default, or the UTC date
|
|
67
77
|
* part of a stored ISO string. The YYYY-MM-DD value is sent to the API as-is
|