@umriss-ui/schedule 0.41.0 → 0.42.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 +30 -3
- package/README.md +17 -11
- package/dist/schedule.js +1 -1
- package/docs/llms-full.md +858 -918
- package/package.json +10 -9
package/docs/llms-full.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# @umriss-ui/schedule 0.
|
|
1
|
+
# @umriss-ui/schedule 0.42.0
|
|
2
2
|
|
|
3
3
|
> React Gantt-style schedule for data-dense applications - work on lanes over time, with dependencies, blocked time, findings and controlled editing.
|
|
4
4
|
|
|
5
|
-
Install with `npm install @umriss-ui/schedule @umriss-ui/core @umriss-ui/charts`. This text is generated from the package's demo
|
|
5
|
+
Install with `npm install @umriss-ui/schedule @umriss-ui/core @umriss-ui/charts`. This text is generated from the package's demo: every page with its import line, its examples - the source exactly as it runs, with the package name where the demo imports its own source - its props tables generated from the code, and what it deliberately does not do.
|
|
6
6
|
|
|
7
7
|
## Scenarios
|
|
8
8
|
|
|
@@ -913,13 +913,11 @@ import { useSchedule } from "@umriss-ui/schedule";
|
|
|
913
913
|
npm install @umriss-ui/schedule @umriss-ui/core @umriss-ui/charts
|
|
914
914
|
```
|
|
915
915
|
|
|
916
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/installation/
|
|
917
|
-
|
|
918
916
|
The command brings its two peers along: core for the formats and the wording, charts for the time scale and the operating calendar ([ADR-0022](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0022-the-schedule-is-a-package-that-depends-on-core-and-charts.md)). React 19 or newer is a peer as well and stays the application's own. The stylesheets load themselves - each package's script imports its own, so there is nothing to import by hand; `@umriss-ui/schedule/styles.css` stays exported for setups that link stylesheets themselves.
|
|
919
917
|
|
|
920
918
|
The plan is plain data ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)). A lane is a person, a vehicle or a room, declared in JSX by its id. A task is an id, a colour and a name; a subtask is a main time on one lane, belonging to a task, with an optional lead-in and lead-out; a dependency joins two subtasks of one task with a lag. Times are epoch milliseconds.
|
|
921
919
|
|
|
922
|
-
The schedule reports, the application decides. It draws the data it is given and changes none of it: a drag ends in an intent reported to `onIntent`, and only the application's own state update moves a bar. Without `intents` the schedule is read-only - see [Move and lane](
|
|
920
|
+
The schedule reports, the application decides. It draws the data it is given and changes none of it: a drag ends in an intent reported to `onIntent`, and only the application's own state update moves a bar. Without `intents` the schedule is read-only - see [Move and lane](#move-and-lane).
|
|
923
921
|
|
|
924
922
|
#### Examples
|
|
925
923
|
|
|
@@ -958,83 +956,83 @@ export default function SmallestSchedule() {
|
|
|
958
956
|
|
|
959
957
|
#### Keyboard
|
|
960
958
|
|
|
961
|
-
The keys of [First schedule](
|
|
959
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
962
960
|
|
|
963
961
|
#### Props on this page
|
|
964
962
|
|
|
965
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
963
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
966
964
|
|
|
967
965
|
| Prop | Type | Default | Description |
|
|
968
966
|
|---|---|---|---|
|
|
969
|
-
| [`height`](
|
|
970
|
-
| [`children`](
|
|
967
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
968
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
971
969
|
|
|
972
970
|
###### Accessibility
|
|
973
971
|
|
|
974
972
|
| Prop | Type | Default | Description |
|
|
975
973
|
|---|---|---|---|
|
|
976
|
-
| [`ariaLabel`](
|
|
974
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
977
975
|
|
|
978
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
976
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
979
977
|
|
|
980
978
|
| Prop | Type | Default | Description |
|
|
981
979
|
|---|---|---|---|
|
|
982
|
-
| [`id`](
|
|
983
|
-
| [`label`](
|
|
980
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
981
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
984
982
|
|
|
985
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
983
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
986
984
|
|
|
987
985
|
| Prop | Type | Default | Description |
|
|
988
986
|
|---|---|---|---|
|
|
989
|
-
| [`data`](
|
|
990
|
-
| [`tasks`](
|
|
987
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
988
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
991
989
|
|
|
992
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
990
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
993
991
|
|
|
994
992
|
| Prop | Type | Default | Description |
|
|
995
993
|
|---|---|---|---|
|
|
996
|
-
| [`id`](
|
|
997
|
-
| [`task`](
|
|
998
|
-
| [`lane`](
|
|
999
|
-
| [`from`](
|
|
1000
|
-
| [`to`](
|
|
1001
|
-
| [`leadIn`](
|
|
1002
|
-
| [`leadOut`](
|
|
994
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
995
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
996
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
997
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
998
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
999
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
1000
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
1003
1001
|
|
|
1004
|
-
From `Task` — the full table stands on [Subtasks](
|
|
1002
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
1005
1003
|
|
|
1006
1004
|
| Prop | Type | Default | Description |
|
|
1007
1005
|
|---|---|---|---|
|
|
1008
|
-
| [`id`](
|
|
1009
|
-
| [`color`](
|
|
1010
|
-
| [`name`](
|
|
1006
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
1007
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
1008
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
1011
1009
|
|
|
1012
|
-
From `DependenciesProps` — the full table stands on [Dependencies](
|
|
1010
|
+
From `DependenciesProps` — the full table stands on [Dependencies](#dependencies).
|
|
1013
1011
|
|
|
1014
1012
|
| Prop | Type | Default | Description |
|
|
1015
1013
|
|---|---|---|---|
|
|
1016
|
-
| [`data`](
|
|
1014
|
+
| [`data`](#dependencies) *required* | `readonly `[`Dependency`](#dependencies)`[]` | — | The dependencies, as the caller holds them. |
|
|
1017
1015
|
|
|
1018
|
-
From `Dependency` — the full table stands on [Dependencies](
|
|
1016
|
+
From `Dependency` — the full table stands on [Dependencies](#dependencies).
|
|
1019
1017
|
|
|
1020
1018
|
| Prop | Type | Default | Description |
|
|
1021
1019
|
|---|---|---|---|
|
|
1022
|
-
| [`id`](
|
|
1023
|
-
| [`from`](
|
|
1024
|
-
| [`to`](
|
|
1025
|
-
| [`lag`](
|
|
1020
|
+
| [`id`](#dependencies) *required* | `string` | — | The caller's identity of the dependency. |
|
|
1021
|
+
| [`from`](#dependencies) *required* | `string` | — | The id of the subtask it leaves. |
|
|
1022
|
+
| [`to`](#dependencies) *required* | `string` | — | The id of the subtask it arrives at. |
|
|
1023
|
+
| [`lag`](#dependencies) *required* | `number` | — | The least time between the two anchors; zero where the successor may begin as soon as the predecessor ends. |
|
|
1026
1024
|
|
|
1027
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
1025
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
1028
1026
|
|
|
1029
1027
|
| Prop | Type | Default | Description |
|
|
1030
1028
|
|---|---|---|---|
|
|
1031
|
-
| [`initialView`](
|
|
1029
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
1032
1030
|
|
|
1033
|
-
From `ScheduleView` — the full table stands on [View](
|
|
1031
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
1034
1032
|
|
|
1035
1033
|
| Prop | Type | Default | Description |
|
|
1036
1034
|
|---|---|---|---|
|
|
1037
|
-
| [`domain`](
|
|
1035
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
1038
1036
|
|
|
1039
1037
|
### First schedule
|
|
1040
1038
|
|
|
@@ -1044,11 +1042,9 @@ Work on lanes over time, with a day band above and time ticks that follow the zo
|
|
|
1044
1042
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
1045
1043
|
```
|
|
1046
1044
|
|
|
1047
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/schedule/
|
|
1048
|
-
|
|
1049
1045
|
Lanes stand in the order they are declared; a subtask on a lane that is not declared is not drawn. Declare `Dependencies` before `Subtasks` and its lines run beneath the bars.
|
|
1050
1046
|
|
|
1051
|
-
What cannot work is drawn, never repaired: two subtasks on one lane at once, a dependency whose lag does not fit, work in blocked time. [Findings as data](
|
|
1047
|
+
What cannot work is drawn, never repaired: two subtasks on one lane at once, a dependency whose lag does not fit, work in blocked time. [Findings as data](#findings-as-data) returns the same list for the application to act on.
|
|
1052
1048
|
|
|
1053
1049
|
The plot is one tab stop. The keys walk the subtasks as the pointer would hover them, the tooltip names the active one, and a live region reads it once the keys rest ([ADR-0030](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0030-a-chart-is-one-tab-stop-that-walks-its-hits.md), [ADR-0033](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0033-the-schedules-keys-walk-past-the-view.md)).
|
|
1054
1050
|
|
|
@@ -1268,7 +1264,7 @@ export default function MachinePlan() {
|
|
|
1268
1264
|
|
|
1269
1265
|
The schedule is a figure named by `ariaLabel`, and its plot one tab stop with the role `application`, read as "schedule" (`aria-roledescription`), named alike and described by a summary: the lanes, the subtasks in view, the visible span, the findings by kind, then the keys. The canvas is hidden from a reader; the lane headers are text, and a group's fold button is named "Fold group" or "Unfold group" with the group's label. `ariaLabel` is required - name what the plan shows, "Plan of week 38".
|
|
1270
1266
|
|
|
1271
|
-
When a key comes to rest, a polite live region beside the plot reads the active subtask: its lane, task and name, the day and the times, and every finding on it by name - an overlap, a dependency short by how much, blocked time. On a dependency it reads the task, the lag and where the line runs. A pointer announces nothing; [Findings as data](
|
|
1267
|
+
When a key comes to rest, a polite live region beside the plot reads the active subtask: its lane, task and name, the day and the times, and every finding on it by name - an overlap, a dependency short by how much, blocked time. On a dependency it reads the task, the lag and where the line runs. A pointer announces nothing; [Findings as data](#findings-as-data) gives the application the same findings to list. The words are core's wording, so under `@umriss-ui/core/wording/de` the plot is read as "Belegungsplan".
|
|
1272
1268
|
|
|
1273
1269
|
Under forced colours the plot paints itself in the system colours: the work in the text colour, told apart by lane and label; the active subtask in the selection colour; findings marked by a dash; grips and the ghost's label outlined. With reduced motion a group's chevron turns without its movement.
|
|
1274
1270
|
|
|
@@ -1278,38 +1274,38 @@ Under forced colours the plot paints itself in the system colours: the work in t
|
|
|
1278
1274
|
|
|
1279
1275
|
| Prop | Type | Default | Description |
|
|
1280
1276
|
|---|---|---|---|
|
|
1281
|
-
| `ref` | `Ref
|
|
1282
|
-
| `height` | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's.<br>Shown in: [A day of tours](
|
|
1283
|
-
| `laneHeight` | `number` | `44` | Height of one lane in pixels at the default font size of 16 px; the schedule multiplies it by the root font size over 16 px when that ratio is above 1, so lane names keep their room in a reader's larger font.<br>Shown in: [Scroll more lanes than fit (Lanes)](
|
|
1284
|
-
| `headerWidth` | `number` | `160` | Width of the lane headers in pixels - at most 40 % of the schedule, so that on a phone the plot keeps the larger part.<br>Shown in: [What a lane header says (Lanes)](
|
|
1285
|
-
| `calendar` |
|
|
1286
|
-
| `zoomLimits` |
|
|
1287
|
-
| `snap` | `"ticks" \| number \|
|
|
1288
|
-
| `intents` | `readonly
|
|
1289
|
-
| `canMoveTo` | `(subtask: `[`Subtask`](
|
|
1290
|
-
| `selectedTask` | `string \| null` | — | The selected task, controlled. Leave it out and the schedule keeps the selection itself.<br>Shown in: [Control the selection (Selection)](
|
|
1291
|
-
| `onSelectedTaskChange` | `(task: string \| null, subtask: string \| null) => void` | — | Called when a click selects a task or clears the selection, with the subtask that was clicked - null where the click was on a dependency or on nothing. It is called again when another subtask of the same task is clicked.<br>Shown in: [Control the selection (Selection)](
|
|
1292
|
-
| `placing` |
|
|
1293
|
-
| `route` |
|
|
1294
|
-
| `attach` |
|
|
1295
|
-
| `ends` |
|
|
1296
|
-
| `label` | `(subtask: `[`Subtask`](
|
|
1297
|
-
| `tooltip` | `false \| ((target: `[`ScheduleTooltipTarget`](
|
|
1298
|
-
| `now` | `boolean \| number` | `false` | A line marking the present across the lanes: `true` follows the clock by the minute, an instant fixes it there.<br>Shown in: [Plan a day in the machine shop](
|
|
1299
|
-
| `children` | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn.<br>Shown in: [A day of tours](
|
|
1277
|
+
| `ref` | `Ref<``ScheduleHandle``>` | — | Receives the `ScheduleHandle` - not an element.<br>Shown in: [Place a mark of your own (The handle)](#the-handle) |
|
|
1278
|
+
| `height` | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's.<br>Shown in: [A day of tours](#first-schedule), [Start from an empty plan](#first-schedule), [Plan a day in the machine shop](#first-schedule) and 78 more |
|
|
1279
|
+
| `laneHeight` | `number` | `44` | Height of one lane in pixels at the default font size of 16 px; the schedule multiplies it by the root font size over 16 px when that ratio is above 1, so lane names keep their room in a reader's larger font.<br>Shown in: [Scroll more lanes than fit (Lanes)](#lanes), [Measure a plan (Benchmark)](#benchmark) |
|
|
1280
|
+
| `headerWidth` | `number` | `160` | Width of the lane headers in pixels - at most 40 % of the schedule, so that on a phone the plot keeps the larger part.<br>Shown in: [What a lane header says (Lanes)](#lanes), [Scroll more lanes than fit (Lanes)](#lanes), [Group lanes under a head (Lane groups)](#lane-groups) and 1 more |
|
|
1281
|
+
| `calendar` | `CalendarInput` | `[]` | A working calendar: the intervals in which time counts. Nights and weekends outside them are cut out of the axis. Without intervals every hour counts, as on the wall clock.<br>Shown in: [Cut the nights out of the axis (Time axis and calendar)](#time-axis-and-calendar), [Plan in office hours only (Time axis and calendar)](#time-axis-and-calendar), [Plan the sprint around leave (Scenarios)](#plan-the-sprint-around-leave) |
|
|
1282
|
+
| `zoomLimits` | `ZoomLimits` | one hour to 28 days | The narrowest and widest time span zoom may reach, in milliseconds.<br>Shown in: [Move through the plan (Pan and zoom)](#pan-and-zoom) |
|
|
1283
|
+
| `snap` | `"ticks" \| number \| ``SnapRaster`` \| false` | `"ticks"` | The raster a drag lands on: `"ticks"` - the fine band's current step -, a step in milliseconds from local midnight, a step with an offset (shifts at 06:00, 14:00 and 22:00 are eight hours offset by six), or `false` for none. It shapes the ghost and the intent, never the data.<br>Shown in: [Snap to a duration (Snapping)](#snapping), [Snap to handover times (Snapping)](#snapping), [Place without snapping (Snapping)](#snapping) |
|
|
1284
|
+
| `intents` | `readonly ``IntentKind``[]` | `[]` | The intents the caller handles. Each one enables its interaction; none leaves a read-only schedule ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)).<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Cut the nights out of the axis (Time axis and calendar)](#time-axis-and-calendar), [Plan work around someone's leave (Blocked time)](#blocked-time) and 18 more |
|
|
1285
|
+
| `canMoveTo` | `(subtask: `[`Subtask`](#subtasks)`, lane: string) => boolean` | every lane is open | Whether a subtask may go to a lane. It narrows `"lane"`, it does not enable it. Asked once per lane when a drag takes hold, and asked again at the drop. The lanes it turns down are marked from the first frame of the drag - a planner sees the refusal before meeting it - and over one of them the ghost stays on the last lane that was allowed, the cursor says no and a line ties the ghost to the pointer. A refused lane costs the lane and nothing else: a drop after it still reports the move in time. It is asked for work dragged in from outside as well, with the key and task the application declared in `placing`.<br>Shown in: [Keep work on the lanes that fit (Where a subtask may go)](#where-a-subtask-may-go), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go), [Keep work out of someone's leave (Where a subtask may go)](#where-a-subtask-may-go) and 1 more |
|
|
1286
|
+
| `selectedTask` | `string \| null` | — | The selected task, controlled. Leave it out and the schedule keeps the selection itself.<br>Shown in: [Control the selection (Selection)](#selection) |
|
|
1287
|
+
| `onSelectedTaskChange` | `(task: string \| null, subtask: string \| null) => void` | — | Called when a click selects a task or clears the selection, with the subtask that was clicked - null where the click was on a dependency or on nothing. It is called again when another subtask of the same task is clicked.<br>Shown in: [Control the selection (Selection)](#selection) |
|
|
1288
|
+
| `placing` | `PlacingItem`` \| null` | — | What the application is dragging in from outside while it drags it - its key, task, the length of its main time, its lead-in and lead-out. The browser hands the dragged data over only on the drop, so the ghost before it can only come from here: set it on your own `dragstart`, clear it on `dragend`. Without `"place"` in `intents` no drop is accepted.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go) |
|
|
1289
|
+
| `route` | `DependencyRoute`<br>`"curve" \| "straight" \| "orthogonal"` | `"curve"` | How the dependencies are drawn: a `"curve"` that leaves and arrives forwards, a `"straight"` line, or `"orthogonal"` segments. A dependency may say otherwise for itself.<br>Shown in: [Straight (Routes)](#routes), [Orthogonal (Routes)](#routes), [Per dependency (Routes)](#routes) |
|
|
1290
|
+
| `attach` | `DependencyAttachment`<br>`"centre" \| "nearest"` | `"centre"` | Where a dependency's ends sit on their bars: the `"centre"` of both, or the `"nearest"` edge - which is the shortest line between two stops. Within one lane both mean the middle. A dependency may say otherwise for itself. It changes the picture and never a finding: whether a dependency is violated follows from its `leaves` and `arrives` alone.<br>Shown in: [Choose where a line touches its bars (Dependencies)](#dependencies), [Mark the ends with a dot (Dependencies)](#dependencies), [Draw one handover its own way (Dependencies)](#dependencies) and 3 more |
|
|
1291
|
+
| `ends` | `DependencyEnds`<br>`"dot" \| "none"` | `"dot"` | Whether a dependency's two ends carry a dot (`"dot"`) or the line stands alone (`"none"`). The dot says where the line is anchored - a help while a plan is being read, and noise in a plan full of short moves. A dependency may say otherwise for itself.<br>Shown in: [Mark the ends with a dot (Dependencies)](#dependencies), [Draw one handover its own way (Dependencies)](#dependencies) |
|
|
1292
|
+
| `label` | `(subtask: `[`Subtask`](#subtasks)`) => string` | — | What stands written in a bar: a function from a subtask to a line of text, or nothing for bars without text. The text is cut off with an ellipsis where the bar is too narrow for it and left out where even that would say nothing; a bar that began before the view keeps its text at the view's edge.<br>Shown in: [Plan a day in the machine shop](#first-schedule), [Plan a sprint for a team (Subtasks)](#subtasks), [Write into the bars (Bar labels)](#bar-labels) and 7 more |
|
|
1293
|
+
| `tooltip` | `false \| ((target: `[`ScheduleTooltipTarget`](#tooltip)`) => ReactNode)` | — | The tooltip on a hovered subtask or dependency: its order, its times, its parts and its findings. `false` switches it off; a function receives what the pointer rests on and returns content of the application's own.<br>Shown in: [Say what a milestone is in your own tooltip (Milestones)](#milestones), [Write your own tooltip content (Tooltip)](#tooltip), [Show a detail panel instead (Tooltip)](#tooltip) and 1 more |
|
|
1294
|
+
| `now` | `boolean \| number` | `false` | A line marking the present across the lanes: `true` follows the clock by the minute, an instant fixes it there.<br>Shown in: [Plan a day in the machine shop](#first-schedule), [Mark the present (Now line)](#now-line), [Follow the clock (Now line)](#now-line) and 2 more |
|
|
1295
|
+
| `children` | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn.<br>Shown in: [A day of tours](#first-schedule), [Start from an empty plan](#first-schedule), [Plan a day in the machine shop](#first-schedule) and 78 more |
|
|
1300
1296
|
|
|
1301
1297
|
###### Events
|
|
1302
1298
|
|
|
1303
1299
|
| Prop | Type | Default | Description |
|
|
1304
1300
|
|---|---|---|---|
|
|
1305
|
-
| `onIntent` | `(intent:
|
|
1306
|
-
| `onInteraction` | `(interaction: `[`ScheduleInteraction`](
|
|
1301
|
+
| `onIntent` | `(intent: ``Intent``) => void` | — | Called once per intent when a drag ends. The data changes only if the caller changes it.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Cut the nights out of the axis (Time axis and calendar)](#time-axis-and-calendar), [Plan work around someone's leave (Blocked time)](#blocked-time) and 18 more |
|
|
1302
|
+
| `onInteraction` | `(interaction: `[`ScheduleInteraction`](#interactions)`) => void` | — | Click, context menu and hover, with what the pointer is on and where. While it is set, a right-click opens no browser menu.<br>Shown in: [Report what the pointer is on (Interactions)](#interactions), [Open a context menu (Interactions)](#interactions), [Show a detail panel instead (Tooltip)](#tooltip) and 3 more |
|
|
1307
1303
|
|
|
1308
1304
|
###### Accessibility
|
|
1309
1305
|
|
|
1310
1306
|
| Prop | Type | Default | Description |
|
|
1311
1307
|
|---|---|---|---|
|
|
1312
|
-
| `ariaLabel` *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38".<br>Shown in: [A day of tours](
|
|
1308
|
+
| `ariaLabel` *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38".<br>Shown in: [A day of tours](#first-schedule), [Start from an empty plan](#first-schedule), [Plan a day in the machine shop](#first-schedule) and 78 more |
|
|
1313
1309
|
|
|
1314
1310
|
###### Styling
|
|
1315
1311
|
|
|
@@ -1327,8 +1323,8 @@ point on the screen and a time on a lane. Everything else is props.
|
|
|
1327
1323
|
|
|
1328
1324
|
| Prop | Type | Default | Description |
|
|
1329
1325
|
|---|---|---|---|
|
|
1330
|
-
| `positionAt` *required* | `(clientX: number, clientY: number) => { time: number; lane: string \| null } \| null` | — | The time and the lane at a client point, or null outside the plot.<br>Shown in: [Place a mark of your own (The handle)](
|
|
1331
|
-
| `clientPointOf` *required* | `(time: number, lane?: string) => { x: number; y: number } \| null` | — | The client point of a time - on the middle of a lane where one is named - or null while the schedule is not on screen.<br>Shown in: [Place a mark of your own (The handle)](
|
|
1326
|
+
| `positionAt` *required* | `(clientX: number, clientY: number) => { time: number; lane: string \| null } \| null` | — | The time and the lane at a client point, or null outside the plot.<br>Shown in: [Place a mark of your own (The handle)](#the-handle) |
|
|
1327
|
+
| `clientPointOf` *required* | `(time: number, lane?: string) => { x: number; y: number } \| null` | — | The client point of a time - on the middle of a lane where one is named - or null while the schedule is not on screen.<br>Shown in: [Place a mark of your own (The handle)](#the-handle) |
|
|
1332
1328
|
| `visibleDomain` *required* | `() => readonly [number, number]` | — | The visible span, as two wall-clock instants. |
|
|
1333
1329
|
|
|
1334
1330
|
###### `CalendarInput`
|
|
@@ -1348,8 +1344,8 @@ The narrowest and the widest span zoom may reach.
|
|
|
1348
1344
|
|
|
1349
1345
|
| Prop | Type | Default | Description |
|
|
1350
1346
|
|---|---|---|---|
|
|
1351
|
-
| `min` *required* | `number` | — | <br>Shown in: [Move through the plan (Pan and zoom)](
|
|
1352
|
-
| `max` *required* | `number` | — | <br>Shown in: [Move through the plan (Pan and zoom)](
|
|
1347
|
+
| `min` *required* | `number` | — | <br>Shown in: [Move through the plan (Pan and zoom)](#pan-and-zoom) |
|
|
1348
|
+
| `max` *required* | `number` | — | <br>Shown in: [Move through the plan (Pan and zoom)](#pan-and-zoom) |
|
|
1353
1349
|
|
|
1354
1350
|
###### `SnapRaster`
|
|
1355
1351
|
|
|
@@ -1357,8 +1353,8 @@ A raster: a step, and where it starts after local midnight.
|
|
|
1357
1353
|
|
|
1358
1354
|
| Prop | Type | Default | Description |
|
|
1359
1355
|
|---|---|---|---|
|
|
1360
|
-
| `step` *required* | `number` | — | The distance between two lines of the raster, in milliseconds.<br>Shown in: [Snap to handover times (Snapping)](
|
|
1361
|
-
| `offset` *required* | `number` | — | Where the raster starts after local midnight, in milliseconds: six hours for handovers at 06:00, 14:00 and 22:00.<br>Shown in: [Snap to handover times (Snapping)](
|
|
1356
|
+
| `step` *required* | `number` | — | The distance between two lines of the raster, in milliseconds.<br>Shown in: [Snap to handover times (Snapping)](#snapping) |
|
|
1357
|
+
| `offset` *required* | `number` | — | Where the raster starts after local midnight, in milliseconds: six hours for handovers at 06:00, 14:00 and 22:00.<br>Shown in: [Snap to handover times (Snapping)](#snapping) |
|
|
1362
1358
|
|
|
1363
1359
|
###### `IntentKind`
|
|
1364
1360
|
|
|
@@ -1376,9 +1372,9 @@ the drop can only come from the caller.
|
|
|
1376
1372
|
|
|
1377
1373
|
| Prop | Type | Default | Description |
|
|
1378
1374
|
|---|---|---|---|
|
|
1379
|
-
| `item` *required* | `string` | — | The caller's key for the dragged item; it comes back in the intent.<br>Shown in: [Drag work in from the backlog (Placing from outside)](
|
|
1380
|
-
| `task` *required* | `string` | — | The task the work belongs to.<br>Shown in: [Drag work in from the backlog (Placing from outside)](
|
|
1381
|
-
| `duration` *required* | `number` | — | How long its main time is.<br>Shown in: [Drag work in from the backlog (Placing from outside)](
|
|
1375
|
+
| `item` *required* | `string` | — | The caller's key for the dragged item; it comes back in the intent.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go) |
|
|
1376
|
+
| `task` *required* | `string` | — | The task the work belongs to.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go) |
|
|
1377
|
+
| `duration` *required* | `number` | — | How long its main time is.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go) |
|
|
1382
1378
|
| `leadIn` | `number` | — | The lead-in it brings. |
|
|
1383
1379
|
| `leadOut` | `number` | — | The lead-out it brings. |
|
|
1384
1380
|
|
|
@@ -1439,7 +1435,7 @@ thing about the frame.
|
|
|
1439
1435
|
|
|
1440
1436
|
| Prop | Type | Default | Description |
|
|
1441
1437
|
|---|---|---|---|
|
|
1442
|
-
| `intervals` *required* | `readonly
|
|
1438
|
+
| `intervals` *required* | `readonly ``WorkingInterval``[]` | — | |
|
|
1443
1439
|
| `offsets` *required* | `readonly number[]` | — | Working time accumulated before the respective interval begins. |
|
|
1444
1440
|
| `total` *required* | `number` | — | The whole working time - the axis' extent is [0, total]. |
|
|
1445
1441
|
|
|
@@ -1461,10 +1457,10 @@ Move the subtask in time: the main time keeps its length.
|
|
|
1461
1457
|
|
|
1462
1458
|
| Prop | Type | Default | Description |
|
|
1463
1459
|
|---|---|---|---|
|
|
1464
|
-
| `kind` *required* | `"move"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
1465
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](
|
|
1466
|
-
| `from` *required* | `number` | — | The new start of the main time.<br>Shown in: [Push the later stops of a tour (Ripple)](
|
|
1467
|
-
| `to` *required* | `number` | — | The new end of the main time.<br>Shown in: [Push the later stops of a tour (Ripple)](
|
|
1460
|
+
| `kind` *required* | `"move"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 8 more |
|
|
1461
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 5 more |
|
|
1462
|
+
| `from` *required* | `number` | — | The new start of the main time.<br>Shown in: [Push the later stops of a tour (Ripple)](#ripple), [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
1463
|
+
| `to` *required* | `number` | — | The new end of the main time.<br>Shown in: [Push the later stops of a tour (Ripple)](#ripple), [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
1468
1464
|
|
|
1469
1465
|
###### `StretchIntent`
|
|
1470
1466
|
|
|
@@ -1472,8 +1468,8 @@ Stretch the main time at one or both of its edges.
|
|
|
1472
1468
|
|
|
1473
1469
|
| Prop | Type | Default | Description |
|
|
1474
1470
|
|---|---|---|---|
|
|
1475
|
-
| `kind` *required* | `"stretch"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
1476
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](
|
|
1471
|
+
| `kind` *required* | `"stretch"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 7 more |
|
|
1472
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 4 more |
|
|
1477
1473
|
| `from` *required* | `number` | — | The new start of the main time. |
|
|
1478
1474
|
| `to` *required* | `number` | — | The new end of the main time. |
|
|
1479
1475
|
|
|
@@ -1483,9 +1479,9 @@ Change the lead-in on its own.
|
|
|
1483
1479
|
|
|
1484
1480
|
| Prop | Type | Default | Description |
|
|
1485
1481
|
|---|---|---|---|
|
|
1486
|
-
| `kind` *required* | `"leadIn"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
1487
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](
|
|
1488
|
-
| `leadIn` *required* | `number` | — | The new duration of the lead-in.<br>Shown in: [Replan the day on the line (Scenarios)](
|
|
1482
|
+
| `kind` *required* | `"leadIn"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 7 more |
|
|
1483
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 4 more |
|
|
1484
|
+
| `leadIn` *required* | `number` | — | The new duration of the lead-in.<br>Shown in: [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
1489
1485
|
|
|
1490
1486
|
###### `LeadOutIntent`
|
|
1491
1487
|
|
|
@@ -1493,8 +1489,8 @@ Change the lead-out on its own.
|
|
|
1493
1489
|
|
|
1494
1490
|
| Prop | Type | Default | Description |
|
|
1495
1491
|
|---|---|---|---|
|
|
1496
|
-
| `kind` *required* | `"leadOut"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
1497
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](
|
|
1492
|
+
| `kind` *required* | `"leadOut"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 7 more |
|
|
1493
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 4 more |
|
|
1498
1494
|
| `leadOut` *required* | `number` | — | The new duration of the lead-out. |
|
|
1499
1495
|
|
|
1500
1496
|
###### `LaneIntent`
|
|
@@ -1503,8 +1499,8 @@ Put the subtask on another lane.
|
|
|
1503
1499
|
|
|
1504
1500
|
| Prop | Type | Default | Description |
|
|
1505
1501
|
|---|---|---|---|
|
|
1506
|
-
| `kind` *required* | `"lane"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
1507
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](
|
|
1502
|
+
| `kind` *required* | `"lane"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 7 more |
|
|
1503
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 4 more |
|
|
1508
1504
|
| `lane` *required* | `string` | — | The id of the new lane. |
|
|
1509
1505
|
|
|
1510
1506
|
###### `PlaceIntent`
|
|
@@ -1516,10 +1512,10 @@ no subtask yet; the caller creates one, with its own identity, from
|
|
|
1516
1512
|
|
|
1517
1513
|
| Prop | Type | Default | Description |
|
|
1518
1514
|
|---|---|---|---|
|
|
1519
|
-
| `kind` *required* | `"place"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
1520
|
-
| `item` *required* | `string` | — | The caller's key for the dragged item, as it declared it while dragging.<br>Shown in: [Drag work in from the backlog (Placing from outside)](
|
|
1515
|
+
| `kind` *required* | `"place"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 7 more |
|
|
1516
|
+
| `item` *required* | `string` | — | The caller's key for the dragged item, as it declared it while dragging.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go), [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
1521
1517
|
| `task` *required* | `string` | — | The task the work belongs to. |
|
|
1522
|
-
| `lane` *required* | `string` | — | The lane it was dropped on.<br>Shown in: [Drag work in from the backlog (Placing from outside)](
|
|
1518
|
+
| `lane` *required* | `string` | — | The lane it was dropped on.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go) |
|
|
1523
1519
|
| `from` *required* | `number` | — | Where its main time would start. |
|
|
1524
1520
|
| `to` *required* | `number` | — | Where its main time would end. |
|
|
1525
1521
|
| `leadIn` | `number` | — | The lead-in it was declared with. |
|
|
@@ -1527,11 +1523,11 @@ no subtask yet; the caller creates one, with its own identity, from
|
|
|
1527
1523
|
|
|
1528
1524
|
#### Known limits
|
|
1529
1525
|
|
|
1530
|
-
- No dependency types, critical path or auto-scheduling: the application decides where work goes, the schedule shows the result and its findings ([ADR-0032](https://
|
|
1526
|
+
- No dependency types, critical path or auto-scheduling: the application decides where work goes, the schedule shows the result and its findings ([ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md)).
|
|
1531
1527
|
- No milestones yet: a point in time on a lane has no mark of its own.
|
|
1532
1528
|
- A dependency joins two subtasks of one task; dependencies across tasks are not yet possible.
|
|
1533
1529
|
|
|
1534
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
1530
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
1535
1531
|
|
|
1536
1532
|
## Plan
|
|
1537
1533
|
|
|
@@ -1545,11 +1541,9 @@ One row per person, vehicle or room, named by its header and kept in the order i
|
|
|
1545
1541
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
1546
1542
|
```
|
|
1547
1543
|
|
|
1548
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/lane/
|
|
1549
|
-
|
|
1550
1544
|
A lane is declared by its id, the one subtasks name, and a label. The label is content, not a string: a name with a plate number, a status beside it. It is real text, read by a screen reader, and it stays at the left edge while the plot pans.
|
|
1551
1545
|
|
|
1552
|
-
A lane keeps its height whatever lies on it. Nothing is moved to another lane to make room: two subtasks on one lane at once are a finding (see [Overlap](
|
|
1546
|
+
A lane keeps its height whatever lies on it. Nothing is moved to another lane to make room: two subtasks on one lane at once are a finding (see [Overlap](#overlap)).
|
|
1553
1547
|
|
|
1554
1548
|
#### Examples
|
|
1555
1549
|
|
|
@@ -1658,7 +1652,7 @@ export default function ManyLanes() {
|
|
|
1658
1652
|
|
|
1659
1653
|
#### Keyboard
|
|
1660
1654
|
|
|
1661
|
-
The keys of [First schedule](
|
|
1655
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
1662
1656
|
|
|
1663
1657
|
#### API
|
|
1664
1658
|
|
|
@@ -1666,8 +1660,8 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
|
|
|
1666
1660
|
|
|
1667
1661
|
| Prop | Type | Default | Description |
|
|
1668
1662
|
|---|---|---|---|
|
|
1669
|
-
| `id` *required* | `string` | — | The identity subtasks name in their `lane`.<br>Shown in: [What a lane header says](
|
|
1670
|
-
| `label` | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader.<br>Shown in: [What a lane header says](
|
|
1663
|
+
| `id` *required* | `string` | — | The identity subtasks name in their `lane`.<br>Shown in: [What a lane header says](#lanes), [Scroll more lanes than fit](#lanes), [The smallest schedule (Installation)](#installation) and 78 more |
|
|
1664
|
+
| `label` | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader.<br>Shown in: [What a lane header says](#lanes), [Scroll more lanes than fit](#lanes), [The smallest schedule (Installation)](#installation) and 77 more |
|
|
1671
1665
|
|
|
1672
1666
|
### Lane groups
|
|
1673
1667
|
|
|
@@ -1677,13 +1671,11 @@ Teams, depots or regions over the lanes, to any depth, folded into one row when
|
|
|
1677
1671
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
1678
1672
|
```
|
|
1679
1673
|
|
|
1680
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/
|
|
1681
|
-
|
|
1682
1674
|
A group is structure, never a lane: nothing sits on it, no finding is reported for it and no intent names it ([ADR-0025](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0025-a-lane-group-is-structure-over-lanes-never-a-lane.md)). The lanes keep the order they were declared in, whatever group they are in.
|
|
1683
1675
|
|
|
1684
1676
|
Folded, a group shows a miniature: every lane in it as a thin strip with its work in the tasks' colours. Dependencies still arrive at the right strip, findings are marked on the row, and a strip can be hovered and selected. Labels, appearances and grips need room and wait for the group to open.
|
|
1685
1677
|
|
|
1686
|
-
Folding is part of the schedule's view and never an intent: `folded` in `initialView` starts with groups folded, `toggleGroup`, `foldAll` and `unfoldAll` fold from outside, and `onViewChange` reports every fold the planner makes - see [View](
|
|
1678
|
+
Folding is part of the schedule's view and never an intent: `folded` in `initialView` starts with groups folded, `toggleGroup`, `foldAll` and `unfoldAll` fold from outside, and `onViewChange` reports every fold the planner makes - see [View](#view).
|
|
1687
1679
|
|
|
1688
1680
|
#### Examples
|
|
1689
1681
|
|
|
@@ -1961,7 +1953,7 @@ export default function StartWithGroupsFolded() {
|
|
|
1961
1953
|
| `Tab` | Reaches each group's fold button - the only buttons the schedule puts in the tab order. |
|
|
1962
1954
|
| `Enter / Space` | Folds or unfolds the group. |
|
|
1963
1955
|
|
|
1964
|
-
The keys of [First schedule](
|
|
1956
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
1965
1957
|
|
|
1966
1958
|
#### API
|
|
1967
1959
|
|
|
@@ -1969,15 +1961,15 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
|
|
|
1969
1961
|
|
|
1970
1962
|
| Prop | Type | Default | Description |
|
|
1971
1963
|
|---|---|---|---|
|
|
1972
|
-
| `id` *required* | `string` | — | The group's identity - what the view's `folded` names. It is never a lane: no subtask sits on it, no finding is reported for it, and no intent names it ([ADR-0025](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0025-a-lane-group-is-structure-over-lanes-never-a-lane.md)).<br>Shown in: [Group lanes under a head](
|
|
1973
|
-
| `label` | `ReactNode` | `id` | What the group's header says - the team, the depot, the region. Real text, read by a screen reader.<br>Shown in: [Group lanes under a head](
|
|
1974
|
-
| `children` | `ReactNode` | — | `Lane`s and further `LaneGroup`s, to any depth.<br>Shown in: [Group lanes under a head](
|
|
1964
|
+
| `id` *required* | `string` | — | The group's identity - what the view's `folded` names. It is never a lane: no subtask sits on it, no finding is reported for it, and no intent names it ([ADR-0025](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0025-a-lane-group-is-structure-over-lanes-never-a-lane.md)).<br>Shown in: [Group lanes under a head](#lane-groups), [Nest groups to any depth](#lane-groups), [Fold groups from outside](#lane-groups) and 5 more |
|
|
1965
|
+
| `label` | `ReactNode` | `id` | What the group's header says - the team, the depot, the region. Real text, read by a screen reader.<br>Shown in: [Group lanes under a head](#lane-groups), [Nest groups to any depth](#lane-groups), [Fold groups from outside](#lane-groups) and 5 more |
|
|
1966
|
+
| `children` | `ReactNode` | — | `Lane`s and further `LaneGroup`s, to any depth.<br>Shown in: [Group lanes under a head](#lane-groups), [Nest groups to any depth](#lane-groups), [Fold groups from outside](#lane-groups) and 5 more |
|
|
1975
1967
|
|
|
1976
1968
|
#### Known limits
|
|
1977
1969
|
|
|
1978
1970
|
- A folded group shows no summary - no utilisation band, no bar spanning its work: a computed claim would look like a drawn fact ([ADR-0025](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0025-a-lane-group-is-structure-over-lanes-never-a-lane.md)).
|
|
1979
1971
|
|
|
1980
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
1972
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
1981
1973
|
|
|
1982
1974
|
### Subtasks
|
|
1983
1975
|
|
|
@@ -1987,8 +1979,6 @@ The bars: a main time with an optional lead-in before it and lead-out after it,
|
|
|
1987
1979
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
1988
1980
|
```
|
|
1989
1981
|
|
|
1990
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/subtasks/
|
|
1991
|
-
|
|
1992
1982
|
Lead-in and lead-out are durations beside the main time, not times of their own: moving the subtask takes them along. They are drawn faint in the task's colour, so preparation reads as belonging to the work and as not being it, and they occupy the lane as the main time does.
|
|
1993
1983
|
|
|
1994
1984
|
#### Examples
|
|
@@ -2171,7 +2161,7 @@ export default function ASprint() {
|
|
|
2171
2161
|
|
|
2172
2162
|
#### Keyboard
|
|
2173
2163
|
|
|
2174
|
-
The keys of [First schedule](
|
|
2164
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
2175
2165
|
|
|
2176
2166
|
#### API
|
|
2177
2167
|
|
|
@@ -2179,31 +2169,31 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
|
|
|
2179
2169
|
|
|
2180
2170
|
| Prop | Type | Default | Description |
|
|
2181
2171
|
|---|---|---|---|
|
|
2182
|
-
| `data` *required* | `readonly
|
|
2183
|
-
| `tasks` *required* | `readonly
|
|
2172
|
+
| `data` *required* | `readonly ``Subtask``[]` | — | The subtasks, as the caller holds them. The schedule never changes one.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [Colour by what the task means](#subtasks), [Plan a sprint for a team](#subtasks) and 78 more |
|
|
2173
|
+
| `tasks` *required* | `readonly ``Task``[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [Colour by what the task means](#subtasks), [Plan a sprint for a team](#subtasks) and 78 more |
|
|
2184
2174
|
|
|
2185
2175
|
##### `Subtask`
|
|
2186
2176
|
|
|
2187
2177
|
| Prop | Type | Default | Description |
|
|
2188
2178
|
|---|---|---|---|
|
|
2189
|
-
| `id` *required* | `string` | — | The caller's identity of the subtask.<br>Shown in: [Main time, lead-in and lead-out](
|
|
2190
|
-
| `task` *required* | `string` | — | The id of the task it belongs to.<br>Shown in: [Main time, lead-in and lead-out](
|
|
2191
|
-
| `lane` *required* | `string` | — | The id of the lane it sits on.<br>Shown in: [Main time, lead-in and lead-out](
|
|
2192
|
-
| `from` *required* | `number` | — | Start of the main time.<br>Shown in: [Main time, lead-in and lead-out](
|
|
2193
|
-
| `to` *required* | `number` | — | End of the main time.<br>Shown in: [Main time, lead-in and lead-out](
|
|
2194
|
-
| `leadIn` | `number` | — | Duration of the lead-in before the main time; none is zero.<br>Shown in: [Main time, lead-in and lead-out](
|
|
2195
|
-
| `leadOut` | `number` | — | Duration of the lead-out after the main time; none is zero.<br>Shown in: [Main time, lead-in and lead-out](
|
|
2196
|
-
| `name` | `string` | — | What the subtask is called, where the schedule names it.<br>Shown in: [Plan a sprint for a team](
|
|
2197
|
-
| `appearance` | `readonly
|
|
2198
|
-
| `progress` | `number` | — | The share of the work that is done, from 0 to 1, drawn as a filled part of the bar. Without it nothing is claimed - an empty bar and a bar at zero per cent are two different statements.<br>Shown in: [Progress (Appearances)](
|
|
2179
|
+
| `id` *required* | `string` | — | The caller's identity of the subtask.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [Colour by what the task means](#subtasks), [Plan a sprint for a team](#subtasks) and 75 more |
|
|
2180
|
+
| `task` *required* | `string` | — | The id of the task it belongs to.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [Colour by what the task means](#subtasks), [The smallest schedule (Installation)](#installation) and 71 more |
|
|
2181
|
+
| `lane` *required* | `string` | — | The id of the lane it sits on.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [Colour by what the task means](#subtasks), [The smallest schedule (Installation)](#installation) and 71 more |
|
|
2182
|
+
| `from` *required* | `number` | — | Start of the main time.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [Colour by what the task means](#subtasks), [The smallest schedule (Installation)](#installation) and 71 more |
|
|
2183
|
+
| `to` *required* | `number` | — | End of the main time.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [Colour by what the task means](#subtasks), [The smallest schedule (Installation)](#installation) and 71 more |
|
|
2184
|
+
| `leadIn` | `number` | — | Duration of the lead-in before the main time; none is zero.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [The smallest schedule (Installation)](#installation), [A day of tours (First schedule)](#first-schedule) and 25 more |
|
|
2185
|
+
| `leadOut` | `number` | — | Duration of the lead-out after the main time; none is zero.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [The smallest schedule (Installation)](#installation), [A day of tours (First schedule)](#first-schedule) and 22 more |
|
|
2186
|
+
| `name` | `string` | — | What the subtask is called, where the schedule names it.<br>Shown in: [Plan a sprint for a team](#subtasks), [Write into the bars (Bar labels)](#bar-labels), [Join the stops of a tour (Dependencies)](#dependencies) and 28 more |
|
|
2187
|
+
| `appearance` | `readonly ``SubtaskAppearance``[]` | — | What the bar says besides its colour: `"provisional"`, `"fixed"`, `"muted"`, `"open"`. Several hold at once; `"provisional"` and `"fixed"` contradict, and the later one in the list wins.<br>Shown in: [Plan a sprint for a team](#subtasks), [Provisional (Appearances)](#appearances), [Fixed (Appearances)](#appearances) and 3 more |
|
|
2188
|
+
| `progress` | `number` | — | The share of the work that is done, from 0 to 1, drawn as a filled part of the bar. Without it nothing is claimed - an empty bar and a bar at zero per cent are two different statements.<br>Shown in: [Progress (Appearances)](#appearances), [Several at once (Appearances)](#appearances) |
|
|
2199
2189
|
|
|
2200
2190
|
##### `Task`
|
|
2201
2191
|
|
|
2202
2192
|
| Prop | Type | Default | Description |
|
|
2203
2193
|
|---|---|---|---|
|
|
2204
|
-
| `id` *required* | `string` | — | The caller's identity of the task.<br>Shown in: [Main time, lead-in and lead-out](
|
|
2205
|
-
| `color` *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean.<br>Shown in: [Main time, lead-in and lead-out](
|
|
2206
|
-
| `name` | `string` | — | What the task is called, where the schedule names it.<br>Shown in: [Main time, lead-in and lead-out](
|
|
2194
|
+
| `id` *required* | `string` | — | The caller's identity of the task.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [Colour by what the task means](#subtasks), [The smallest schedule (Installation)](#installation) and 70 more |
|
|
2195
|
+
| `color` *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [Colour by what the task means](#subtasks), [The smallest schedule (Installation)](#installation) and 70 more |
|
|
2196
|
+
| `name` | `string` | — | What the task is called, where the schedule names it.<br>Shown in: [Main time, lead-in and lead-out](#subtasks), [Colour by what the task means](#subtasks), [The smallest schedule (Installation)](#installation) and 70 more |
|
|
2207
2197
|
|
|
2208
2198
|
##### Types on this page
|
|
2209
2199
|
|
|
@@ -2223,8 +2213,6 @@ A line of text inside each bar: cut off where the bar is too narrow, left out wh
|
|
|
2223
2213
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
2224
2214
|
```
|
|
2225
2215
|
|
|
2226
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/bar-labels/
|
|
2227
|
-
|
|
2228
2216
|
The text lies on the main time, not on the lead-in. Its colour follows the bar: light text on a dark bar, dark text on a pale one, measured by contrast in either theme.
|
|
2229
2217
|
|
|
2230
2218
|
#### Examples
|
|
@@ -2283,70 +2271,70 @@ export default function BarLabels() {
|
|
|
2283
2271
|
|
|
2284
2272
|
#### Keyboard
|
|
2285
2273
|
|
|
2286
|
-
The keys of [First schedule](
|
|
2274
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
2287
2275
|
|
|
2288
2276
|
#### Props on this page
|
|
2289
2277
|
|
|
2290
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
2278
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
2291
2279
|
|
|
2292
2280
|
| Prop | Type | Default | Description |
|
|
2293
2281
|
|---|---|---|---|
|
|
2294
|
-
| [`height`](
|
|
2295
|
-
| [`label`](
|
|
2296
|
-
| [`children`](
|
|
2282
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
2283
|
+
| [`label`](#first-schedule) | `(subtask: `[`Subtask`](#subtasks)`) => string` | — | What stands written in a bar: a function from a subtask to a line of text, or nothing for bars without text. The text is cut off with an ellipsis where the bar is too narrow for it and left out where even that would say nothing; a bar that began before the view keeps its text at the view's edge. |
|
|
2284
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
2297
2285
|
|
|
2298
2286
|
###### Accessibility
|
|
2299
2287
|
|
|
2300
2288
|
| Prop | Type | Default | Description |
|
|
2301
2289
|
|---|---|---|---|
|
|
2302
|
-
| [`ariaLabel`](
|
|
2290
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
2303
2291
|
|
|
2304
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
2292
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
2305
2293
|
|
|
2306
2294
|
| Prop | Type | Default | Description |
|
|
2307
2295
|
|---|---|---|---|
|
|
2308
|
-
| [`id`](
|
|
2309
|
-
| [`label`](
|
|
2296
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
2297
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
2310
2298
|
|
|
2311
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
2299
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
2312
2300
|
|
|
2313
2301
|
| Prop | Type | Default | Description |
|
|
2314
2302
|
|---|---|---|---|
|
|
2315
|
-
| [`data`](
|
|
2316
|
-
| [`tasks`](
|
|
2303
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
2304
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
2317
2305
|
|
|
2318
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
2306
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
2319
2307
|
|
|
2320
2308
|
| Prop | Type | Default | Description |
|
|
2321
2309
|
|---|---|---|---|
|
|
2322
|
-
| [`id`](
|
|
2323
|
-
| [`task`](
|
|
2324
|
-
| [`lane`](
|
|
2325
|
-
| [`from`](
|
|
2326
|
-
| [`to`](
|
|
2327
|
-
| [`leadIn`](
|
|
2328
|
-
| [`leadOut`](
|
|
2329
|
-
| [`name`](
|
|
2310
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
2311
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
2312
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
2313
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
2314
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
2315
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
2316
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
2317
|
+
| [`name`](#subtasks) | `string` | — | What the subtask is called, where the schedule names it. |
|
|
2330
2318
|
|
|
2331
|
-
From `Task` — the full table stands on [Subtasks](
|
|
2319
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
2332
2320
|
|
|
2333
2321
|
| Prop | Type | Default | Description |
|
|
2334
2322
|
|---|---|---|---|
|
|
2335
|
-
| [`id`](
|
|
2336
|
-
| [`color`](
|
|
2337
|
-
| [`name`](
|
|
2323
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
2324
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
2325
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
2338
2326
|
|
|
2339
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
2327
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
2340
2328
|
|
|
2341
2329
|
| Prop | Type | Default | Description |
|
|
2342
2330
|
|---|---|---|---|
|
|
2343
|
-
| [`initialView`](
|
|
2331
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
2344
2332
|
|
|
2345
|
-
From `ScheduleView` — the full table stands on [View](
|
|
2333
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
2346
2334
|
|
|
2347
2335
|
| Prop | Type | Default | Description |
|
|
2348
2336
|
|---|---|---|---|
|
|
2349
|
-
| [`domain`](
|
|
2337
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
2350
2338
|
|
|
2351
2339
|
### Appearances
|
|
2352
2340
|
|
|
@@ -2356,11 +2344,9 @@ What a bar says besides its colour: provisional, fixed, muted, running on past t
|
|
|
2356
2344
|
import { useSchedule, resolveAppearance } from "@umriss-ui/schedule";
|
|
2357
2345
|
```
|
|
2358
2346
|
|
|
2359
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/appearances/
|
|
2360
|
-
|
|
2361
2347
|
`"provisional"` owns the fill (none at all), `"fixed"` the ends (a cap inside each), `"muted"` the saturation, `"open"` a fade at the edge of the view, and `progress` a rail inside the main time. The faint, outlined fill belongs to a lead-in and a lead-out and to nothing else.
|
|
2362
2348
|
|
|
2363
|
-
`"provisional"` and `"fixed"` contradict, and the later one in the list wins. [`resolveAppearance`](
|
|
2349
|
+
`"provisional"` and `"fixed"` contradict, and the later one in the list wins. [`resolveAppearance`](#api-index-1) is that rule, exported for the application to read as well.
|
|
2364
2350
|
|
|
2365
2351
|
#### Examples
|
|
2366
2352
|
|
|
@@ -2596,71 +2582,71 @@ export default function Combinations() {
|
|
|
2596
2582
|
|
|
2597
2583
|
#### Keyboard
|
|
2598
2584
|
|
|
2599
|
-
The keys of [First schedule](
|
|
2585
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
2600
2586
|
|
|
2601
2587
|
#### Props on this page
|
|
2602
2588
|
|
|
2603
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
2589
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
2604
2590
|
|
|
2605
2591
|
| Prop | Type | Default | Description |
|
|
2606
2592
|
|---|---|---|---|
|
|
2607
|
-
| [`height`](
|
|
2608
|
-
| [`label`](
|
|
2609
|
-
| [`children`](
|
|
2593
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
2594
|
+
| [`label`](#first-schedule) | `(subtask: `[`Subtask`](#subtasks)`) => string` | — | What stands written in a bar: a function from a subtask to a line of text, or nothing for bars without text. The text is cut off with an ellipsis where the bar is too narrow for it and left out where even that would say nothing; a bar that began before the view keeps its text at the view's edge. |
|
|
2595
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
2610
2596
|
|
|
2611
2597
|
###### Accessibility
|
|
2612
2598
|
|
|
2613
2599
|
| Prop | Type | Default | Description |
|
|
2614
2600
|
|---|---|---|---|
|
|
2615
|
-
| [`ariaLabel`](
|
|
2601
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
2616
2602
|
|
|
2617
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
2603
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
2618
2604
|
|
|
2619
2605
|
| Prop | Type | Default | Description |
|
|
2620
2606
|
|---|---|---|---|
|
|
2621
|
-
| [`id`](
|
|
2622
|
-
| [`label`](
|
|
2607
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
2608
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
2623
2609
|
|
|
2624
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
2610
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
2625
2611
|
|
|
2626
2612
|
| Prop | Type | Default | Description |
|
|
2627
2613
|
|---|---|---|---|
|
|
2628
|
-
| [`data`](
|
|
2629
|
-
| [`tasks`](
|
|
2614
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
2615
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
2630
2616
|
|
|
2631
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
2617
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
2632
2618
|
|
|
2633
2619
|
| Prop | Type | Default | Description |
|
|
2634
2620
|
|---|---|---|---|
|
|
2635
|
-
| [`id`](
|
|
2636
|
-
| [`task`](
|
|
2637
|
-
| [`lane`](
|
|
2638
|
-
| [`from`](
|
|
2639
|
-
| [`to`](
|
|
2640
|
-
| [`leadIn`](
|
|
2641
|
-
| [`leadOut`](
|
|
2642
|
-
| [`appearance`](
|
|
2643
|
-
| [`progress`](
|
|
2621
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
2622
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
2623
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
2624
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
2625
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
2626
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
2627
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
2628
|
+
| [`appearance`](#subtasks) | `readonly `[`SubtaskAppearance`](#subtasks)`[]` | — | What the bar says besides its colour: `"provisional"`, `"fixed"`, `"muted"`, `"open"`. Several hold at once; `"provisional"` and `"fixed"` contradict, and the later one in the list wins. |
|
|
2629
|
+
| [`progress`](#subtasks) | `number` | — | The share of the work that is done, from 0 to 1, drawn as a filled part of the bar. Without it nothing is claimed - an empty bar and a bar at zero per cent are two different statements. |
|
|
2644
2630
|
|
|
2645
|
-
From `Task` — the full table stands on [Subtasks](
|
|
2631
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
2646
2632
|
|
|
2647
2633
|
| Prop | Type | Default | Description |
|
|
2648
2634
|
|---|---|---|---|
|
|
2649
|
-
| [`id`](
|
|
2650
|
-
| [`color`](
|
|
2651
|
-
| [`name`](
|
|
2635
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
2636
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
2637
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
2652
2638
|
|
|
2653
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
2639
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
2654
2640
|
|
|
2655
2641
|
| Prop | Type | Default | Description |
|
|
2656
2642
|
|---|---|---|---|
|
|
2657
|
-
| [`initialView`](
|
|
2643
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
2658
2644
|
|
|
2659
|
-
From `ScheduleView` — the full table stands on [View](
|
|
2645
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
2660
2646
|
|
|
2661
2647
|
| Prop | Type | Default | Description |
|
|
2662
2648
|
|---|---|---|---|
|
|
2663
|
-
| [`domain`](
|
|
2649
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
2664
2650
|
|
|
2665
2651
|
### Overlap
|
|
2666
2652
|
|
|
@@ -2670,8 +2656,6 @@ Two subtasks claiming one lane at the same time (also called a double booking or
|
|
|
2670
2656
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
2671
2657
|
```
|
|
2672
2658
|
|
|
2673
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/overlap/
|
|
2674
|
-
|
|
2675
2659
|
The later bar is offset a few pixels and edged, and the shared time is marked across the lane. Lead-in and lead-out occupy the lane too, so a lead-out meeting the next lead-in is an overlap. The offset stops at three levels and never leaks into the lane below.
|
|
2676
2660
|
|
|
2677
2661
|
#### Examples
|
|
@@ -2782,74 +2766,74 @@ export default function ThreeAtOnce() {
|
|
|
2782
2766
|
|
|
2783
2767
|
#### Keyboard
|
|
2784
2768
|
|
|
2785
|
-
The keys of [First schedule](
|
|
2769
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
2786
2770
|
|
|
2787
2771
|
#### Props on this page
|
|
2788
2772
|
|
|
2789
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
2773
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
2790
2774
|
|
|
2791
2775
|
| Prop | Type | Default | Description |
|
|
2792
2776
|
|---|---|---|---|
|
|
2793
|
-
| [`height`](
|
|
2794
|
-
| [`children`](
|
|
2777
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
2778
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
2795
2779
|
|
|
2796
2780
|
###### Accessibility
|
|
2797
2781
|
|
|
2798
2782
|
| Prop | Type | Default | Description |
|
|
2799
2783
|
|---|---|---|---|
|
|
2800
|
-
| [`ariaLabel`](
|
|
2784
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
2801
2785
|
|
|
2802
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
2786
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
2803
2787
|
|
|
2804
2788
|
| Prop | Type | Default | Description |
|
|
2805
2789
|
|---|---|---|---|
|
|
2806
|
-
| [`id`](
|
|
2807
|
-
| [`label`](
|
|
2790
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
2791
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
2808
2792
|
|
|
2809
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
2793
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
2810
2794
|
|
|
2811
2795
|
| Prop | Type | Default | Description |
|
|
2812
2796
|
|---|---|---|---|
|
|
2813
|
-
| [`data`](
|
|
2814
|
-
| [`tasks`](
|
|
2797
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
2798
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
2815
2799
|
|
|
2816
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
2800
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
2817
2801
|
|
|
2818
2802
|
| Prop | Type | Default | Description |
|
|
2819
2803
|
|---|---|---|---|
|
|
2820
|
-
| [`id`](
|
|
2821
|
-
| [`task`](
|
|
2822
|
-
| [`lane`](
|
|
2823
|
-
| [`from`](
|
|
2824
|
-
| [`to`](
|
|
2825
|
-
| [`leadIn`](
|
|
2826
|
-
| [`leadOut`](
|
|
2804
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
2805
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
2806
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
2807
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
2808
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
2809
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
2810
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
2827
2811
|
|
|
2828
|
-
From `Task` — the full table stands on [Subtasks](
|
|
2812
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
2829
2813
|
|
|
2830
2814
|
| Prop | Type | Default | Description |
|
|
2831
2815
|
|---|---|---|---|
|
|
2832
|
-
| [`id`](
|
|
2833
|
-
| [`color`](
|
|
2834
|
-
| [`name`](
|
|
2816
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
2817
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
2818
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
2835
2819
|
|
|
2836
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
2820
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
2837
2821
|
|
|
2838
2822
|
| Prop | Type | Default | Description |
|
|
2839
2823
|
|---|---|---|---|
|
|
2840
|
-
| [`initialView`](
|
|
2824
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
2841
2825
|
|
|
2842
|
-
From `ScheduleView` — the full table stands on [View](
|
|
2826
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
2843
2827
|
|
|
2844
2828
|
| Prop | Type | Default | Description |
|
|
2845
2829
|
|---|---|---|---|
|
|
2846
|
-
| [`domain`](
|
|
2830
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
2847
2831
|
|
|
2848
2832
|
#### Known limits
|
|
2849
2833
|
|
|
2850
2834
|
- No stacked layout on request yet: an overlap is always drawn offset, as the finding it is.
|
|
2851
2835
|
|
|
2852
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
2836
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
2853
2837
|
|
|
2854
2838
|
### Dependencies
|
|
2855
2839
|
|
|
@@ -2859,11 +2843,9 @@ Lines from one subtask's end to the next one's start within a task, with the lag
|
|
|
2859
2843
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
2860
2844
|
```
|
|
2861
2845
|
|
|
2862
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/dependencies/
|
|
2863
|
-
|
|
2864
2846
|
`leaves` and `arrives` say what a dependency connects - the main time, or the outer edge of the lead-out and the lead-in - and so decide whether it is violated. `attach`, `ends` and `route` only change how the line is drawn.
|
|
2865
2847
|
|
|
2866
|
-
Nothing moves to make a dependency fit. [Ripple](
|
|
2848
|
+
Nothing moves to make a dependency fit. [Ripple](#ripple) computes the moves that would, for the application to run or not.
|
|
2867
2849
|
|
|
2868
2850
|
#### Examples
|
|
2869
2851
|
|
|
@@ -3160,7 +3142,7 @@ export default function OneHandoverDrawnItsOwnWay() {
|
|
|
3160
3142
|
| `] or t` | Out along the active subtask's dependency; pressed again, on to the subtask it arrives at. |
|
|
3161
3143
|
| `[ or Shift+T` | Back along the dependency to the subtask it leaves. |
|
|
3162
3144
|
|
|
3163
|
-
The keys of [First schedule](
|
|
3145
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
3164
3146
|
|
|
3165
3147
|
#### API
|
|
3166
3148
|
|
|
@@ -3168,21 +3150,21 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
|
|
|
3168
3150
|
|
|
3169
3151
|
| Prop | Type | Default | Description |
|
|
3170
3152
|
|---|---|---|---|
|
|
3171
|
-
| `data` *required* | `readonly
|
|
3153
|
+
| `data` *required* | `readonly ``Dependency``[]` | — | The dependencies, as the caller holds them.<br>Shown in: [Join the stops of a tour](#dependencies), [Choose what a dependency connects](#dependencies), [Choose where a line touches its bars](#dependencies) and 28 more |
|
|
3172
3154
|
|
|
3173
3155
|
##### `Dependency`
|
|
3174
3156
|
|
|
3175
3157
|
| Prop | Type | Default | Description |
|
|
3176
3158
|
|---|---|---|---|
|
|
3177
|
-
| `id` *required* | `string` | — | The caller's identity of the dependency.<br>Shown in: [Join the stops of a tour](
|
|
3178
|
-
| `from` *required* | `string` | — | The id of the subtask it leaves.<br>Shown in: [Join the stops of a tour](
|
|
3179
|
-
| `to` *required* | `string` | — | The id of the subtask it arrives at.<br>Shown in: [Join the stops of a tour](
|
|
3180
|
-
| `lag` *required* | `number` | — | The least time between the two anchors; zero where the successor may begin as soon as the predecessor ends.<br>Shown in: [Join the stops of a tour](
|
|
3181
|
-
| `leaves` | `"main" \| "leadOut"` | `"leadOut"` | Where it leaves: at the end of the main time, or after the lead-out. The predecessor counts as ended once its lead-out is.<br>Shown in: [Choose what a dependency connects](
|
|
3182
|
-
| `arrives` | `"main" \| "leadIn"` | `"leadIn"` | Where it arrives: at the start of the main time, or before the lead-in. The lag must have run out before the successor's lead-in begins.<br>Shown in: [Choose what a dependency connects](
|
|
3183
|
-
| `route` |
|
|
3184
|
-
| `attach` |
|
|
3185
|
-
| `ends` |
|
|
3159
|
+
| `id` *required* | `string` | — | The caller's identity of the dependency.<br>Shown in: [Join the stops of a tour](#dependencies), [Choose what a dependency connects](#dependencies), [Choose where a line touches its bars](#dependencies) and 27 more |
|
|
3160
|
+
| `from` *required* | `string` | — | The id of the subtask it leaves.<br>Shown in: [Join the stops of a tour](#dependencies), [Choose what a dependency connects](#dependencies), [Choose where a line touches its bars](#dependencies) and 27 more |
|
|
3161
|
+
| `to` *required* | `string` | — | The id of the subtask it arrives at.<br>Shown in: [Join the stops of a tour](#dependencies), [Choose what a dependency connects](#dependencies), [Choose where a line touches its bars](#dependencies) and 27 more |
|
|
3162
|
+
| `lag` *required* | `number` | — | The least time between the two anchors; zero where the successor may begin as soon as the predecessor ends.<br>Shown in: [Join the stops of a tour](#dependencies), [Choose what a dependency connects](#dependencies), [Choose where a line touches its bars](#dependencies) and 27 more |
|
|
3163
|
+
| `leaves` | `"main" \| "leadOut"` | `"leadOut"` | Where it leaves: at the end of the main time, or after the lead-out. The predecessor counts as ended once its lead-out is.<br>Shown in: [Choose what a dependency connects](#dependencies), [Plan a day in the machine shop (First schedule)](#first-schedule), [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
3164
|
+
| `arrives` | `"main" \| "leadIn"` | `"leadIn"` | Where it arrives: at the start of the main time, or before the lead-in. The lag must have run out before the successor's lead-in begins.<br>Shown in: [Choose what a dependency connects](#dependencies), [A day of tours (First schedule)](#first-schedule), [Plan a day in the machine shop (First schedule)](#first-schedule) and 1 more |
|
|
3165
|
+
| `route` | `DependencyRoute`<br>`"curve" \| "straight" \| "orthogonal"` | — | How this one is drawn, where it is not drawn like the rest. It changes the picture and never the finding: whether a dependency is violated follows from `leaves` and `arrives` alone.<br>Shown in: [Per dependency (Routes)](#routes) |
|
|
3166
|
+
| `attach` | `DependencyAttachment`<br>`"centre" \| "nearest"` | — | Where on the bars this one's line attaches, where it does not attach like the rest. Also picture only, and not to be confused with the two anchors above: those say what the dependency connects, this says where the line touches.<br>Shown in: [Draw one handover its own way](#dependencies) |
|
|
3167
|
+
| `ends` | `DependencyEnds`<br>`"dot" \| "none"` | — | Whether this one's ends are marked with a dot, where it is not marked like the rest. Also picture only.<br>Shown in: [Draw one handover its own way](#dependencies) |
|
|
3186
3168
|
|
|
3187
3169
|
##### Types on this page
|
|
3188
3170
|
|
|
@@ -3221,9 +3203,9 @@ type DependencyEnds = "dot" | "none";
|
|
|
3221
3203
|
|
|
3222
3204
|
#### Known limits
|
|
3223
3205
|
|
|
3224
|
-
- Only finish-to-start within one task; no dependency types and no critical path ([ADR-0032](https://
|
|
3206
|
+
- Only finish-to-start within one task; no dependency types and no critical path ([ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md)).
|
|
3225
3207
|
|
|
3226
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
3208
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
3227
3209
|
|
|
3228
3210
|
### Routes
|
|
3229
3211
|
|
|
@@ -3233,8 +3215,6 @@ The shape of a dependency's line: a curve that leaves and arrives forwards, a st
|
|
|
3233
3215
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
3234
3216
|
```
|
|
3235
3217
|
|
|
3236
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/routes/
|
|
3237
|
-
|
|
3238
3218
|
#### Examples
|
|
3239
3219
|
|
|
3240
3220
|
##### Curve
|
|
@@ -3400,85 +3380,85 @@ export default function PerDependency() {
|
|
|
3400
3380
|
|
|
3401
3381
|
#### Keyboard
|
|
3402
3382
|
|
|
3403
|
-
The keys of [First schedule](
|
|
3383
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
3404
3384
|
|
|
3405
3385
|
#### Props on this page
|
|
3406
3386
|
|
|
3407
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
3387
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
3408
3388
|
|
|
3409
3389
|
| Prop | Type | Default | Description |
|
|
3410
3390
|
|---|---|---|---|
|
|
3411
|
-
| [`height`](
|
|
3412
|
-
| [`route`](
|
|
3413
|
-
| [`attach`](
|
|
3414
|
-
| [`children`](
|
|
3391
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
3392
|
+
| [`route`](#first-schedule) | [`DependencyRoute`](#first-schedule)<br>`"curve" \| "straight" \| "orthogonal"` | `"curve"` | How the dependencies are drawn: a `"curve"` that leaves and arrives forwards, a `"straight"` line, or `"orthogonal"` segments. A dependency may say otherwise for itself. |
|
|
3393
|
+
| [`attach`](#first-schedule) | [`DependencyAttachment`](#first-schedule)<br>`"centre" \| "nearest"` | `"centre"` | Where a dependency's ends sit on their bars: the `"centre"` of both, or the `"nearest"` edge - which is the shortest line between two stops. Within one lane both mean the middle. A dependency may say otherwise for itself. It changes the picture and never a finding: whether a dependency is violated follows from its `leaves` and `arrives` alone. |
|
|
3394
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
3415
3395
|
|
|
3416
3396
|
###### Accessibility
|
|
3417
3397
|
|
|
3418
3398
|
| Prop | Type | Default | Description |
|
|
3419
3399
|
|---|---|---|---|
|
|
3420
|
-
| [`ariaLabel`](
|
|
3400
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
3421
3401
|
|
|
3422
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
3402
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
3423
3403
|
|
|
3424
3404
|
| Prop | Type | Default | Description |
|
|
3425
3405
|
|---|---|---|---|
|
|
3426
|
-
| [`id`](
|
|
3427
|
-
| [`label`](
|
|
3406
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
3407
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
3428
3408
|
|
|
3429
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
3409
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
3430
3410
|
|
|
3431
3411
|
| Prop | Type | Default | Description |
|
|
3432
3412
|
|---|---|---|---|
|
|
3433
|
-
| [`data`](
|
|
3434
|
-
| [`tasks`](
|
|
3413
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
3414
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
3435
3415
|
|
|
3436
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
3416
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
3437
3417
|
|
|
3438
3418
|
| Prop | Type | Default | Description |
|
|
3439
3419
|
|---|---|---|---|
|
|
3440
|
-
| [`id`](
|
|
3441
|
-
| [`task`](
|
|
3442
|
-
| [`lane`](
|
|
3443
|
-
| [`from`](
|
|
3444
|
-
| [`to`](
|
|
3445
|
-
| [`name`](
|
|
3420
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
3421
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
3422
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
3423
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
3424
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
3425
|
+
| [`name`](#subtasks) | `string` | — | What the subtask is called, where the schedule names it. |
|
|
3446
3426
|
|
|
3447
|
-
From `Task` — the full table stands on [Subtasks](
|
|
3427
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
3448
3428
|
|
|
3449
3429
|
| Prop | Type | Default | Description |
|
|
3450
3430
|
|---|---|---|---|
|
|
3451
|
-
| [`id`](
|
|
3452
|
-
| [`color`](
|
|
3453
|
-
| [`name`](
|
|
3431
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
3432
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
3433
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
3454
3434
|
|
|
3455
|
-
From `DependenciesProps` — the full table stands on [Dependencies](
|
|
3435
|
+
From `DependenciesProps` — the full table stands on [Dependencies](#dependencies).
|
|
3456
3436
|
|
|
3457
3437
|
| Prop | Type | Default | Description |
|
|
3458
3438
|
|---|---|---|---|
|
|
3459
|
-
| [`data`](
|
|
3439
|
+
| [`data`](#dependencies) *required* | `readonly `[`Dependency`](#dependencies)`[]` | — | The dependencies, as the caller holds them. |
|
|
3460
3440
|
|
|
3461
|
-
From `Dependency` — the full table stands on [Dependencies](
|
|
3441
|
+
From `Dependency` — the full table stands on [Dependencies](#dependencies).
|
|
3462
3442
|
|
|
3463
3443
|
| Prop | Type | Default | Description |
|
|
3464
3444
|
|---|---|---|---|
|
|
3465
|
-
| [`id`](
|
|
3466
|
-
| [`from`](
|
|
3467
|
-
| [`to`](
|
|
3468
|
-
| [`lag`](
|
|
3469
|
-
| [`route`](
|
|
3445
|
+
| [`id`](#dependencies) *required* | `string` | — | The caller's identity of the dependency. |
|
|
3446
|
+
| [`from`](#dependencies) *required* | `string` | — | The id of the subtask it leaves. |
|
|
3447
|
+
| [`to`](#dependencies) *required* | `string` | — | The id of the subtask it arrives at. |
|
|
3448
|
+
| [`lag`](#dependencies) *required* | `number` | — | The least time between the two anchors; zero where the successor may begin as soon as the predecessor ends. |
|
|
3449
|
+
| [`route`](#dependencies) | [`DependencyRoute`](#dependencies)<br>`"curve" \| "straight" \| "orthogonal"` | — | How this one is drawn, where it is not drawn like the rest. It changes the picture and never the finding: whether a dependency is violated follows from `leaves` and `arrives` alone. |
|
|
3470
3450
|
|
|
3471
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
3451
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
3472
3452
|
|
|
3473
3453
|
| Prop | Type | Default | Description |
|
|
3474
3454
|
|---|---|---|---|
|
|
3475
|
-
| [`initialView`](
|
|
3455
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
3476
3456
|
|
|
3477
|
-
From `ScheduleView` — the full table stands on [View](
|
|
3457
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
3478
3458
|
|
|
3479
3459
|
| Prop | Type | Default | Description |
|
|
3480
3460
|
|---|---|---|---|
|
|
3481
|
-
| [`domain`](
|
|
3461
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
3482
3462
|
|
|
3483
3463
|
## Time
|
|
3484
3464
|
|
|
@@ -3492,8 +3472,6 @@ A day band that names the days and a time band whose ticks follow the zoom, from
|
|
|
3492
3472
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
3493
3473
|
```
|
|
3494
3474
|
|
|
3495
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/time-axis/
|
|
3496
|
-
|
|
3497
3475
|
The calendar is a list of intervals in which time counts, nothing more; deriving it from opening hours and holidays is the application's business. A dotted line marks each seam, and a drag that would end in removed time stops at the seam where time counts again.
|
|
3498
3476
|
|
|
3499
3477
|
#### Examples
|
|
@@ -3735,93 +3713,93 @@ export default function OfficeHours() {
|
|
|
3735
3713
|
|
|
3736
3714
|
#### Keyboard
|
|
3737
3715
|
|
|
3738
|
-
The keys of [First schedule](
|
|
3716
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
3739
3717
|
|
|
3740
3718
|
#### Props on this page
|
|
3741
3719
|
|
|
3742
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
3720
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
3743
3721
|
|
|
3744
3722
|
| Prop | Type | Default | Description |
|
|
3745
3723
|
|---|---|---|---|
|
|
3746
|
-
| [`height`](
|
|
3747
|
-
| [`calendar`](
|
|
3748
|
-
| [`intents`](
|
|
3749
|
-
| [`label`](
|
|
3750
|
-
| [`children`](
|
|
3724
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
3725
|
+
| [`calendar`](#first-schedule) | [`CalendarInput`](#first-schedule) | `[]` | A working calendar: the intervals in which time counts. Nights and weekends outside them are cut out of the axis. Without intervals every hour counts, as on the wall clock. |
|
|
3726
|
+
| [`intents`](#first-schedule) | `readonly `[`IntentKind`](#first-schedule)`[]` | `[]` | The intents the caller handles. Each one enables its interaction; none leaves a read-only schedule ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)). |
|
|
3727
|
+
| [`label`](#first-schedule) | `(subtask: `[`Subtask`](#subtasks)`) => string` | — | What stands written in a bar: a function from a subtask to a line of text, or nothing for bars without text. The text is cut off with an ellipsis where the bar is too narrow for it and left out where even that would say nothing; a bar that began before the view keeps its text at the view's edge. |
|
|
3728
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
3751
3729
|
|
|
3752
3730
|
###### Events
|
|
3753
3731
|
|
|
3754
3732
|
| Prop | Type | Default | Description |
|
|
3755
3733
|
|---|---|---|---|
|
|
3756
|
-
| [`onIntent`](
|
|
3734
|
+
| [`onIntent`](#first-schedule) | `(intent: `[`Intent`](#first-schedule)`) => void` | — | Called once per intent when a drag ends. The data changes only if the caller changes it. |
|
|
3757
3735
|
|
|
3758
3736
|
###### Accessibility
|
|
3759
3737
|
|
|
3760
3738
|
| Prop | Type | Default | Description |
|
|
3761
3739
|
|---|---|---|---|
|
|
3762
|
-
| [`ariaLabel`](
|
|
3740
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
3763
3741
|
|
|
3764
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
3742
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
3765
3743
|
|
|
3766
3744
|
| Prop | Type | Default | Description |
|
|
3767
3745
|
|---|---|---|---|
|
|
3768
|
-
| [`id`](
|
|
3769
|
-
| [`label`](
|
|
3746
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
3747
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
3770
3748
|
|
|
3771
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
3749
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
3772
3750
|
|
|
3773
3751
|
| Prop | Type | Default | Description |
|
|
3774
3752
|
|---|---|---|---|
|
|
3775
|
-
| [`data`](
|
|
3776
|
-
| [`tasks`](
|
|
3753
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
3754
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
3777
3755
|
|
|
3778
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
3756
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
3779
3757
|
|
|
3780
3758
|
| Prop | Type | Default | Description |
|
|
3781
3759
|
|---|---|---|---|
|
|
3782
|
-
| [`id`](
|
|
3783
|
-
| [`task`](
|
|
3784
|
-
| [`lane`](
|
|
3785
|
-
| [`from`](
|
|
3786
|
-
| [`to`](
|
|
3787
|
-
| [`leadIn`](
|
|
3788
|
-
| [`leadOut`](
|
|
3789
|
-
| [`name`](
|
|
3760
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
3761
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
3762
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
3763
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
3764
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
3765
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
3766
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
3767
|
+
| [`name`](#subtasks) | `string` | — | What the subtask is called, where the schedule names it. |
|
|
3790
3768
|
|
|
3791
|
-
From `Task` — the full table stands on [Subtasks](
|
|
3769
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
3792
3770
|
|
|
3793
3771
|
| Prop | Type | Default | Description |
|
|
3794
3772
|
|---|---|---|---|
|
|
3795
|
-
| [`id`](
|
|
3796
|
-
| [`color`](
|
|
3797
|
-
| [`name`](
|
|
3773
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
3774
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
3775
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
3798
3776
|
|
|
3799
|
-
From `DependenciesProps` — the full table stands on [Dependencies](
|
|
3777
|
+
From `DependenciesProps` — the full table stands on [Dependencies](#dependencies).
|
|
3800
3778
|
|
|
3801
3779
|
| Prop | Type | Default | Description |
|
|
3802
3780
|
|---|---|---|---|
|
|
3803
|
-
| [`data`](
|
|
3781
|
+
| [`data`](#dependencies) *required* | `readonly `[`Dependency`](#dependencies)`[]` | — | The dependencies, as the caller holds them. |
|
|
3804
3782
|
|
|
3805
|
-
From `Dependency` — the full table stands on [Dependencies](
|
|
3783
|
+
From `Dependency` — the full table stands on [Dependencies](#dependencies).
|
|
3806
3784
|
|
|
3807
3785
|
| Prop | Type | Default | Description |
|
|
3808
3786
|
|---|---|---|---|
|
|
3809
|
-
| [`id`](
|
|
3810
|
-
| [`from`](
|
|
3811
|
-
| [`to`](
|
|
3812
|
-
| [`lag`](
|
|
3787
|
+
| [`id`](#dependencies) *required* | `string` | — | The caller's identity of the dependency. |
|
|
3788
|
+
| [`from`](#dependencies) *required* | `string` | — | The id of the subtask it leaves. |
|
|
3789
|
+
| [`to`](#dependencies) *required* | `string` | — | The id of the subtask it arrives at. |
|
|
3790
|
+
| [`lag`](#dependencies) *required* | `number` | — | The least time between the two anchors; zero where the successor may begin as soon as the predecessor ends. |
|
|
3813
3791
|
|
|
3814
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
3792
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
3815
3793
|
|
|
3816
3794
|
| Prop | Type | Default | Description |
|
|
3817
3795
|
|---|---|---|---|
|
|
3818
|
-
| [`initialView`](
|
|
3796
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
3819
3797
|
|
|
3820
|
-
From `ScheduleView` — the full table stands on [View](
|
|
3798
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
3821
3799
|
|
|
3822
3800
|
| Prop | Type | Default | Description |
|
|
3823
3801
|
|---|---|---|---|
|
|
3824
|
-
| [`domain`](
|
|
3802
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
3825
3803
|
|
|
3826
3804
|
### Blocked time
|
|
3827
3805
|
|
|
@@ -3831,9 +3809,7 @@ Leave, maintenance and other time a lane is not available: hatched behind the wo
|
|
|
3831
3809
|
import { useSchedule, findings } from "@umriss-ui/schedule";
|
|
3832
3810
|
```
|
|
3833
3811
|
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
Blocked time is data beside the work: one list, each interval naming its lane, as a leave table or a maintenance plan holds it. [`findings`](#/api/findings) takes the same list as its third argument.
|
|
3812
|
+
Blocked time is data beside the work: one list, each interval naming its lane, as a leave table or a maintenance plan holds it. [`findings`](#api-index-1) takes the same list as its third argument.
|
|
3837
3813
|
|
|
3838
3814
|
Work the data already put into blocked time is never locked there: it may be moved within it and out of it, and the finding stays until it is.
|
|
3839
3815
|
|
|
@@ -3980,7 +3956,7 @@ export default function DragAround() {
|
|
|
3980
3956
|
|
|
3981
3957
|
##### Check a sprint against the leave calendar
|
|
3982
3958
|
|
|
3983
|
-
The team's holidays, sick days and training become `BlockedTimes`, and [`findings`](
|
|
3959
|
+
The team's holidays, sick days and training become `BlockedTimes`, and [`findings`](#api-index-1) confirms that no work item runs into one.
|
|
3984
3960
|
|
|
3985
3961
|
```tsx
|
|
3986
3962
|
import { Stack, Text } from "@umriss-ui/core";
|
|
@@ -4118,7 +4094,7 @@ export default function TeamLeave() {
|
|
|
4118
4094
|
|
|
4119
4095
|
#### Keyboard
|
|
4120
4096
|
|
|
4121
|
-
The keys of [First schedule](
|
|
4097
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
4122
4098
|
|
|
4123
4099
|
#### API
|
|
4124
4100
|
|
|
@@ -4126,17 +4102,17 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
|
|
|
4126
4102
|
|
|
4127
4103
|
| Prop | Type | Default | Description |
|
|
4128
4104
|
|---|---|---|---|
|
|
4129
|
-
| `data` *required* | `readonly
|
|
4105
|
+
| `data` *required* | `readonly ``BlockedTime``[]` | — | The blocked time of the lanes - leave, maintenance, unavailability -, as the caller holds it: one list, each interval naming its lane.<br>Shown in: [Block out leave and maintenance](#blocked-time), [Plan work around someone's leave](#blocked-time), [Check a sprint against the leave calendar](#blocked-time) and 5 more |
|
|
4130
4106
|
|
|
4131
4107
|
##### `BlockedTime`
|
|
4132
4108
|
|
|
4133
4109
|
| Prop | Type | Default | Description |
|
|
4134
4110
|
|---|---|---|---|
|
|
4135
|
-
| `id` *required* | `string` | — | The caller's identity of the interval - what a finding names.<br>Shown in: [Block out leave and maintenance](
|
|
4136
|
-
| `lane` *required* | `string` | — | The id of the lane it blocks.<br>Shown in: [Block out leave and maintenance](
|
|
4137
|
-
| `from` *required* | `number` | — | Where it begins.<br>Shown in: [Block out leave and maintenance](
|
|
4138
|
-
| `to` *required* | `number` | — | Where it ends.<br>Shown in: [Block out leave and maintenance](
|
|
4139
|
-
| `label` | `string` | — | Why the lane is blocked - "Leave", "Maintenance" -, where the schedule names it.<br>Shown in: [Block out leave and maintenance](
|
|
4111
|
+
| `id` *required* | `string` | — | The caller's identity of the interval - what a finding names.<br>Shown in: [Block out leave and maintenance](#blocked-time), [Plan work around someone's leave](#blocked-time), [Check a sprint against the leave calendar](#blocked-time) and 5 more |
|
|
4112
|
+
| `lane` *required* | `string` | — | The id of the lane it blocks.<br>Shown in: [Block out leave and maintenance](#blocked-time), [Plan work around someone's leave](#blocked-time), [Check a sprint against the leave calendar](#blocked-time) and 5 more |
|
|
4113
|
+
| `from` *required* | `number` | — | Where it begins.<br>Shown in: [Block out leave and maintenance](#blocked-time), [Plan work around someone's leave](#blocked-time), [Check a sprint against the leave calendar](#blocked-time) and 5 more |
|
|
4114
|
+
| `to` *required* | `number` | — | Where it ends.<br>Shown in: [Block out leave and maintenance](#blocked-time), [Plan work around someone's leave](#blocked-time), [Check a sprint against the leave calendar](#blocked-time) and 5 more |
|
|
4115
|
+
| `label` | `string` | — | Why the lane is blocked - "Leave", "Maintenance" -, where the schedule names it.<br>Shown in: [Block out leave and maintenance](#blocked-time), [Plan work around someone's leave](#blocked-time), [Check a sprint against the leave calendar](#blocked-time) and 5 more |
|
|
4140
4116
|
|
|
4141
4117
|
### Milestones
|
|
4142
4118
|
|
|
@@ -4146,8 +4122,6 @@ A point in time on a lane - a handover, a release, a deadline - drawn as a diamo
|
|
|
4146
4122
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
4147
4123
|
```
|
|
4148
4124
|
|
|
4149
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/milestones/
|
|
4150
|
-
|
|
4151
4125
|
A milestone is data beside the work: one list, each point naming its lane and the instant it stands at (`{ id, lane, at, label? }`). It has no duration, no task and no tone; it is not dragged and reports no intent, and work beside it is never a finding.
|
|
4152
4126
|
|
|
4153
4127
|
The keys walk to it in time order among the subtasks of its lane, the tooltip names it by its label and time, and the live region reads its lane, label and time. It is named by its label, or its id without one.
|
|
@@ -4265,7 +4239,7 @@ export default function SayWhatAMilestoneIs() {
|
|
|
4265
4239
|
|
|
4266
4240
|
#### Keyboard
|
|
4267
4241
|
|
|
4268
|
-
The keys of [First schedule](
|
|
4242
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
4269
4243
|
|
|
4270
4244
|
#### API
|
|
4271
4245
|
|
|
@@ -4273,16 +4247,16 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
|
|
|
4273
4247
|
|
|
4274
4248
|
| Prop | Type | Default | Description |
|
|
4275
4249
|
|---|---|---|---|
|
|
4276
|
-
| `data` *required* | `readonly
|
|
4250
|
+
| `data` *required* | `readonly ``Milestone``[]` | — | The milestones of the lanes, as the caller holds them: one list, each naming its lane and the instant it stands at.<br>Shown in: [Mark a handover and a release](#milestones), [Say what a milestone is in your own tooltip](#milestones) |
|
|
4277
4251
|
|
|
4278
4252
|
##### `Milestone`
|
|
4279
4253
|
|
|
4280
4254
|
| Prop | Type | Default | Description |
|
|
4281
4255
|
|---|---|---|---|
|
|
4282
|
-
| `id` *required* | `string` | — | The caller's identity of the milestone.<br>Shown in: [Mark a handover and a release](
|
|
4283
|
-
| `lane` *required* | `string` | — | The id of the lane it stands on.<br>Shown in: [Mark a handover and a release](
|
|
4284
|
-
| `at` *required* | `number` | — | The instant it stands at.<br>Shown in: [Mark a handover and a release](
|
|
4285
|
-
| `label` | `string` | — | What it is called, where the schedule names it; without it, its id.<br>Shown in: [Mark a handover and a release](
|
|
4256
|
+
| `id` *required* | `string` | — | The caller's identity of the milestone.<br>Shown in: [Mark a handover and a release](#milestones), [Say what a milestone is in your own tooltip](#milestones) |
|
|
4257
|
+
| `lane` *required* | `string` | — | The id of the lane it stands on.<br>Shown in: [Mark a handover and a release](#milestones), [Say what a milestone is in your own tooltip](#milestones) |
|
|
4258
|
+
| `at` *required* | `number` | — | The instant it stands at.<br>Shown in: [Mark a handover and a release](#milestones), [Say what a milestone is in your own tooltip](#milestones) |
|
|
4259
|
+
| `label` | `string` | — | What it is called, where the schedule names it; without it, its id.<br>Shown in: [Mark a handover and a release](#milestones), [Say what a milestone is in your own tooltip](#milestones) |
|
|
4286
4260
|
|
|
4287
4261
|
### Now line
|
|
4288
4262
|
|
|
@@ -4292,8 +4266,6 @@ A line across the lanes at the present moment, so that whatever should have happ
|
|
|
4292
4266
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
4293
4267
|
```
|
|
4294
4268
|
|
|
4295
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/now-line/
|
|
4296
|
-
|
|
4297
4269
|
#### Examples
|
|
4298
4270
|
|
|
4299
4271
|
##### Mark the present
|
|
@@ -4502,68 +4474,68 @@ export default function FollowTheClock() {
|
|
|
4502
4474
|
|
|
4503
4475
|
#### Keyboard
|
|
4504
4476
|
|
|
4505
|
-
The keys of [First schedule](
|
|
4477
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
4506
4478
|
|
|
4507
4479
|
#### Props on this page
|
|
4508
4480
|
|
|
4509
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
4481
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
4510
4482
|
|
|
4511
4483
|
| Prop | Type | Default | Description |
|
|
4512
4484
|
|---|---|---|---|
|
|
4513
|
-
| [`height`](
|
|
4514
|
-
| [`now`](
|
|
4515
|
-
| [`children`](
|
|
4485
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
4486
|
+
| [`now`](#first-schedule) | `boolean \| number` | `false` | A line marking the present across the lanes: `true` follows the clock by the minute, an instant fixes it there. |
|
|
4487
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
4516
4488
|
|
|
4517
4489
|
###### Accessibility
|
|
4518
4490
|
|
|
4519
4491
|
| Prop | Type | Default | Description |
|
|
4520
4492
|
|---|---|---|---|
|
|
4521
|
-
| [`ariaLabel`](
|
|
4493
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
4522
4494
|
|
|
4523
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
4495
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
4524
4496
|
|
|
4525
4497
|
| Prop | Type | Default | Description |
|
|
4526
4498
|
|---|---|---|---|
|
|
4527
|
-
| [`id`](
|
|
4528
|
-
| [`label`](
|
|
4499
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
4500
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
4529
4501
|
|
|
4530
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
4502
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
4531
4503
|
|
|
4532
4504
|
| Prop | Type | Default | Description |
|
|
4533
4505
|
|---|---|---|---|
|
|
4534
|
-
| [`data`](
|
|
4535
|
-
| [`tasks`](
|
|
4506
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
4507
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
4536
4508
|
|
|
4537
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
4509
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
4538
4510
|
|
|
4539
4511
|
| Prop | Type | Default | Description |
|
|
4540
4512
|
|---|---|---|---|
|
|
4541
|
-
| [`id`](
|
|
4542
|
-
| [`task`](
|
|
4543
|
-
| [`lane`](
|
|
4544
|
-
| [`from`](
|
|
4545
|
-
| [`to`](
|
|
4546
|
-
| [`leadIn`](
|
|
4513
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
4514
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
4515
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
4516
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
4517
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
4518
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
4547
4519
|
|
|
4548
|
-
From `Task` — the full table stands on [Subtasks](
|
|
4520
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
4549
4521
|
|
|
4550
4522
|
| Prop | Type | Default | Description |
|
|
4551
4523
|
|---|---|---|---|
|
|
4552
|
-
| [`id`](
|
|
4553
|
-
| [`color`](
|
|
4554
|
-
| [`name`](
|
|
4524
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
4525
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
4526
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
4555
4527
|
|
|
4556
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
4528
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
4557
4529
|
|
|
4558
4530
|
| Prop | Type | Default | Description |
|
|
4559
4531
|
|---|---|---|---|
|
|
4560
|
-
| [`initialView`](
|
|
4532
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
4561
4533
|
|
|
4562
|
-
From `ScheduleView` — the full table stands on [View](
|
|
4534
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
4563
4535
|
|
|
4564
4536
|
| Prop | Type | Default | Description |
|
|
4565
4537
|
|---|---|---|---|
|
|
4566
|
-
| [`domain`](
|
|
4538
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
4567
4539
|
|
|
4568
4540
|
### Pan and zoom
|
|
4569
4541
|
|
|
@@ -4573,11 +4545,9 @@ Moving through a plan with the gestures of any scrolling surface: drag, wheel, C
|
|
|
4573
4545
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
4574
4546
|
```
|
|
4575
4547
|
|
|
4576
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/pan-and-zoom/
|
|
4577
|
-
|
|
4578
4548
|
Dragging the background pans through time and through the lanes. The wheel scrolls the lanes and hands the scroll back to the page at their end; Shift with the wheel pans through time; Ctrl or ⌘ with the wheel, or a pinch, zooms around the pointer.
|
|
4579
4549
|
|
|
4580
|
-
No intent is raised: pan and zoom change the visible span and nothing else ([ADR-0001](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0001-affine-scale-contract.md)). The span is part of the schedule's view, which `onViewChange` reports at most once per frame - see [View](
|
|
4550
|
+
No intent is raised: pan and zoom change the visible span and nothing else ([ADR-0001](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0001-affine-scale-contract.md)). The span is part of the schedule's view, which `onViewChange` reports at most once per frame - see [View](#view) and [Linked schedules](#linked-schedules).
|
|
4581
4551
|
|
|
4582
4552
|
#### Examples
|
|
4583
4553
|
|
|
@@ -4637,69 +4607,69 @@ export default function PanAndZoom() {
|
|
|
4637
4607
|
| `Home / End` | The first or last subtask on the lane; the view pans to bring it in. |
|
|
4638
4608
|
| `PageUp / PageDown` | Along the lane by about a tenth of the visible span, the view following. |
|
|
4639
4609
|
|
|
4640
|
-
The keys of [First schedule](
|
|
4610
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
4641
4611
|
|
|
4642
4612
|
#### Props on this page
|
|
4643
4613
|
|
|
4644
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
4614
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
4645
4615
|
|
|
4646
4616
|
| Prop | Type | Default | Description |
|
|
4647
4617
|
|---|---|---|---|
|
|
4648
|
-
| [`height`](
|
|
4649
|
-
| [`zoomLimits`](
|
|
4650
|
-
| [`children`](
|
|
4618
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
4619
|
+
| [`zoomLimits`](#first-schedule) | [`ZoomLimits`](#first-schedule) | one hour to 28 days | The narrowest and widest time span zoom may reach, in milliseconds. |
|
|
4620
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
4651
4621
|
|
|
4652
4622
|
###### Accessibility
|
|
4653
4623
|
|
|
4654
4624
|
| Prop | Type | Default | Description |
|
|
4655
4625
|
|---|---|---|---|
|
|
4656
|
-
| [`ariaLabel`](
|
|
4626
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
4657
4627
|
|
|
4658
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
4628
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
4659
4629
|
|
|
4660
4630
|
| Prop | Type | Default | Description |
|
|
4661
4631
|
|---|---|---|---|
|
|
4662
|
-
| [`id`](
|
|
4663
|
-
| [`label`](
|
|
4632
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
4633
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
4664
4634
|
|
|
4665
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
4635
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
4666
4636
|
|
|
4667
4637
|
| Prop | Type | Default | Description |
|
|
4668
4638
|
|---|---|---|---|
|
|
4669
|
-
| [`data`](
|
|
4670
|
-
| [`tasks`](
|
|
4639
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
4640
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
4671
4641
|
|
|
4672
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
4642
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
4673
4643
|
|
|
4674
4644
|
| Prop | Type | Default | Description |
|
|
4675
4645
|
|---|---|---|---|
|
|
4676
|
-
| [`id`](
|
|
4677
|
-
| [`task`](
|
|
4678
|
-
| [`lane`](
|
|
4679
|
-
| [`from`](
|
|
4680
|
-
| [`to`](
|
|
4681
|
-
| [`leadIn`](
|
|
4682
|
-
| [`leadOut`](
|
|
4646
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
4647
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
4648
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
4649
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
4650
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
4651
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
4652
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
4683
4653
|
|
|
4684
|
-
From `Task` — the full table stands on [Subtasks](
|
|
4654
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
4685
4655
|
|
|
4686
4656
|
| Prop | Type | Default | Description |
|
|
4687
4657
|
|---|---|---|---|
|
|
4688
|
-
| [`id`](
|
|
4689
|
-
| [`color`](
|
|
4690
|
-
| [`name`](
|
|
4658
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
4659
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
4660
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
4691
4661
|
|
|
4692
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
4662
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
4693
4663
|
|
|
4694
4664
|
| Prop | Type | Default | Description |
|
|
4695
4665
|
|---|---|---|---|
|
|
4696
|
-
| [`initialView`](
|
|
4666
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
4697
4667
|
|
|
4698
|
-
From `ScheduleView` — the full table stands on [View](
|
|
4668
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
4699
4669
|
|
|
4700
4670
|
| Prop | Type | Default | Description |
|
|
4701
4671
|
|---|---|---|---|
|
|
4702
|
-
| [`domain`](
|
|
4672
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
4703
4673
|
|
|
4704
4674
|
## Reading
|
|
4705
4675
|
|
|
@@ -4713,8 +4683,6 @@ A click on a bar selects its whole task on every lane, so a planner sees every p
|
|
|
4713
4683
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
4714
4684
|
```
|
|
4715
4685
|
|
|
4716
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/selection/
|
|
4717
|
-
|
|
4718
4686
|
The schedule keeps the selection itself unless you pass `selectedTask`; then your state holds it and every change is reported. The report also names the subtask that was clicked, the one the editing grips belong to.
|
|
4719
4687
|
|
|
4720
4688
|
Selection and hover are two different marks: the selected task is outlined, the one under the pointer washed, and both show at once.
|
|
@@ -4856,91 +4824,91 @@ export default function ControlTheSelection() {
|
|
|
4856
4824
|
| `Enter or Space` | Selects the active subtask's task, as a click does. |
|
|
4857
4825
|
| `Escape` | Lets go of the active subtask. |
|
|
4858
4826
|
|
|
4859
|
-
The keys of [First schedule](
|
|
4827
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
4860
4828
|
|
|
4861
4829
|
#### Props on this page
|
|
4862
4830
|
|
|
4863
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
4831
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
4864
4832
|
|
|
4865
4833
|
| Prop | Type | Default | Description |
|
|
4866
4834
|
|---|---|---|---|
|
|
4867
|
-
| [`height`](
|
|
4868
|
-
| [`selectedTask`](
|
|
4869
|
-
| [`onSelectedTaskChange`](
|
|
4870
|
-
| [`children`](
|
|
4835
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
4836
|
+
| [`selectedTask`](#first-schedule) | `string \| null` | — | The selected task, controlled. Leave it out and the schedule keeps the selection itself. |
|
|
4837
|
+
| [`onSelectedTaskChange`](#first-schedule) | `(task: string \| null, subtask: string \| null) => void` | — | Called when a click selects a task or clears the selection, with the subtask that was clicked - null where the click was on a dependency or on nothing. It is called again when another subtask of the same task is clicked. |
|
|
4838
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
4871
4839
|
|
|
4872
4840
|
###### Accessibility
|
|
4873
4841
|
|
|
4874
4842
|
| Prop | Type | Default | Description |
|
|
4875
4843
|
|---|---|---|---|
|
|
4876
|
-
| [`ariaLabel`](
|
|
4844
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
4877
4845
|
|
|
4878
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
4846
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
4879
4847
|
|
|
4880
4848
|
| Prop | Type | Default | Description |
|
|
4881
4849
|
|---|---|---|---|
|
|
4882
|
-
| [`id`](
|
|
4883
|
-
| [`label`](
|
|
4850
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
4851
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
4884
4852
|
|
|
4885
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
4853
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
4886
4854
|
|
|
4887
4855
|
| Prop | Type | Default | Description |
|
|
4888
4856
|
|---|---|---|---|
|
|
4889
|
-
| [`data`](
|
|
4890
|
-
| [`tasks`](
|
|
4857
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
4858
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
4891
4859
|
|
|
4892
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
4860
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
4893
4861
|
|
|
4894
4862
|
| Prop | Type | Default | Description |
|
|
4895
4863
|
|---|---|---|---|
|
|
4896
|
-
| [`id`](
|
|
4897
|
-
| [`task`](
|
|
4898
|
-
| [`lane`](
|
|
4899
|
-
| [`from`](
|
|
4900
|
-
| [`to`](
|
|
4901
|
-
| [`leadIn`](
|
|
4902
|
-
| [`leadOut`](
|
|
4864
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
4865
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
4866
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
4867
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
4868
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
4869
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
4870
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
4903
4871
|
|
|
4904
|
-
From `Task` — the full table stands on [Subtasks](
|
|
4872
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
4905
4873
|
|
|
4906
4874
|
| Prop | Type | Default | Description |
|
|
4907
4875
|
|---|---|---|---|
|
|
4908
|
-
| [`id`](
|
|
4909
|
-
| [`color`](
|
|
4910
|
-
| [`name`](
|
|
4876
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
4877
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
4878
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
4911
4879
|
|
|
4912
|
-
From `DependenciesProps` — the full table stands on [Dependencies](
|
|
4880
|
+
From `DependenciesProps` — the full table stands on [Dependencies](#dependencies).
|
|
4913
4881
|
|
|
4914
4882
|
| Prop | Type | Default | Description |
|
|
4915
4883
|
|---|---|---|---|
|
|
4916
|
-
| [`data`](
|
|
4884
|
+
| [`data`](#dependencies) *required* | `readonly `[`Dependency`](#dependencies)`[]` | — | The dependencies, as the caller holds them. |
|
|
4917
4885
|
|
|
4918
|
-
From `Dependency` — the full table stands on [Dependencies](
|
|
4886
|
+
From `Dependency` — the full table stands on [Dependencies](#dependencies).
|
|
4919
4887
|
|
|
4920
4888
|
| Prop | Type | Default | Description |
|
|
4921
4889
|
|---|---|---|---|
|
|
4922
|
-
| [`id`](
|
|
4923
|
-
| [`from`](
|
|
4924
|
-
| [`to`](
|
|
4925
|
-
| [`lag`](
|
|
4890
|
+
| [`id`](#dependencies) *required* | `string` | — | The caller's identity of the dependency. |
|
|
4891
|
+
| [`from`](#dependencies) *required* | `string` | — | The id of the subtask it leaves. |
|
|
4892
|
+
| [`to`](#dependencies) *required* | `string` | — | The id of the subtask it arrives at. |
|
|
4893
|
+
| [`lag`](#dependencies) *required* | `number` | — | The least time between the two anchors; zero where the successor may begin as soon as the predecessor ends. |
|
|
4926
4894
|
|
|
4927
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
4895
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
4928
4896
|
|
|
4929
4897
|
| Prop | Type | Default | Description |
|
|
4930
4898
|
|---|---|---|---|
|
|
4931
|
-
| [`initialView`](
|
|
4899
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
4932
4900
|
|
|
4933
|
-
From `ScheduleView` — the full table stands on [View](
|
|
4901
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
4934
4902
|
|
|
4935
4903
|
| Prop | Type | Default | Description |
|
|
4936
4904
|
|---|---|---|---|
|
|
4937
|
-
| [`domain`](
|
|
4905
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
4938
4906
|
|
|
4939
4907
|
#### Known limits
|
|
4940
4908
|
|
|
4941
4909
|
- One task at a time: there is no multiple selection.
|
|
4942
4910
|
|
|
4943
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
4911
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
4944
4912
|
|
|
4945
4913
|
### Interactions
|
|
4946
4914
|
|
|
@@ -4950,8 +4918,6 @@ Reports what the pointer does on the plan - hover, click, right-click - with wha
|
|
|
4950
4918
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
4951
4919
|
```
|
|
4952
4920
|
|
|
4953
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/interactions/
|
|
4954
|
-
|
|
4955
4921
|
A hit names a subtask together with the part of it (lead-in, main time, lead-out), a dependency, a lane, or nothing.
|
|
4956
4922
|
|
|
4957
4923
|
While `onInteraction` is set, a right-click opens no browser menu: your application is expected to answer it.
|
|
@@ -5146,7 +5112,7 @@ export default function OpenAContextMenu() {
|
|
|
5146
5112
|
|
|
5147
5113
|
#### Keyboard
|
|
5148
5114
|
|
|
5149
|
-
The keys of [First schedule](
|
|
5115
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
5150
5116
|
|
|
5151
5117
|
#### API
|
|
5152
5118
|
|
|
@@ -5154,12 +5120,12 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
|
|
|
5154
5120
|
|
|
5155
5121
|
| Prop | Type | Default | Description |
|
|
5156
5122
|
|---|---|---|---|
|
|
5157
|
-
| `type` *required* | `"click" \| "contextmenu" \| "hover"` | — | `"hover"` is reported when the target under the pointer changes, not on every movement.<br>Shown in: [Report what the pointer is on](
|
|
5158
|
-
| `hit` *required* |
|
|
5159
|
-
| `clientX` *required* | `number` | — | The pointer's horizontal client coordinate - where a `ContextMenu` opens.<br>Shown in: [Open a context menu](
|
|
5160
|
-
| `clientY` *required* | `number` | — | The pointer's vertical client coordinate.<br>Shown in: [Open a context menu](
|
|
5161
|
-
| `time` *required* | `number` | — | The wall-clock instant under the pointer.<br>Shown in: [Report what the pointer is on](
|
|
5162
|
-
| `lane` *required* | `string \| null` | — | The lane under the pointer, or null below the last one.<br>Shown in: [Report what the pointer is on](
|
|
5123
|
+
| `type` *required* | `"click" \| "contextmenu" \| "hover"` | — | `"hover"` is reported when the target under the pointer changes, not on every movement.<br>Shown in: [Report what the pointer is on](#interactions), [Open a context menu](#interactions), [Show a detail panel instead (Tooltip)](#tooltip) and 1 more |
|
|
5124
|
+
| `hit` *required* | `ScheduleHit` | — | What the pointer is on.<br>Shown in: [Report what the pointer is on](#interactions), [Open a context menu](#interactions), [Show a detail panel instead (Tooltip)](#tooltip) and 2 more |
|
|
5125
|
+
| `clientX` *required* | `number` | — | The pointer's horizontal client coordinate - where a `ContextMenu` opens.<br>Shown in: [Open a context menu](#interactions), [Place a mark of your own (The handle)](#the-handle), [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
5126
|
+
| `clientY` *required* | `number` | — | The pointer's vertical client coordinate.<br>Shown in: [Open a context menu](#interactions), [Place a mark of your own (The handle)](#the-handle), [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
5127
|
+
| `time` *required* | `number` | — | The wall-clock instant under the pointer.<br>Shown in: [Report what the pointer is on](#interactions) |
|
|
5128
|
+
| `lane` *required* | `string \| null` | — | The lane under the pointer, or null below the last one.<br>Shown in: [Report what the pointer is on](#interactions) |
|
|
5163
5129
|
|
|
5164
5130
|
##### Types on this page
|
|
5165
5131
|
|
|
@@ -5184,8 +5150,6 @@ Names what the pointer rests on - a subtask with its times and findings, a depen
|
|
|
5184
5150
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
5185
5151
|
```
|
|
5186
5152
|
|
|
5187
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/tooltip/
|
|
5188
|
-
|
|
5189
5153
|
Its words come from the wording of @umriss-ui/core and its numbers from its formats, so a provider switches it with everything else. It steps aside while a drag is in flight and is placed where it has room.
|
|
5190
5154
|
|
|
5191
5155
|
The keyboard's active subtask shows the same tooltip as the pointer.
|
|
@@ -5538,7 +5502,7 @@ export default function SayWhatABarCoversAndALineJoins() {
|
|
|
5538
5502
|
|
|
5539
5503
|
#### Keyboard
|
|
5540
5504
|
|
|
5541
|
-
The keys of [First schedule](
|
|
5505
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
5542
5506
|
|
|
5543
5507
|
#### API
|
|
5544
5508
|
|
|
@@ -5546,17 +5510,17 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
|
|
|
5546
5510
|
|
|
5547
5511
|
| Prop | Type | Default | Description |
|
|
5548
5512
|
|---|---|---|---|
|
|
5549
|
-
| `kind` *required* | `"subtask" \| "milestone" \| "dependency"` | — | A subtask is hovered. A milestone is hovered. A dependency is hovered.<br>Shown in: [Write your own tooltip content](
|
|
5550
|
-
| `subtask` | [`Subtask`](
|
|
5551
|
-
| `task` | [`Task`](
|
|
5552
|
-
| `overlapping` | `readonly `[`Subtask`](
|
|
5553
|
-
| `violatedDependencies` | `readonly `[`ViolatedDependency`](
|
|
5554
|
-
| `blocked` | `readonly `[`BlockedTime`](
|
|
5555
|
-
| `milestone` | [`Milestone`](
|
|
5556
|
-
| `dependency` | [`Dependency`](
|
|
5557
|
-
| `from` | [`Subtask`](
|
|
5558
|
-
| `to` | [`Subtask`](
|
|
5559
|
-
| `violated` | [`ViolatedDependency`](
|
|
5513
|
+
| `kind` *required* | `"subtask" \| "milestone" \| "dependency"` | — | A subtask is hovered. A milestone is hovered. A dependency is hovered.<br>Shown in: [Write your own tooltip content](#tooltip), [Say what a bar covers and a line joins](#tooltip), [Say what a milestone is in your own tooltip (Milestones)](#milestones) |
|
|
5514
|
+
| `subtask` | [`Subtask`](#subtasks) | — | The hovered subtask.<br>Shown in: [Say what a bar covers and a line joins](#tooltip), [Say what a milestone is in your own tooltip (Milestones)](#milestones) |
|
|
5515
|
+
| `task` | [`Task`](#subtasks)` \| undefined` | — | Its task, where the tasks name it.<br>Shown in: [Write your own tooltip content](#tooltip) |
|
|
5516
|
+
| `overlapping` | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks it overlaps with on its lane.<br>Shown in: [Write your own tooltip content](#tooltip) |
|
|
5517
|
+
| `violatedDependencies` | `readonly `[`ViolatedDependency`](#findings-as-data)`[]` | — | The violated dependencies leaving or reaching it.<br>Shown in: [Write your own tooltip content](#tooltip) |
|
|
5518
|
+
| `blocked` | `readonly `[`BlockedTime`](#blocked-time)`[]` | — | The blocked time it covers on its lane.<br>Shown in: [Say what a bar covers and a line joins](#tooltip) |
|
|
5519
|
+
| `milestone` | [`Milestone`](#milestones) | — | The hovered milestone.<br>Shown in: [Say what a milestone is in your own tooltip (Milestones)](#milestones) |
|
|
5520
|
+
| `dependency` | [`Dependency`](#dependencies) | — | The hovered dependency.<br>Shown in: [Say what a bar covers and a line joins](#tooltip) |
|
|
5521
|
+
| `from` | [`Subtask`](#subtasks)` \| undefined` | — | The subtask it leaves.<br>Shown in: [Say what a bar covers and a line joins](#tooltip) |
|
|
5522
|
+
| `to` | [`Subtask`](#subtasks)` \| undefined` | — | The subtask it reaches.<br>Shown in: [Say what a bar covers and a line joins](#tooltip) |
|
|
5523
|
+
| `violated` | [`ViolatedDependency`](#findings-as-data)` \| undefined` | — | Its finding, where it is violated.<br>Shown in: [Write your own tooltip content](#tooltip) |
|
|
5560
5524
|
|
|
5561
5525
|
### View
|
|
5562
5526
|
|
|
@@ -5566,9 +5530,7 @@ How the planner is looking at the plan - the span in view and the folded lane gr
|
|
|
5566
5530
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
5567
5531
|
```
|
|
5568
5532
|
|
|
5569
|
-
|
|
5570
|
-
|
|
5571
|
-
The schedule keeps its view itself and puts it nowhere, not in the address and not in any storage. `view` on what [`useSchedule`](#/api/useSchedule) hands back holds it, and `onViewChange` reports every change the planner makes to it - a pan or zoom at most once per frame; keep it where the application keeps things and go back to it with `setView`.
|
|
5533
|
+
The schedule keeps its view itself and puts it nowhere, not in the address and not in any storage. `view` on what [`useSchedule`](#api-index-1) hands back holds it, and `onViewChange` reports every change the planner makes to it - a pan or zoom at most once per frame; keep it where the application keeps things and go back to it with `setView`.
|
|
5572
5534
|
|
|
5573
5535
|
`initialView` is the start, read once: a different value on a later render is ignored. `setView(view)` goes to a whole view at once, and what it leaves out goes back to its default; the same view again changes nothing, and `onViewChange` does not hear it. Without a span the schedule shows the extent of its subtasks, within `zoomLimits`. A group no `LaneGroup` declares falls out.
|
|
5574
5536
|
|
|
@@ -5680,7 +5642,7 @@ export default function KeepAndRestore() {
|
|
|
5680
5642
|
|
|
5681
5643
|
#### Keyboard
|
|
5682
5644
|
|
|
5683
|
-
The keys of [First schedule](
|
|
5645
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
5684
5646
|
|
|
5685
5647
|
#### API
|
|
5686
5648
|
|
|
@@ -5688,20 +5650,20 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
|
|
|
5688
5650
|
|
|
5689
5651
|
| Prop | Type | Default | Description |
|
|
5690
5652
|
|---|---|---|---|
|
|
5691
|
-
| `initialView` |
|
|
5653
|
+
| `initialView` | `ScheduleView` | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision.<br>Shown in: [Keep and restore a view](#view), [The smallest schedule (Installation)](#installation), [A day of tours (First schedule)](#first-schedule) and 78 more |
|
|
5692
5654
|
|
|
5693
5655
|
###### Events
|
|
5694
5656
|
|
|
5695
5657
|
| Prop | Type | Default | Description |
|
|
5696
5658
|
|---|---|---|---|
|
|
5697
|
-
| `onViewChange` | `(view:
|
|
5659
|
+
| `onViewChange` | `(view: ``ScheduleView``) => void` | — | Every change the planner makes, once, always the whole view - the one to keep, or to hand another schedule's `setView`. A pan or zoom is reported at most once per frame. Not called for the view the schedule starts with, nor for one `setView` applies.<br>Shown in: [Keep two schedules in step (Linked schedules)](#linked-schedules), [Read a rota beside the incidents (Linked schedules)](#linked-schedules) |
|
|
5698
5660
|
|
|
5699
5661
|
##### `ScheduleView`
|
|
5700
5662
|
|
|
5701
5663
|
| Prop | Type | Default | Description |
|
|
5702
5664
|
|---|---|---|---|
|
|
5703
|
-
| `domain` | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`.<br>Shown in: [Keep and restore a view](
|
|
5704
|
-
| `folded` | `readonly string[]` | — | The **Lane group**s that are folded, by id. An id no group carries falls out. A folded outer group hides the inner ones without their ids leaving the list, so unfolding it gives back the view that was there.<br>Shown in: [Fold groups from outside (Lane groups)](
|
|
5665
|
+
| `domain` | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`.<br>Shown in: [Keep and restore a view](#view), [The smallest schedule (Installation)](#installation), [A day of tours (First schedule)](#first-schedule) and 77 more |
|
|
5666
|
+
| `folded` | `readonly string[]` | — | The **Lane group**s that are folded, by id. An id no group carries falls out. A folded outer group hides the inner ones without their ids leaving the list, so unfolding it gives back the view that was there.<br>Shown in: [Fold groups from outside (Lane groups)](#lane-groups), [Read a folded group (Lane groups)](#lane-groups), [Start with groups folded (Lane groups)](#lane-groups) |
|
|
5705
5667
|
|
|
5706
5668
|
### Linked schedules
|
|
5707
5669
|
|
|
@@ -5711,9 +5673,7 @@ Keeps two schedules on the same hours: pan or zoom one and the other follows (al
|
|
|
5711
5673
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
5712
5674
|
```
|
|
5713
5675
|
|
|
5714
|
-
|
|
5715
|
-
|
|
5716
|
-
Each schedule has its own [`useSchedule`](#/api/useSchedule). Send what one reports to the other's `setView`, in both directions: the other goes there at once, without a remount, and `setView` is not reported, so the two never answer each other.
|
|
5676
|
+
Each schedule has its own [`useSchedule`](#api-index-1). Send what one reports to the other's `setView`, in both directions: the other goes there at once, without a remount, and `setView` is not reported, so the two never answer each other.
|
|
5717
5677
|
|
|
5718
5678
|
While a drag is in flight the two can stand a frame apart; they settle as soon as it ends.
|
|
5719
5679
|
|
|
@@ -5956,81 +5916,81 @@ export default function RotaBesideIncidents() {
|
|
|
5956
5916
|
|
|
5957
5917
|
#### Keyboard
|
|
5958
5918
|
|
|
5959
|
-
The keys of [First schedule](
|
|
5919
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
5960
5920
|
|
|
5961
5921
|
#### Props on this page
|
|
5962
5922
|
|
|
5963
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
5923
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
5964
5924
|
|
|
5965
5925
|
| Prop | Type | Default | Description |
|
|
5966
5926
|
|---|---|---|---|
|
|
5967
|
-
| [`height`](
|
|
5968
|
-
| [`children`](
|
|
5927
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
5928
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
5969
5929
|
|
|
5970
5930
|
###### Accessibility
|
|
5971
5931
|
|
|
5972
5932
|
| Prop | Type | Default | Description |
|
|
5973
5933
|
|---|---|---|---|
|
|
5974
|
-
| [`ariaLabel`](
|
|
5934
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
5975
5935
|
|
|
5976
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
5936
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
5977
5937
|
|
|
5978
5938
|
| Prop | Type | Default | Description |
|
|
5979
5939
|
|---|---|---|---|
|
|
5980
|
-
| [`id`](
|
|
5981
|
-
| [`label`](
|
|
5940
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
5941
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
5982
5942
|
|
|
5983
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
5943
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
5984
5944
|
|
|
5985
5945
|
| Prop | Type | Default | Description |
|
|
5986
5946
|
|---|---|---|---|
|
|
5987
|
-
| [`data`](
|
|
5988
|
-
| [`tasks`](
|
|
5947
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
5948
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
5989
5949
|
|
|
5990
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
5950
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
5991
5951
|
|
|
5992
5952
|
| Prop | Type | Default | Description |
|
|
5993
5953
|
|---|---|---|---|
|
|
5994
|
-
| [`id`](
|
|
5995
|
-
| [`task`](
|
|
5996
|
-
| [`lane`](
|
|
5997
|
-
| [`from`](
|
|
5998
|
-
| [`to`](
|
|
5999
|
-
| [`leadIn`](
|
|
6000
|
-
| [`leadOut`](
|
|
6001
|
-
| [`name`](
|
|
5954
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
5955
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
5956
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
5957
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
5958
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
5959
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
5960
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
5961
|
+
| [`name`](#subtasks) | `string` | — | What the subtask is called, where the schedule names it. |
|
|
6002
5962
|
|
|
6003
|
-
From `Task` — the full table stands on [Subtasks](
|
|
5963
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
6004
5964
|
|
|
6005
5965
|
| Prop | Type | Default | Description |
|
|
6006
5966
|
|---|---|---|---|
|
|
6007
|
-
| [`id`](
|
|
6008
|
-
| [`color`](
|
|
6009
|
-
| [`name`](
|
|
5967
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
5968
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
5969
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
6010
5970
|
|
|
6011
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
5971
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
6012
5972
|
|
|
6013
5973
|
| Prop | Type | Default | Description |
|
|
6014
5974
|
|---|---|---|---|
|
|
6015
|
-
| [`initialView`](
|
|
5975
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
6016
5976
|
|
|
6017
5977
|
###### Events
|
|
6018
5978
|
|
|
6019
5979
|
| Prop | Type | Default | Description |
|
|
6020
5980
|
|---|---|---|---|
|
|
6021
|
-
| [`onViewChange`](
|
|
5981
|
+
| [`onViewChange`](#view) | `(view: `[`ScheduleView`](#view)`) => void` | — | Every change the planner makes, once, always the whole view - the one to keep, or to hand another schedule's `setView`. A pan or zoom is reported at most once per frame. Not called for the view the schedule starts with, nor for one `setView` applies. |
|
|
6022
5982
|
|
|
6023
|
-
From `ScheduleView` — the full table stands on [View](
|
|
5983
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
6024
5984
|
|
|
6025
5985
|
| Prop | Type | Default | Description |
|
|
6026
5986
|
|---|---|---|---|
|
|
6027
|
-
| [`domain`](
|
|
5987
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
6028
5988
|
|
|
6029
5989
|
#### Known limits
|
|
6030
5990
|
|
|
6031
5991
|
- Only the view is shared - the span and the folded groups, not the selection, the hover or the vertical scroll.
|
|
6032
5992
|
|
|
6033
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
5993
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
6034
5994
|
|
|
6035
5995
|
### The handle
|
|
6036
5996
|
|
|
@@ -6040,8 +6000,6 @@ Converts between a point on the screen and a time on a lane, so marks of your ow
|
|
|
6040
6000
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
6041
6001
|
```
|
|
6042
6002
|
|
|
6043
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/handle/
|
|
6044
|
-
|
|
6045
6003
|
The handle holds three functions and nothing else: `clientPointOf(time, lane?)`, `positionAt(clientX, clientY)` and `visibleDomain()`. Everything else the schedule does is props.
|
|
6046
6004
|
|
|
6047
6005
|
Place your marks again whenever `view.domain` changes.
|
|
@@ -6137,82 +6095,82 @@ export default function PlaceAMark() {
|
|
|
6137
6095
|
|
|
6138
6096
|
#### Keyboard
|
|
6139
6097
|
|
|
6140
|
-
The keys of [First schedule](
|
|
6098
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
6141
6099
|
|
|
6142
6100
|
#### Props on this page
|
|
6143
6101
|
|
|
6144
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
6102
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
6145
6103
|
|
|
6146
6104
|
| Prop | Type | Default | Description |
|
|
6147
6105
|
|---|---|---|---|
|
|
6148
|
-
| [`ref`](
|
|
6149
|
-
| [`height`](
|
|
6150
|
-
| [`children`](
|
|
6106
|
+
| [`ref`](#first-schedule) | `Ref<`[`ScheduleHandle`](#first-schedule)`>` | — | Receives the `ScheduleHandle` - not an element. |
|
|
6107
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
6108
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
6151
6109
|
|
|
6152
6110
|
###### Events
|
|
6153
6111
|
|
|
6154
6112
|
| Prop | Type | Default | Description |
|
|
6155
6113
|
|---|---|---|---|
|
|
6156
|
-
| [`onInteraction`](
|
|
6114
|
+
| [`onInteraction`](#first-schedule) | `(interaction: `[`ScheduleInteraction`](#interactions)`) => void` | — | Click, context menu and hover, with what the pointer is on and where. While it is set, a right-click opens no browser menu. |
|
|
6157
6115
|
|
|
6158
6116
|
###### Accessibility
|
|
6159
6117
|
|
|
6160
6118
|
| Prop | Type | Default | Description |
|
|
6161
6119
|
|---|---|---|---|
|
|
6162
|
-
| [`ariaLabel`](
|
|
6120
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
6163
6121
|
|
|
6164
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
6122
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
6165
6123
|
|
|
6166
6124
|
| Prop | Type | Default | Description |
|
|
6167
6125
|
|---|---|---|---|
|
|
6168
|
-
| [`id`](
|
|
6169
|
-
| [`label`](
|
|
6126
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
6127
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
6170
6128
|
|
|
6171
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
6129
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
6172
6130
|
|
|
6173
6131
|
| Prop | Type | Default | Description |
|
|
6174
6132
|
|---|---|---|---|
|
|
6175
|
-
| [`data`](
|
|
6176
|
-
| [`tasks`](
|
|
6133
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
6134
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
6177
6135
|
|
|
6178
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
6136
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
6179
6137
|
|
|
6180
6138
|
| Prop | Type | Default | Description |
|
|
6181
6139
|
|---|---|---|---|
|
|
6182
|
-
| [`id`](
|
|
6183
|
-
| [`task`](
|
|
6184
|
-
| [`lane`](
|
|
6185
|
-
| [`from`](
|
|
6186
|
-
| [`to`](
|
|
6187
|
-
| [`leadIn`](
|
|
6188
|
-
| [`leadOut`](
|
|
6140
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
6141
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
6142
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
6143
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
6144
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
6145
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
6146
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
6189
6147
|
|
|
6190
|
-
From `Task` — the full table stands on [Subtasks](
|
|
6148
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
6191
6149
|
|
|
6192
6150
|
| Prop | Type | Default | Description |
|
|
6193
6151
|
|---|---|---|---|
|
|
6194
|
-
| [`id`](
|
|
6195
|
-
| [`color`](
|
|
6196
|
-
| [`name`](
|
|
6152
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
6153
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
6154
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
6197
6155
|
|
|
6198
|
-
From `ScheduleInteraction` — the full table stands on [Interactions](
|
|
6156
|
+
From `ScheduleInteraction` — the full table stands on [Interactions](#interactions).
|
|
6199
6157
|
|
|
6200
6158
|
| Prop | Type | Default | Description |
|
|
6201
6159
|
|---|---|---|---|
|
|
6202
|
-
| [`clientX`](
|
|
6203
|
-
| [`clientY`](
|
|
6160
|
+
| [`clientX`](#interactions) *required* | `number` | — | The pointer's horizontal client coordinate - where a `ContextMenu` opens. |
|
|
6161
|
+
| [`clientY`](#interactions) *required* | `number` | — | The pointer's vertical client coordinate. |
|
|
6204
6162
|
|
|
6205
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
6163
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
6206
6164
|
|
|
6207
6165
|
| Prop | Type | Default | Description |
|
|
6208
6166
|
|---|---|---|---|
|
|
6209
|
-
| [`initialView`](
|
|
6167
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
6210
6168
|
|
|
6211
|
-
From `ScheduleView` — the full table stands on [View](
|
|
6169
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
6212
6170
|
|
|
6213
6171
|
| Prop | Type | Default | Description |
|
|
6214
6172
|
|---|---|---|---|
|
|
6215
|
-
| [`domain`](
|
|
6173
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
6216
6174
|
|
|
6217
6175
|
### Findings as data
|
|
6218
6176
|
|
|
@@ -6222,9 +6180,7 @@ Lists what is wrong with a plan - double bookings on a lane, dependencies that d
|
|
|
6222
6180
|
import { findings, overlaps, violatedDependencies, inBlockedTime } from "@umriss-ui/schedule";
|
|
6223
6181
|
```
|
|
6224
6182
|
|
|
6225
|
-
|
|
6226
|
-
|
|
6227
|
-
`findings(subtasks, dependencies, blocked)` returns all three kinds; [`overlaps`](#/api/overlaps), [`violatedDependencies`](#/api/violatedDependencies) and [`inBlockedTime`](#/api/inBlockedTime) return one each. They are pure functions: run them wherever the data changes, with or without a schedule on screen.
|
|
6183
|
+
`findings(subtasks, dependencies, blocked)` returns all three kinds; [`overlaps`](#api-index-1), [`violatedDependencies`](#api-index-1) and [`inBlockedTime`](#api-index-1) return one each. They are pure functions: run them wherever the data changes, with or without a schedule on screen.
|
|
6228
6184
|
|
|
6229
6185
|
Lead-in and lead-out count as occupied time; touching at a shared edge is no overlap.
|
|
6230
6186
|
|
|
@@ -6232,7 +6188,7 @@ Lead-in and lead-out count as occupied time; touching at a shared edge is no ove
|
|
|
6232
6188
|
|
|
6233
6189
|
##### List the findings
|
|
6234
6190
|
|
|
6235
|
-
[`findings`](
|
|
6191
|
+
[`findings`](#api-index-1) returns what the schedule marks - overlaps, violated dependencies, work in blocked time - as data for a list beside it.
|
|
6236
6192
|
|
|
6237
6193
|
```tsx
|
|
6238
6194
|
import { Stack, Text } from "@umriss-ui/core";
|
|
@@ -6299,7 +6255,7 @@ export default function ListTheFindings() {
|
|
|
6299
6255
|
|
|
6300
6256
|
##### Say when there is nothing to fix
|
|
6301
6257
|
|
|
6302
|
-
When all three lists [`findings`](
|
|
6258
|
+
When all three lists [`findings`](#api-index-1) returns are empty, say so plainly instead of showing an empty list.
|
|
6303
6259
|
|
|
6304
6260
|
```tsx
|
|
6305
6261
|
import { EmptyState, Stack } from "@umriss-ui/core";
|
|
@@ -6335,7 +6291,7 @@ export default function NothingToFix() {
|
|
|
6335
6291
|
|
|
6336
6292
|
##### Count the findings per kind
|
|
6337
6293
|
|
|
6338
|
-
[`overlaps`](
|
|
6294
|
+
[`overlaps`](#api-index-1) and [`violatedDependencies`](#api-index-1) are the halves of [`findings`](#api-index-1) on their own - here as counts above the day's legs.
|
|
6339
6295
|
|
|
6340
6296
|
```tsx
|
|
6341
6297
|
import { Badge, Stack } from "@umriss-ui/core";
|
|
@@ -6393,7 +6349,7 @@ export default function CountPerKind() {
|
|
|
6393
6349
|
|
|
6394
6350
|
#### Keyboard
|
|
6395
6351
|
|
|
6396
|
-
The keys of [First schedule](
|
|
6352
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
6397
6353
|
|
|
6398
6354
|
#### API
|
|
6399
6355
|
|
|
@@ -6401,36 +6357,36 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
|
|
|
6401
6357
|
|
|
6402
6358
|
| Prop | Type | Default | Description |
|
|
6403
6359
|
|---|---|---|---|
|
|
6404
|
-
| `lane` *required* | `string` | — | The lane both sit on.<br>Shown in: [List the findings](
|
|
6405
|
-
| `first` *required* | `string` | — | The subtask that starts earlier (lead-in included); on a tie, the one that stands first in the data.<br>Shown in: [List the findings](
|
|
6406
|
-
| `second` *required* | `string` | — | The other one.<br>Shown in: [List the findings](
|
|
6407
|
-
| `from` *required* | `number` | — | Where the covering begins.<br>Shown in: [List the findings](
|
|
6408
|
-
| `to` *required* | `number` | — | Where it ends.<br>Shown in: [List the findings](
|
|
6360
|
+
| `lane` *required* | `string` | — | The lane both sit on.<br>Shown in: [List the findings](#findings-as-data), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) |
|
|
6361
|
+
| `first` *required* | `string` | — | The subtask that starts earlier (lead-in included); on a tie, the one that stands first in the data.<br>Shown in: [List the findings](#findings-as-data), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) |
|
|
6362
|
+
| `second` *required* | `string` | — | The other one.<br>Shown in: [List the findings](#findings-as-data), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) |
|
|
6363
|
+
| `from` *required* | `number` | — | Where the covering begins.<br>Shown in: [List the findings](#findings-as-data) |
|
|
6364
|
+
| `to` *required* | `number` | — | Where it ends.<br>Shown in: [List the findings](#findings-as-data) |
|
|
6409
6365
|
|
|
6410
6366
|
##### `ViolatedDependency`
|
|
6411
6367
|
|
|
6412
6368
|
| Prop | Type | Default | Description |
|
|
6413
6369
|
|---|---|---|---|
|
|
6414
|
-
| `dependency` *required* | `string` | — | The id of the dependency.<br>Shown in: [List the findings](
|
|
6415
|
-
| `departure` *required* | `number` | — | When it leaves, by its anchor.<br>Shown in: [List the findings](
|
|
6416
|
-
| `arrival` *required* | `number` | — | When it has to have arrived, by its anchor.<br>Shown in: [List the findings](
|
|
6417
|
-
| `shortBy` *required* | `number` | — | How much time is missing: departure plus lag, minus arrival.<br>Shown in: [List the findings](
|
|
6370
|
+
| `dependency` *required* | `string` | — | The id of the dependency.<br>Shown in: [List the findings](#findings-as-data) |
|
|
6371
|
+
| `departure` *required* | `number` | — | When it leaves, by its anchor.<br>Shown in: [List the findings](#findings-as-data) |
|
|
6372
|
+
| `arrival` *required* | `number` | — | When it has to have arrived, by its anchor.<br>Shown in: [List the findings](#findings-as-data) |
|
|
6373
|
+
| `shortBy` *required* | `number` | — | How much time is missing: departure plus lag, minus arrival.<br>Shown in: [List the findings](#findings-as-data) |
|
|
6418
6374
|
|
|
6419
6375
|
##### `InBlockedTime`
|
|
6420
6376
|
|
|
6421
6377
|
| Prop | Type | Default | Description |
|
|
6422
6378
|
|---|---|---|---|
|
|
6423
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [List the findings](
|
|
6424
|
-
| `blocked` *required* | `string` | — | The id of the blocked time it covers.<br>Shown in: [List the findings](
|
|
6425
|
-
| `lane` *required* | `string` | — | The lane both are on.<br>Shown in: [Hand over the on-call week (Scenarios)](
|
|
6426
|
-
| `from` *required* | `number` | — | Where the covering begins.<br>Shown in: [List the findings](
|
|
6427
|
-
| `to` *required* | `number` | — | Where it ends.<br>Shown in: [List the findings](
|
|
6379
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [List the findings](#findings-as-data), [Block out leave and maintenance (Blocked time)](#blocked-time), [Check a sprint against the leave calendar (Blocked time)](#blocked-time) and 2 more |
|
|
6380
|
+
| `blocked` *required* | `string` | — | The id of the blocked time it covers.<br>Shown in: [List the findings](#findings-as-data), [Block out leave and maintenance (Blocked time)](#blocked-time), [Plan the sprint around leave (Scenarios)](#plan-the-sprint-around-leave) |
|
|
6381
|
+
| `lane` *required* | `string` | — | The lane both are on.<br>Shown in: [Hand over the on-call week (Scenarios)](#hand-over-the-on-call-week), [Plan the sprint around leave (Scenarios)](#plan-the-sprint-around-leave) |
|
|
6382
|
+
| `from` *required* | `number` | — | Where the covering begins.<br>Shown in: [List the findings](#findings-as-data), [Block out leave and maintenance (Blocked time)](#blocked-time), [Hand over the on-call week (Scenarios)](#hand-over-the-on-call-week) |
|
|
6383
|
+
| `to` *required* | `number` | — | Where it ends.<br>Shown in: [List the findings](#findings-as-data), [Block out leave and maintenance (Blocked time)](#blocked-time), [Hand over the on-call week (Scenarios)](#hand-over-the-on-call-week) |
|
|
6428
6384
|
|
|
6429
6385
|
#### Known limits
|
|
6430
6386
|
|
|
6431
6387
|
- Overlapping work is marked, not packed into sub-lanes; stacked overlap is not built yet.
|
|
6432
6388
|
|
|
6433
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
6389
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
6434
6390
|
|
|
6435
6391
|
## Editing
|
|
6436
6392
|
|
|
@@ -6444,11 +6400,9 @@ Drag a bar to a new time or onto another lane (also called drag-and-drop resched
|
|
|
6444
6400
|
import { useSchedule, applyIntent } from "@umriss-ui/schedule";
|
|
6445
6401
|
```
|
|
6446
6402
|
|
|
6447
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/
|
|
6448
|
-
|
|
6449
6403
|
Each name in `intents` enables one gesture. Without `intents` the schedule is read-only, and pressing a bar pans the plot.
|
|
6450
6404
|
|
|
6451
|
-
The schedule never changes your data ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)): `onIntent` reports a move and a lane change as values, and [`applyIntent`](
|
|
6405
|
+
The schedule never changes your data ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)): `onIntent` reports a move and a lane change as values, and [`applyIntent`](#api-index-1) is the arithmetic to apply them. A drop across lanes and time reports both, and your handler may apply them, refuse them, or apply one.
|
|
6452
6406
|
|
|
6453
6407
|
Held at the edge of the plot, a drag pans it along; Escape cancels the drag.
|
|
6454
6408
|
|
|
@@ -6456,7 +6410,7 @@ Held at the edge of the plot, a drag pans it along; Escape cancels the drag.
|
|
|
6456
6410
|
|
|
6457
6411
|
##### Move work in time
|
|
6458
6412
|
|
|
6459
|
-
List `move` in `intents` and apply what `onIntent` reports with [`applyIntent`](
|
|
6413
|
+
List `move` in `intents` and apply what `onIntent` reports with [`applyIntent`](#api-index-1); the plan changes only in your state.
|
|
6460
6414
|
|
|
6461
6415
|
```tsx
|
|
6462
6416
|
import { useState } from "react";
|
|
@@ -6564,7 +6518,7 @@ export default function MoveToAnotherLane() {
|
|
|
6564
6518
|
|
|
6565
6519
|
##### Refuse a move that double-books someone
|
|
6566
6520
|
|
|
6567
|
-
Your `onIntent` decides: here it applies a drop only when [`overlaps`](
|
|
6521
|
+
Your `onIntent` decides: here it applies a drop only when [`overlaps`](#api-index-1) finds no new double booking, and says why otherwise.
|
|
6568
6522
|
|
|
6569
6523
|
```tsx
|
|
6570
6524
|
import { useRef, useState } from "react";
|
|
@@ -6711,106 +6665,106 @@ export default function RefuseADoubleBooking() {
|
|
|
6711
6665
|
| `Alt+← Alt+→` | Proposes moving the active subtask one raster step earlier or later, stepping over blocked time. |
|
|
6712
6666
|
| `Escape` | Cancels a drag in flight: the ghost goes and nothing is reported. |
|
|
6713
6667
|
|
|
6714
|
-
The keys of [First schedule](
|
|
6668
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
6715
6669
|
|
|
6716
6670
|
#### Props on this page
|
|
6717
6671
|
|
|
6718
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
6672
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
6719
6673
|
|
|
6720
6674
|
| Prop | Type | Default | Description |
|
|
6721
6675
|
|---|---|---|---|
|
|
6722
|
-
| [`height`](
|
|
6723
|
-
| [`intents`](
|
|
6724
|
-
| [`children`](
|
|
6676
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
6677
|
+
| [`intents`](#first-schedule) | `readonly `[`IntentKind`](#first-schedule)`[]` | `[]` | The intents the caller handles. Each one enables its interaction; none leaves a read-only schedule ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)). |
|
|
6678
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
6725
6679
|
|
|
6726
6680
|
###### Events
|
|
6727
6681
|
|
|
6728
6682
|
| Prop | Type | Default | Description |
|
|
6729
6683
|
|---|---|---|---|
|
|
6730
|
-
| [`onIntent`](
|
|
6684
|
+
| [`onIntent`](#first-schedule) | `(intent: `[`Intent`](#first-schedule)`) => void` | — | Called once per intent when a drag ends. The data changes only if the caller changes it. |
|
|
6731
6685
|
|
|
6732
6686
|
###### Accessibility
|
|
6733
6687
|
|
|
6734
6688
|
| Prop | Type | Default | Description |
|
|
6735
6689
|
|---|---|---|---|
|
|
6736
|
-
| [`ariaLabel`](
|
|
6690
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
6737
6691
|
|
|
6738
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
6692
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
6739
6693
|
|
|
6740
6694
|
| Prop | Type | Default | Description |
|
|
6741
6695
|
|---|---|---|---|
|
|
6742
|
-
| [`id`](
|
|
6743
|
-
| [`label`](
|
|
6696
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
6697
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
6744
6698
|
|
|
6745
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
6699
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
6746
6700
|
|
|
6747
6701
|
| Prop | Type | Default | Description |
|
|
6748
6702
|
|---|---|---|---|
|
|
6749
|
-
| [`data`](
|
|
6750
|
-
| [`tasks`](
|
|
6703
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
6704
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
6751
6705
|
|
|
6752
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
6706
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
6753
6707
|
|
|
6754
6708
|
| Prop | Type | Default | Description |
|
|
6755
6709
|
|---|---|---|---|
|
|
6756
|
-
| [`id`](
|
|
6757
|
-
| [`task`](
|
|
6758
|
-
| [`lane`](
|
|
6759
|
-
| [`from`](
|
|
6760
|
-
| [`to`](
|
|
6761
|
-
| [`leadIn`](
|
|
6762
|
-
| [`leadOut`](
|
|
6763
|
-
| [`name`](
|
|
6710
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
6711
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
6712
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
6713
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
6714
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
6715
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
6716
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
6717
|
+
| [`name`](#subtasks) | `string` | — | What the subtask is called, where the schedule names it. |
|
|
6764
6718
|
|
|
6765
|
-
From `Task` — the full table stands on [Subtasks](
|
|
6719
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
6766
6720
|
|
|
6767
6721
|
| Prop | Type | Default | Description |
|
|
6768
6722
|
|---|---|---|---|
|
|
6769
|
-
| [`id`](
|
|
6770
|
-
| [`color`](
|
|
6771
|
-
| [`name`](
|
|
6723
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
6724
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
6725
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
6772
6726
|
|
|
6773
|
-
From `DependenciesProps` — the full table stands on [Dependencies](
|
|
6727
|
+
From `DependenciesProps` — the full table stands on [Dependencies](#dependencies).
|
|
6774
6728
|
|
|
6775
6729
|
| Prop | Type | Default | Description |
|
|
6776
6730
|
|---|---|---|---|
|
|
6777
|
-
| [`data`](
|
|
6731
|
+
| [`data`](#dependencies) *required* | `readonly `[`Dependency`](#dependencies)`[]` | — | The dependencies, as the caller holds them. |
|
|
6778
6732
|
|
|
6779
|
-
From `Dependency` — the full table stands on [Dependencies](
|
|
6733
|
+
From `Dependency` — the full table stands on [Dependencies](#dependencies).
|
|
6780
6734
|
|
|
6781
6735
|
| Prop | Type | Default | Description |
|
|
6782
6736
|
|---|---|---|---|
|
|
6783
|
-
| [`id`](
|
|
6784
|
-
| [`from`](
|
|
6785
|
-
| [`to`](
|
|
6786
|
-
| [`lag`](
|
|
6737
|
+
| [`id`](#dependencies) *required* | `string` | — | The caller's identity of the dependency. |
|
|
6738
|
+
| [`from`](#dependencies) *required* | `string` | — | The id of the subtask it leaves. |
|
|
6739
|
+
| [`to`](#dependencies) *required* | `string` | — | The id of the subtask it arrives at. |
|
|
6740
|
+
| [`lag`](#dependencies) *required* | `number` | — | The least time between the two anchors; zero where the successor may begin as soon as the predecessor ends. |
|
|
6787
6741
|
|
|
6788
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
6742
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
6789
6743
|
|
|
6790
6744
|
| Prop | Type | Default | Description |
|
|
6791
6745
|
|---|---|---|---|
|
|
6792
|
-
| [`initialView`](
|
|
6746
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
6793
6747
|
|
|
6794
|
-
From `ScheduleView` — the full table stands on [View](
|
|
6748
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
6795
6749
|
|
|
6796
6750
|
| Prop | Type | Default | Description |
|
|
6797
6751
|
|---|---|---|---|
|
|
6798
|
-
| [`domain`](
|
|
6752
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
6799
6753
|
|
|
6800
|
-
From `Overlap` — the full table stands on [Findings as data](
|
|
6754
|
+
From `Overlap` — the full table stands on [Findings as data](#findings-as-data).
|
|
6801
6755
|
|
|
6802
6756
|
| Prop | Type | Default | Description |
|
|
6803
6757
|
|---|---|---|---|
|
|
6804
|
-
| [`lane`](
|
|
6805
|
-
| [`first`](
|
|
6806
|
-
| [`second`](
|
|
6758
|
+
| [`lane`](#findings-as-data) *required* | `string` | — | The lane both sit on. |
|
|
6759
|
+
| [`first`](#findings-as-data) *required* | `string` | — | The subtask that starts earlier (lead-in included); on a tie, the one that stands first in the data. |
|
|
6760
|
+
| [`second`](#findings-as-data) *required* | `string` | — | The other one. |
|
|
6807
6761
|
|
|
6808
6762
|
#### Known limits
|
|
6809
6763
|
|
|
6810
|
-
- No undo: your application owns the data, and with it the history ([ADR-0032](https://
|
|
6764
|
+
- No undo: your application owns the data, and with it the history ([ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md)).
|
|
6811
6765
|
- The keys move work in time only; a lane change needs the pointer.
|
|
6812
6766
|
|
|
6813
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
6767
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
6814
6768
|
|
|
6815
6769
|
### Stretch, lead-in, lead-out
|
|
6816
6770
|
|
|
@@ -6820,8 +6774,6 @@ Change how long work takes, or how long its preparation and its wrap-up take, by
|
|
|
6820
6774
|
import { useSchedule, applyIntent } from "@umriss-ui/schedule";
|
|
6821
6775
|
```
|
|
6822
6776
|
|
|
6823
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/stretch/
|
|
6824
|
-
|
|
6825
6777
|
`stretch` enables the two edges of the main time. `leadIn` and `leadOut` add a grip at the outer edge of each; the grips show on the selected subtask only, so click a bar first.
|
|
6826
6778
|
|
|
6827
6779
|
Stretching the main time leaves the lead-in and the lead-out as long as they were.
|
|
@@ -6909,82 +6861,82 @@ export default function ChangeLeadInAndLeadOut() {
|
|
|
6909
6861
|
|---|---|
|
|
6910
6862
|
| `Alt+Shift+← Alt+Shift+→` | Proposes ending the active subtask one raster step earlier or later. |
|
|
6911
6863
|
|
|
6912
|
-
The keys of [First schedule](
|
|
6864
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
6913
6865
|
|
|
6914
6866
|
#### Props on this page
|
|
6915
6867
|
|
|
6916
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
6868
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
6917
6869
|
|
|
6918
6870
|
| Prop | Type | Default | Description |
|
|
6919
6871
|
|---|---|---|---|
|
|
6920
|
-
| [`height`](
|
|
6921
|
-
| [`intents`](
|
|
6922
|
-
| [`children`](
|
|
6872
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
6873
|
+
| [`intents`](#first-schedule) | `readonly `[`IntentKind`](#first-schedule)`[]` | `[]` | The intents the caller handles. Each one enables its interaction; none leaves a read-only schedule ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)). |
|
|
6874
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
6923
6875
|
|
|
6924
6876
|
###### Events
|
|
6925
6877
|
|
|
6926
6878
|
| Prop | Type | Default | Description |
|
|
6927
6879
|
|---|---|---|---|
|
|
6928
|
-
| [`onIntent`](
|
|
6880
|
+
| [`onIntent`](#first-schedule) | `(intent: `[`Intent`](#first-schedule)`) => void` | — | Called once per intent when a drag ends. The data changes only if the caller changes it. |
|
|
6929
6881
|
|
|
6930
6882
|
###### Accessibility
|
|
6931
6883
|
|
|
6932
6884
|
| Prop | Type | Default | Description |
|
|
6933
6885
|
|---|---|---|---|
|
|
6934
|
-
| [`ariaLabel`](
|
|
6886
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
6935
6887
|
|
|
6936
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
6888
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
6937
6889
|
|
|
6938
6890
|
| Prop | Type | Default | Description |
|
|
6939
6891
|
|---|---|---|---|
|
|
6940
|
-
| [`id`](
|
|
6941
|
-
| [`label`](
|
|
6892
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
6893
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
6942
6894
|
|
|
6943
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
6895
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
6944
6896
|
|
|
6945
6897
|
| Prop | Type | Default | Description |
|
|
6946
6898
|
|---|---|---|---|
|
|
6947
|
-
| [`data`](
|
|
6948
|
-
| [`tasks`](
|
|
6899
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
6900
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
6949
6901
|
|
|
6950
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
6902
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
6951
6903
|
|
|
6952
6904
|
| Prop | Type | Default | Description |
|
|
6953
6905
|
|---|---|---|---|
|
|
6954
|
-
| [`id`](
|
|
6955
|
-
| [`task`](
|
|
6956
|
-
| [`lane`](
|
|
6957
|
-
| [`from`](
|
|
6958
|
-
| [`to`](
|
|
6959
|
-
| [`leadIn`](
|
|
6960
|
-
| [`leadOut`](
|
|
6961
|
-
| [`name`](
|
|
6906
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
6907
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
6908
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
6909
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
6910
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
6911
|
+
| [`leadIn`](#subtasks) | `number` | — | Duration of the lead-in before the main time; none is zero. |
|
|
6912
|
+
| [`leadOut`](#subtasks) | `number` | — | Duration of the lead-out after the main time; none is zero. |
|
|
6913
|
+
| [`name`](#subtasks) | `string` | — | What the subtask is called, where the schedule names it. |
|
|
6962
6914
|
|
|
6963
|
-
From `Task` — the full table stands on [Subtasks](
|
|
6915
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
6964
6916
|
|
|
6965
6917
|
| Prop | Type | Default | Description |
|
|
6966
6918
|
|---|---|---|---|
|
|
6967
|
-
| [`id`](
|
|
6968
|
-
| [`color`](
|
|
6969
|
-
| [`name`](
|
|
6919
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
6920
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
6921
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
6970
6922
|
|
|
6971
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
6923
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
6972
6924
|
|
|
6973
6925
|
| Prop | Type | Default | Description |
|
|
6974
6926
|
|---|---|---|---|
|
|
6975
|
-
| [`initialView`](
|
|
6927
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
6976
6928
|
|
|
6977
|
-
From `ScheduleView` — the full table stands on [View](
|
|
6929
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
6978
6930
|
|
|
6979
6931
|
| Prop | Type | Default | Description |
|
|
6980
6932
|
|---|---|---|---|
|
|
6981
|
-
| [`domain`](
|
|
6933
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
6982
6934
|
|
|
6983
6935
|
#### Known limits
|
|
6984
6936
|
|
|
6985
6937
|
- A main time never becomes shorter than one raster step, or a minute without a raster.
|
|
6986
6938
|
|
|
6987
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
6939
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
6988
6940
|
|
|
6989
6941
|
### Snapping
|
|
6990
6942
|
|
|
@@ -6994,11 +6946,9 @@ Makes a drag land on a raster - the axis' own step, a fixed duration, or a patte
|
|
|
6994
6946
|
import { useSchedule, snapTime } from "@umriss-ui/schedule";
|
|
6995
6947
|
```
|
|
6996
6948
|
|
|
6997
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/snapping/
|
|
6998
|
-
|
|
6999
6949
|
Without `snap` a drag lands on the fine band's step, which follows the zoom. A number is a step in milliseconds; `{ step, offset }` counts from local midnight; `false` places to the minute.
|
|
7000
6950
|
|
|
7001
|
-
Snapping shapes the ghost and so the intent; it never moves data that is not being dragged. [`snapTime`](
|
|
6951
|
+
Snapping shapes the ghost and so the intent; it never moves data that is not being dragged. [`snapTime`](#api-index-1) is the same arithmetic for your own use.
|
|
7002
6952
|
|
|
7003
6953
|
#### Examples
|
|
7004
6954
|
|
|
@@ -7144,75 +7094,75 @@ export default function NoSnapping() {
|
|
|
7144
7094
|
|
|
7145
7095
|
#### Keyboard
|
|
7146
7096
|
|
|
7147
|
-
The keys of [First schedule](
|
|
7097
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
7148
7098
|
|
|
7149
7099
|
#### Props on this page
|
|
7150
7100
|
|
|
7151
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
7101
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
7152
7102
|
|
|
7153
7103
|
| Prop | Type | Default | Description |
|
|
7154
7104
|
|---|---|---|---|
|
|
7155
|
-
| [`height`](
|
|
7156
|
-
| [`snap`](
|
|
7157
|
-
| [`intents`](
|
|
7158
|
-
| [`children`](
|
|
7105
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
7106
|
+
| [`snap`](#first-schedule) | `"ticks" \| number \| `[`SnapRaster`](#first-schedule)` \| false` | `"ticks"` | The raster a drag lands on: `"ticks"` - the fine band's current step -, a step in milliseconds from local midnight, a step with an offset (shifts at 06:00, 14:00 and 22:00 are eight hours offset by six), or `false` for none. It shapes the ghost and the intent, never the data. |
|
|
7107
|
+
| [`intents`](#first-schedule) | `readonly `[`IntentKind`](#first-schedule)`[]` | `[]` | The intents the caller handles. Each one enables its interaction; none leaves a read-only schedule ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)). |
|
|
7108
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
7159
7109
|
|
|
7160
7110
|
###### Events
|
|
7161
7111
|
|
|
7162
7112
|
| Prop | Type | Default | Description |
|
|
7163
7113
|
|---|---|---|---|
|
|
7164
|
-
| [`onIntent`](
|
|
7114
|
+
| [`onIntent`](#first-schedule) | `(intent: `[`Intent`](#first-schedule)`) => void` | — | Called once per intent when a drag ends. The data changes only if the caller changes it. |
|
|
7165
7115
|
|
|
7166
7116
|
###### Accessibility
|
|
7167
7117
|
|
|
7168
7118
|
| Prop | Type | Default | Description |
|
|
7169
7119
|
|---|---|---|---|
|
|
7170
|
-
| [`ariaLabel`](
|
|
7120
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
7171
7121
|
|
|
7172
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
7122
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
7173
7123
|
|
|
7174
7124
|
| Prop | Type | Default | Description |
|
|
7175
7125
|
|---|---|---|---|
|
|
7176
|
-
| [`id`](
|
|
7177
|
-
| [`label`](
|
|
7126
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
7127
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
7178
7128
|
|
|
7179
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
7129
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
7180
7130
|
|
|
7181
7131
|
| Prop | Type | Default | Description |
|
|
7182
7132
|
|---|---|---|---|
|
|
7183
|
-
| [`data`](
|
|
7184
|
-
| [`tasks`](
|
|
7133
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
7134
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
7185
7135
|
|
|
7186
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
7136
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
7187
7137
|
|
|
7188
7138
|
| Prop | Type | Default | Description |
|
|
7189
7139
|
|---|---|---|---|
|
|
7190
|
-
| [`id`](
|
|
7191
|
-
| [`task`](
|
|
7192
|
-
| [`lane`](
|
|
7193
|
-
| [`from`](
|
|
7194
|
-
| [`to`](
|
|
7195
|
-
| [`name`](
|
|
7140
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
7141
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
7142
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
7143
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
7144
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
7145
|
+
| [`name`](#subtasks) | `string` | — | What the subtask is called, where the schedule names it. |
|
|
7196
7146
|
|
|
7197
|
-
From `Task` — the full table stands on [Subtasks](
|
|
7147
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
7198
7148
|
|
|
7199
7149
|
| Prop | Type | Default | Description |
|
|
7200
7150
|
|---|---|---|---|
|
|
7201
|
-
| [`id`](
|
|
7202
|
-
| [`color`](
|
|
7203
|
-
| [`name`](
|
|
7151
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
7152
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
7153
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
7204
7154
|
|
|
7205
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
7155
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
7206
7156
|
|
|
7207
7157
|
| Prop | Type | Default | Description |
|
|
7208
7158
|
|---|---|---|---|
|
|
7209
|
-
| [`initialView`](
|
|
7159
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
7210
7160
|
|
|
7211
|
-
From `ScheduleView` — the full table stands on [View](
|
|
7161
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
7212
7162
|
|
|
7213
7163
|
| Prop | Type | Default | Description |
|
|
7214
7164
|
|---|---|---|---|
|
|
7215
|
-
| [`domain`](
|
|
7165
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
7216
7166
|
|
|
7217
7167
|
### Placing from outside
|
|
7218
7168
|
|
|
@@ -7222,17 +7172,15 @@ Drag work that is not on the plan yet - from a backlog or a list of unassigned j
|
|
|
7222
7172
|
import { useSchedule, subtaskFromPlace } from "@umriss-ui/schedule";
|
|
7223
7173
|
```
|
|
7224
7174
|
|
|
7225
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/placing/
|
|
7226
|
-
|
|
7227
7175
|
The browser hands over dragged data only on the drop, so declare what is being dragged in `placing` on your `dragstart` and clear it on `dragend`. The schedule then shows the ghost at the snapped time, with the findings the drop would create.
|
|
7228
7176
|
|
|
7229
|
-
A `place` intent carries your item's key, the task, the lane and the times. The id of the new subtask is yours; [`subtaskFromPlace`](
|
|
7177
|
+
A `place` intent carries your item's key, the task, the lane and the times. The id of the new subtask is yours; [`subtaskFromPlace`](#api-index-1) builds it from the intent.
|
|
7230
7178
|
|
|
7231
7179
|
#### Examples
|
|
7232
7180
|
|
|
7233
7181
|
##### Drag work in from the backlog
|
|
7234
7182
|
|
|
7235
|
-
Set `placing` on your list's `dragstart` and clear it on `dragend`; the drop reports a `place` intent that [`subtaskFromPlace`](
|
|
7183
|
+
Set `placing` on your list's `dragstart` and clear it on `dragend`; the drop reports a `place` intent that [`subtaskFromPlace`](#api-index-1) turns into work.
|
|
7236
7184
|
|
|
7237
7185
|
```tsx
|
|
7238
7186
|
import { useState } from "react";
|
|
@@ -7339,90 +7287,90 @@ export default function DragFromTheBacklog() {
|
|
|
7339
7287
|
|
|
7340
7288
|
#### Keyboard
|
|
7341
7289
|
|
|
7342
|
-
The keys of [First schedule](
|
|
7290
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
7343
7291
|
|
|
7344
7292
|
#### Props on this page
|
|
7345
7293
|
|
|
7346
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
7294
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
7347
7295
|
|
|
7348
7296
|
| Prop | Type | Default | Description |
|
|
7349
7297
|
|---|---|---|---|
|
|
7350
|
-
| [`height`](
|
|
7351
|
-
| [`intents`](
|
|
7352
|
-
| [`placing`](
|
|
7353
|
-
| [`children`](
|
|
7298
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
7299
|
+
| [`intents`](#first-schedule) | `readonly `[`IntentKind`](#first-schedule)`[]` | `[]` | The intents the caller handles. Each one enables its interaction; none leaves a read-only schedule ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)). |
|
|
7300
|
+
| [`placing`](#first-schedule) | [`PlacingItem`](#first-schedule)` \| null` | — | What the application is dragging in from outside while it drags it - its key, task, the length of its main time, its lead-in and lead-out. The browser hands the dragged data over only on the drop, so the ghost before it can only come from here: set it on your own `dragstart`, clear it on `dragend`. Without `"place"` in `intents` no drop is accepted. |
|
|
7301
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
7354
7302
|
|
|
7355
7303
|
###### Events
|
|
7356
7304
|
|
|
7357
7305
|
| Prop | Type | Default | Description |
|
|
7358
7306
|
|---|---|---|---|
|
|
7359
|
-
| [`onIntent`](
|
|
7307
|
+
| [`onIntent`](#first-schedule) | `(intent: `[`Intent`](#first-schedule)`) => void` | — | Called once per intent when a drag ends. The data changes only if the caller changes it. |
|
|
7360
7308
|
|
|
7361
7309
|
###### Accessibility
|
|
7362
7310
|
|
|
7363
7311
|
| Prop | Type | Default | Description |
|
|
7364
7312
|
|---|---|---|---|
|
|
7365
|
-
| [`ariaLabel`](
|
|
7313
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
7366
7314
|
|
|
7367
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
7315
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
7368
7316
|
|
|
7369
7317
|
| Prop | Type | Default | Description |
|
|
7370
7318
|
|---|---|---|---|
|
|
7371
|
-
| [`id`](
|
|
7372
|
-
| [`label`](
|
|
7319
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
7320
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
7373
7321
|
|
|
7374
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
7322
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
7375
7323
|
|
|
7376
7324
|
| Prop | Type | Default | Description |
|
|
7377
7325
|
|---|---|---|---|
|
|
7378
|
-
| [`data`](
|
|
7379
|
-
| [`tasks`](
|
|
7326
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
7327
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
7380
7328
|
|
|
7381
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
7329
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
7382
7330
|
|
|
7383
7331
|
| Prop | Type | Default | Description |
|
|
7384
7332
|
|---|---|---|---|
|
|
7385
|
-
| [`id`](
|
|
7386
|
-
| [`task`](
|
|
7387
|
-
| [`lane`](
|
|
7388
|
-
| [`from`](
|
|
7389
|
-
| [`to`](
|
|
7390
|
-
| [`name`](
|
|
7333
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
7334
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
7335
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
7336
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
7337
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
7338
|
+
| [`name`](#subtasks) | `string` | — | What the subtask is called, where the schedule names it. |
|
|
7391
7339
|
|
|
7392
|
-
From `Task` — the full table stands on [Subtasks](
|
|
7340
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
7393
7341
|
|
|
7394
7342
|
| Prop | Type | Default | Description |
|
|
7395
7343
|
|---|---|---|---|
|
|
7396
|
-
| [`id`](
|
|
7397
|
-
| [`color`](
|
|
7398
|
-
| [`name`](
|
|
7344
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
7345
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
7346
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
7399
7347
|
|
|
7400
|
-
From `DependenciesProps` — the full table stands on [Dependencies](
|
|
7348
|
+
From `DependenciesProps` — the full table stands on [Dependencies](#dependencies).
|
|
7401
7349
|
|
|
7402
7350
|
| Prop | Type | Default | Description |
|
|
7403
7351
|
|---|---|---|---|
|
|
7404
|
-
| [`data`](
|
|
7352
|
+
| [`data`](#dependencies) *required* | `readonly `[`Dependency`](#dependencies)`[]` | — | The dependencies, as the caller holds them. |
|
|
7405
7353
|
|
|
7406
|
-
From `Dependency` — the full table stands on [Dependencies](
|
|
7354
|
+
From `Dependency` — the full table stands on [Dependencies](#dependencies).
|
|
7407
7355
|
|
|
7408
7356
|
| Prop | Type | Default | Description |
|
|
7409
7357
|
|---|---|---|---|
|
|
7410
|
-
| [`id`](
|
|
7411
|
-
| [`from`](
|
|
7412
|
-
| [`to`](
|
|
7413
|
-
| [`lag`](
|
|
7358
|
+
| [`id`](#dependencies) *required* | `string` | — | The caller's identity of the dependency. |
|
|
7359
|
+
| [`from`](#dependencies) *required* | `string` | — | The id of the subtask it leaves. |
|
|
7360
|
+
| [`to`](#dependencies) *required* | `string` | — | The id of the subtask it arrives at. |
|
|
7361
|
+
| [`lag`](#dependencies) *required* | `number` | — | The least time between the two anchors; zero where the successor may begin as soon as the predecessor ends. |
|
|
7414
7362
|
|
|
7415
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
7363
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
7416
7364
|
|
|
7417
7365
|
| Prop | Type | Default | Description |
|
|
7418
7366
|
|---|---|---|---|
|
|
7419
|
-
| [`initialView`](
|
|
7367
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
7420
7368
|
|
|
7421
|
-
From `ScheduleView` — the full table stands on [View](
|
|
7369
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
7422
7370
|
|
|
7423
7371
|
| Prop | Type | Default | Description |
|
|
7424
7372
|
|---|---|---|---|
|
|
7425
|
-
| [`domain`](
|
|
7373
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
7426
7374
|
|
|
7427
7375
|
### Where a subtask may go
|
|
7428
7376
|
|
|
@@ -7432,8 +7380,6 @@ Marks the lanes and times a piece of work may not go to as soon as a drag begins
|
|
|
7432
7380
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
7433
7381
|
```
|
|
7434
7382
|
|
|
7435
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/
|
|
7436
|
-
|
|
7437
7383
|
`canMoveTo(subtask, lane)` is asked once per lane when a drag takes hold, and again at the drop. Refused lanes are drawn back and hatched; over one, the ghost stays on the last lane allowed, tied to the pointer by a line.
|
|
7438
7384
|
|
|
7439
7385
|
Blocked time refuses a place in time rather than a lane: a drag cannot put work into it, and Alt with an arrow key steps over it. Work the data already put there is never locked in.
|
|
@@ -7759,97 +7705,97 @@ export default function AroundLeave() {
|
|
|
7759
7705
|
|
|
7760
7706
|
#### Keyboard
|
|
7761
7707
|
|
|
7762
|
-
The keys of [First schedule](
|
|
7708
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
7763
7709
|
|
|
7764
7710
|
#### Props on this page
|
|
7765
7711
|
|
|
7766
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
7712
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
7767
7713
|
|
|
7768
7714
|
| Prop | Type | Default | Description |
|
|
7769
7715
|
|---|---|---|---|
|
|
7770
|
-
| [`height`](
|
|
7771
|
-
| [`intents`](
|
|
7772
|
-
| [`canMoveTo`](
|
|
7773
|
-
| [`placing`](
|
|
7774
|
-
| [`children`](
|
|
7716
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
7717
|
+
| [`intents`](#first-schedule) | `readonly `[`IntentKind`](#first-schedule)`[]` | `[]` | The intents the caller handles. Each one enables its interaction; none leaves a read-only schedule ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)). |
|
|
7718
|
+
| [`canMoveTo`](#first-schedule) | `(subtask: `[`Subtask`](#subtasks)`, lane: string) => boolean` | every lane is open | Whether a subtask may go to a lane. It narrows `"lane"`, it does not enable it. Asked once per lane when a drag takes hold, and asked again at the drop. The lanes it turns down are marked from the first frame of the drag - a planner sees the refusal before meeting it - and over one of them the ghost stays on the last lane that was allowed, the cursor says no and a line ties the ghost to the pointer. A refused lane costs the lane and nothing else: a drop after it still reports the move in time. It is asked for work dragged in from outside as well, with the key and task the application declared in `placing`. |
|
|
7719
|
+
| [`placing`](#first-schedule) | [`PlacingItem`](#first-schedule)` \| null` | — | What the application is dragging in from outside while it drags it - its key, task, the length of its main time, its lead-in and lead-out. The browser hands the dragged data over only on the drop, so the ghost before it can only come from here: set it on your own `dragstart`, clear it on `dragend`. Without `"place"` in `intents` no drop is accepted. |
|
|
7720
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
7775
7721
|
|
|
7776
7722
|
###### Events
|
|
7777
7723
|
|
|
7778
7724
|
| Prop | Type | Default | Description |
|
|
7779
7725
|
|---|---|---|---|
|
|
7780
|
-
| [`onIntent`](
|
|
7726
|
+
| [`onIntent`](#first-schedule) | `(intent: `[`Intent`](#first-schedule)`) => void` | — | Called once per intent when a drag ends. The data changes only if the caller changes it. |
|
|
7781
7727
|
|
|
7782
7728
|
###### Accessibility
|
|
7783
7729
|
|
|
7784
7730
|
| Prop | Type | Default | Description |
|
|
7785
7731
|
|---|---|---|---|
|
|
7786
|
-
| [`ariaLabel`](
|
|
7732
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
7787
7733
|
|
|
7788
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
7734
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
7789
7735
|
|
|
7790
7736
|
| Prop | Type | Default | Description |
|
|
7791
7737
|
|---|---|---|---|
|
|
7792
|
-
| [`id`](
|
|
7793
|
-
| [`label`](
|
|
7738
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
7739
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
7794
7740
|
|
|
7795
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
7741
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
7796
7742
|
|
|
7797
7743
|
| Prop | Type | Default | Description |
|
|
7798
7744
|
|---|---|---|---|
|
|
7799
|
-
| [`data`](
|
|
7800
|
-
| [`tasks`](
|
|
7745
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
7746
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
7801
7747
|
|
|
7802
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
7748
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
7803
7749
|
|
|
7804
7750
|
| Prop | Type | Default | Description |
|
|
7805
7751
|
|---|---|---|---|
|
|
7806
|
-
| [`id`](
|
|
7807
|
-
| [`task`](
|
|
7808
|
-
| [`lane`](
|
|
7809
|
-
| [`from`](
|
|
7810
|
-
| [`to`](
|
|
7752
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
7753
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
7754
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
7755
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
7756
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
7811
7757
|
|
|
7812
|
-
From `Task` — the full table stands on [Subtasks](
|
|
7758
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
7813
7759
|
|
|
7814
7760
|
| Prop | Type | Default | Description |
|
|
7815
7761
|
|---|---|---|---|
|
|
7816
|
-
| [`id`](
|
|
7817
|
-
| [`color`](
|
|
7818
|
-
| [`name`](
|
|
7762
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
7763
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
7764
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
7819
7765
|
|
|
7820
|
-
From `BlockedTimesProps` — the full table stands on [Blocked time](
|
|
7766
|
+
From `BlockedTimesProps` — the full table stands on [Blocked time](#blocked-time).
|
|
7821
7767
|
|
|
7822
7768
|
| Prop | Type | Default | Description |
|
|
7823
7769
|
|---|---|---|---|
|
|
7824
|
-
| [`data`](
|
|
7770
|
+
| [`data`](#blocked-time) *required* | `readonly `[`BlockedTime`](#blocked-time)`[]` | — | The blocked time of the lanes - leave, maintenance, unavailability -, as the caller holds it: one list, each interval naming its lane. |
|
|
7825
7771
|
|
|
7826
|
-
From `BlockedTime` — the full table stands on [Blocked time](
|
|
7772
|
+
From `BlockedTime` — the full table stands on [Blocked time](#blocked-time).
|
|
7827
7773
|
|
|
7828
7774
|
| Prop | Type | Default | Description |
|
|
7829
7775
|
|---|---|---|---|
|
|
7830
|
-
| [`id`](
|
|
7831
|
-
| [`lane`](
|
|
7832
|
-
| [`from`](
|
|
7833
|
-
| [`to`](
|
|
7834
|
-
| [`label`](
|
|
7776
|
+
| [`id`](#blocked-time) *required* | `string` | — | The caller's identity of the interval - what a finding names. |
|
|
7777
|
+
| [`lane`](#blocked-time) *required* | `string` | — | The id of the lane it blocks. |
|
|
7778
|
+
| [`from`](#blocked-time) *required* | `number` | — | Where it begins. |
|
|
7779
|
+
| [`to`](#blocked-time) *required* | `number` | — | Where it ends. |
|
|
7780
|
+
| [`label`](#blocked-time) | `string` | — | Why the lane is blocked - "Leave", "Maintenance" -, where the schedule names it. |
|
|
7835
7781
|
|
|
7836
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
7782
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
7837
7783
|
|
|
7838
7784
|
| Prop | Type | Default | Description |
|
|
7839
7785
|
|---|---|---|---|
|
|
7840
|
-
| [`initialView`](
|
|
7786
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
7841
7787
|
|
|
7842
|
-
From `ScheduleView` — the full table stands on [View](
|
|
7788
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
7843
7789
|
|
|
7844
7790
|
| Prop | Type | Default | Description |
|
|
7845
7791
|
|---|---|---|---|
|
|
7846
|
-
| [`domain`](
|
|
7792
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
7847
7793
|
|
|
7848
7794
|
#### Known limits
|
|
7849
7795
|
|
|
7850
7796
|
- A rule that changes while a drag runs is noticed at the drop, not before.
|
|
7851
7797
|
|
|
7852
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
7798
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
7853
7799
|
|
|
7854
7800
|
### Ripple
|
|
7855
7801
|
|
|
@@ -7859,17 +7805,15 @@ Works out which later work has to move when one piece moves: every successor who
|
|
|
7859
7805
|
import { ripple, shiftTask, applyIntent } from "@umriss-ui/schedule";
|
|
7860
7806
|
```
|
|
7861
7807
|
|
|
7862
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/ripple/
|
|
7863
|
-
|
|
7864
7808
|
`ripple(subtasks, dependencies, intent)` returns move intents down the whole chain, in the order they were pushed. A successor keeps its length and is never pulled earlier: room that opens up is the planner's.
|
|
7865
7809
|
|
|
7866
|
-
[`shiftTask`](
|
|
7810
|
+
[`shiftTask`](#api-index-1) moves every subtask of one task by the same amount, so all its dependencies keep fitting.
|
|
7867
7811
|
|
|
7868
7812
|
#### Examples
|
|
7869
7813
|
|
|
7870
7814
|
##### Push the later stops of a tour
|
|
7871
7815
|
|
|
7872
|
-
[`ripple`](
|
|
7816
|
+
[`ripple`](#api-index-1) returns the moves that push every stop whose drive no longer fits behind a late one; you decide whether to apply them.
|
|
7873
7817
|
|
|
7874
7818
|
```tsx
|
|
7875
7819
|
import { useState } from "react";
|
|
@@ -7938,7 +7882,7 @@ export default function PushTheLaterStops() {
|
|
|
7938
7882
|
|
|
7939
7883
|
##### Move a whole tour
|
|
7940
7884
|
|
|
7941
|
-
[`shiftTask`](
|
|
7885
|
+
[`shiftTask`](#api-index-1) returns one move per stop, all by the same amount, so every drive that fitted still fits.
|
|
7942
7886
|
|
|
7943
7887
|
```tsx
|
|
7944
7888
|
import { useState } from "react";
|
|
@@ -7998,7 +7942,7 @@ export default function MoveAWholeTour() {
|
|
|
7998
7942
|
|
|
7999
7943
|
##### Ripple on every drag
|
|
8000
7944
|
|
|
8001
|
-
Run [`ripple`](
|
|
7945
|
+
Run [`ripple`](#api-index-1) inside `onIntent` and apply its moves with the drop: drag the design later and build and test follow.
|
|
8002
7946
|
|
|
8003
7947
|
```tsx
|
|
8004
7948
|
import { useState } from "react";
|
|
@@ -8050,96 +7994,96 @@ export default function RippleOnEveryDrag() {
|
|
|
8050
7994
|
|
|
8051
7995
|
#### Keyboard
|
|
8052
7996
|
|
|
8053
|
-
The keys of [First schedule](
|
|
7997
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
8054
7998
|
|
|
8055
7999
|
#### Props on this page
|
|
8056
8000
|
|
|
8057
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
8001
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
8058
8002
|
|
|
8059
8003
|
| Prop | Type | Default | Description |
|
|
8060
8004
|
|---|---|---|---|
|
|
8061
|
-
| [`height`](
|
|
8062
|
-
| [`intents`](
|
|
8063
|
-
| [`children`](
|
|
8005
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
8006
|
+
| [`intents`](#first-schedule) | `readonly `[`IntentKind`](#first-schedule)`[]` | `[]` | The intents the caller handles. Each one enables its interaction; none leaves a read-only schedule ([ADR-0023](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0023-editing-is-controlled-the-schedule-reports-intents.md)). |
|
|
8007
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
8064
8008
|
|
|
8065
8009
|
###### Events
|
|
8066
8010
|
|
|
8067
8011
|
| Prop | Type | Default | Description |
|
|
8068
8012
|
|---|---|---|---|
|
|
8069
|
-
| [`onIntent`](
|
|
8013
|
+
| [`onIntent`](#first-schedule) | `(intent: `[`Intent`](#first-schedule)`) => void` | — | Called once per intent when a drag ends. The data changes only if the caller changes it. |
|
|
8070
8014
|
|
|
8071
8015
|
###### Accessibility
|
|
8072
8016
|
|
|
8073
8017
|
| Prop | Type | Default | Description |
|
|
8074
8018
|
|---|---|---|---|
|
|
8075
|
-
| [`ariaLabel`](
|
|
8019
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
8076
8020
|
|
|
8077
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
8021
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
8078
8022
|
|
|
8079
8023
|
| Prop | Type | Default | Description |
|
|
8080
8024
|
|---|---|---|---|
|
|
8081
|
-
| [`id`](
|
|
8082
|
-
| [`label`](
|
|
8025
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
8026
|
+
| [`label`](#lanes) | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader. |
|
|
8083
8027
|
|
|
8084
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
8028
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
8085
8029
|
|
|
8086
8030
|
| Prop | Type | Default | Description |
|
|
8087
8031
|
|---|---|---|---|
|
|
8088
|
-
| [`data`](
|
|
8089
|
-
| [`tasks`](
|
|
8032
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
8033
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
8090
8034
|
|
|
8091
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
8035
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
8092
8036
|
|
|
8093
8037
|
| Prop | Type | Default | Description |
|
|
8094
8038
|
|---|---|---|---|
|
|
8095
|
-
| [`id`](
|
|
8096
|
-
| [`task`](
|
|
8097
|
-
| [`lane`](
|
|
8098
|
-
| [`from`](
|
|
8099
|
-
| [`to`](
|
|
8100
|
-
| [`name`](
|
|
8039
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
8040
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
8041
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
8042
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
8043
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
8044
|
+
| [`name`](#subtasks) | `string` | — | What the subtask is called, where the schedule names it. |
|
|
8101
8045
|
|
|
8102
|
-
From `Task` — the full table stands on [Subtasks](
|
|
8046
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
8103
8047
|
|
|
8104
8048
|
| Prop | Type | Default | Description |
|
|
8105
8049
|
|---|---|---|---|
|
|
8106
|
-
| [`id`](
|
|
8107
|
-
| [`color`](
|
|
8108
|
-
| [`name`](
|
|
8050
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
8051
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
8052
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
8109
8053
|
|
|
8110
|
-
From `DependenciesProps` — the full table stands on [Dependencies](
|
|
8054
|
+
From `DependenciesProps` — the full table stands on [Dependencies](#dependencies).
|
|
8111
8055
|
|
|
8112
8056
|
| Prop | Type | Default | Description |
|
|
8113
8057
|
|---|---|---|---|
|
|
8114
|
-
| [`data`](
|
|
8058
|
+
| [`data`](#dependencies) *required* | `readonly `[`Dependency`](#dependencies)`[]` | — | The dependencies, as the caller holds them. |
|
|
8115
8059
|
|
|
8116
|
-
From `Dependency` — the full table stands on [Dependencies](
|
|
8060
|
+
From `Dependency` — the full table stands on [Dependencies](#dependencies).
|
|
8117
8061
|
|
|
8118
8062
|
| Prop | Type | Default | Description |
|
|
8119
8063
|
|---|---|---|---|
|
|
8120
|
-
| [`id`](
|
|
8121
|
-
| [`from`](
|
|
8122
|
-
| [`to`](
|
|
8123
|
-
| [`lag`](
|
|
8064
|
+
| [`id`](#dependencies) *required* | `string` | — | The caller's identity of the dependency. |
|
|
8065
|
+
| [`from`](#dependencies) *required* | `string` | — | The id of the subtask it leaves. |
|
|
8066
|
+
| [`to`](#dependencies) *required* | `string` | — | The id of the subtask it arrives at. |
|
|
8067
|
+
| [`lag`](#dependencies) *required* | `number` | — | The least time between the two anchors; zero where the successor may begin as soon as the predecessor ends. |
|
|
8124
8068
|
|
|
8125
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
8069
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
8126
8070
|
|
|
8127
8071
|
| Prop | Type | Default | Description |
|
|
8128
8072
|
|---|---|---|---|
|
|
8129
|
-
| [`initialView`](
|
|
8073
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
8130
8074
|
|
|
8131
|
-
From `ScheduleView` — the full table stands on [View](
|
|
8075
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
8132
8076
|
|
|
8133
8077
|
| Prop | Type | Default | Description |
|
|
8134
8078
|
|---|---|---|---|
|
|
8135
|
-
| [`domain`](
|
|
8079
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
8136
8080
|
|
|
8137
8081
|
#### Known limits
|
|
8138
8082
|
|
|
8139
|
-
- No dependency types, slack or critical path: the schedule is no project-planning engine ([ADR-0032](https://
|
|
8083
|
+
- No dependency types, slack or critical path: the schedule is no project-planning engine ([ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md)).
|
|
8140
8084
|
- A dependency joins subtasks of one task, so work of other tasks is never pushed.
|
|
8141
8085
|
|
|
8142
|
-
What umriss deliberately does not build, and why: [ADR-0032](https://
|
|
8086
|
+
What umriss deliberately does not build, and why: [ADR-0032](https://github.com/romanhaendler/umriss-ui/blob/schedule-v0.42.0/docs/adr/0032-what-umriss-is-not.md).
|
|
8143
8087
|
|
|
8144
8088
|
## Measuring
|
|
8145
8089
|
|
|
@@ -8153,8 +8097,6 @@ A plan of up to five thousand subtasks and as many dependencies, measured in thi
|
|
|
8153
8097
|
import { useSchedule } from "@umriss-ui/schedule";
|
|
8154
8098
|
```
|
|
8155
8099
|
|
|
8156
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/benchmark/
|
|
8157
|
-
|
|
8158
8100
|
The figures in `packages/schedule/docs/capabilities.md` come from here. The page dispatches the pointer and wheel events itself, on the schedule's canvas, and adds no prop to the schedule.
|
|
8159
8101
|
|
|
8160
8102
|
#### Examples
|
|
@@ -8465,94 +8407,94 @@ export default function Benchmark() {
|
|
|
8465
8407
|
|
|
8466
8408
|
#### Keyboard
|
|
8467
8409
|
|
|
8468
|
-
The keys of [First schedule](
|
|
8410
|
+
The keys of [First schedule](#first-schedule) apply here.
|
|
8469
8411
|
|
|
8470
8412
|
#### Props on this page
|
|
8471
8413
|
|
|
8472
|
-
From `ScheduleProps` — the full table stands on [First schedule](
|
|
8414
|
+
From `ScheduleProps` — the full table stands on [First schedule](#first-schedule).
|
|
8473
8415
|
|
|
8474
8416
|
| Prop | Type | Default | Description |
|
|
8475
8417
|
|---|---|---|---|
|
|
8476
|
-
| [`height`](
|
|
8477
|
-
| [`laneHeight`](
|
|
8478
|
-
| [`children`](
|
|
8418
|
+
| [`height`](#first-schedule) | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's. |
|
|
8419
|
+
| [`laneHeight`](#first-schedule) | `number` | `44` | Height of one lane in pixels at the default font size of 16 px; the schedule multiplies it by the root font size over 16 px when that ratio is above 1, so lane names keep their room in a reader's larger font. |
|
|
8420
|
+
| [`children`](#first-schedule) | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn. |
|
|
8479
8421
|
|
|
8480
8422
|
###### Events
|
|
8481
8423
|
|
|
8482
8424
|
| Prop | Type | Default | Description |
|
|
8483
8425
|
|---|---|---|---|
|
|
8484
|
-
| [`onInteraction`](
|
|
8426
|
+
| [`onInteraction`](#first-schedule) | `(interaction: `[`ScheduleInteraction`](#interactions)`) => void` | — | Click, context menu and hover, with what the pointer is on and where. While it is set, a right-click opens no browser menu. |
|
|
8485
8427
|
|
|
8486
8428
|
###### Accessibility
|
|
8487
8429
|
|
|
8488
8430
|
| Prop | Type | Default | Description |
|
|
8489
8431
|
|---|---|---|---|
|
|
8490
|
-
| [`ariaLabel`](
|
|
8432
|
+
| [`ariaLabel`](#first-schedule) *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38". |
|
|
8491
8433
|
|
|
8492
|
-
From `LaneProps` — the full table stands on [Lanes](
|
|
8434
|
+
From `LaneProps` — the full table stands on [Lanes](#lanes).
|
|
8493
8435
|
|
|
8494
8436
|
| Prop | Type | Default | Description |
|
|
8495
8437
|
|---|---|---|---|
|
|
8496
|
-
| [`id`](
|
|
8438
|
+
| [`id`](#lanes) *required* | `string` | — | The identity subtasks name in their `lane`. |
|
|
8497
8439
|
|
|
8498
|
-
From `SubtasksProps` — the full table stands on [Subtasks](
|
|
8440
|
+
From `SubtasksProps` — the full table stands on [Subtasks](#subtasks).
|
|
8499
8441
|
|
|
8500
8442
|
| Prop | Type | Default | Description |
|
|
8501
8443
|
|---|---|---|---|
|
|
8502
|
-
| [`data`](
|
|
8503
|
-
| [`tasks`](
|
|
8444
|
+
| [`data`](#subtasks) *required* | `readonly `[`Subtask`](#subtasks)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one. |
|
|
8445
|
+
| [`tasks`](#subtasks) *required* | `readonly `[`Task`](#subtasks)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour. |
|
|
8504
8446
|
|
|
8505
|
-
From `Subtask` — the full table stands on [Subtasks](
|
|
8447
|
+
From `Subtask` — the full table stands on [Subtasks](#subtasks).
|
|
8506
8448
|
|
|
8507
8449
|
| Prop | Type | Default | Description |
|
|
8508
8450
|
|---|---|---|---|
|
|
8509
|
-
| [`id`](
|
|
8510
|
-
| [`task`](
|
|
8511
|
-
| [`lane`](
|
|
8512
|
-
| [`from`](
|
|
8513
|
-
| [`to`](
|
|
8514
|
-
| [`name`](
|
|
8451
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the subtask. |
|
|
8452
|
+
| [`task`](#subtasks) *required* | `string` | — | The id of the task it belongs to. |
|
|
8453
|
+
| [`lane`](#subtasks) *required* | `string` | — | The id of the lane it sits on. |
|
|
8454
|
+
| [`from`](#subtasks) *required* | `number` | — | Start of the main time. |
|
|
8455
|
+
| [`to`](#subtasks) *required* | `number` | — | End of the main time. |
|
|
8456
|
+
| [`name`](#subtasks) | `string` | — | What the subtask is called, where the schedule names it. |
|
|
8515
8457
|
|
|
8516
|
-
From `Task` — the full table stands on [Subtasks](
|
|
8458
|
+
From `Task` — the full table stands on [Subtasks](#subtasks).
|
|
8517
8459
|
|
|
8518
8460
|
| Prop | Type | Default | Description |
|
|
8519
8461
|
|---|---|---|---|
|
|
8520
|
-
| [`id`](
|
|
8521
|
-
| [`color`](
|
|
8522
|
-
| [`name`](
|
|
8462
|
+
| [`id`](#subtasks) *required* | `string` | — | The caller's identity of the task. |
|
|
8463
|
+
| [`color`](#subtasks) *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean. |
|
|
8464
|
+
| [`name`](#subtasks) | `string` | — | What the task is called, where the schedule names it. |
|
|
8523
8465
|
|
|
8524
|
-
From `DependenciesProps` — the full table stands on [Dependencies](
|
|
8466
|
+
From `DependenciesProps` — the full table stands on [Dependencies](#dependencies).
|
|
8525
8467
|
|
|
8526
8468
|
| Prop | Type | Default | Description |
|
|
8527
8469
|
|---|---|---|---|
|
|
8528
|
-
| [`data`](
|
|
8470
|
+
| [`data`](#dependencies) *required* | `readonly `[`Dependency`](#dependencies)`[]` | — | The dependencies, as the caller holds them. |
|
|
8529
8471
|
|
|
8530
|
-
From `Dependency` — the full table stands on [Dependencies](
|
|
8472
|
+
From `Dependency` — the full table stands on [Dependencies](#dependencies).
|
|
8531
8473
|
|
|
8532
8474
|
| Prop | Type | Default | Description |
|
|
8533
8475
|
|---|---|---|---|
|
|
8534
|
-
| [`id`](
|
|
8535
|
-
| [`from`](
|
|
8536
|
-
| [`to`](
|
|
8537
|
-
| [`lag`](
|
|
8476
|
+
| [`id`](#dependencies) *required* | `string` | — | The caller's identity of the dependency. |
|
|
8477
|
+
| [`from`](#dependencies) *required* | `string` | — | The id of the subtask it leaves. |
|
|
8478
|
+
| [`to`](#dependencies) *required* | `string` | — | The id of the subtask it arrives at. |
|
|
8479
|
+
| [`lag`](#dependencies) *required* | `number` | — | The least time between the two anchors; zero where the successor may begin as soon as the predecessor ends. |
|
|
8538
8480
|
|
|
8539
|
-
From `ScheduleInteraction` — the full table stands on [Interactions](
|
|
8481
|
+
From `ScheduleInteraction` — the full table stands on [Interactions](#interactions).
|
|
8540
8482
|
|
|
8541
8483
|
| Prop | Type | Default | Description |
|
|
8542
8484
|
|---|---|---|---|
|
|
8543
|
-
| [`hit`](
|
|
8485
|
+
| [`hit`](#interactions) *required* | [`ScheduleHit`](#interactions) | — | What the pointer is on. |
|
|
8544
8486
|
|
|
8545
|
-
From `ScheduleOptions` — the full table stands on [View](
|
|
8487
|
+
From `ScheduleOptions` — the full table stands on [View](#view).
|
|
8546
8488
|
|
|
8547
8489
|
| Prop | Type | Default | Description |
|
|
8548
8490
|
|---|---|---|---|
|
|
8549
|
-
| [`initialView`](
|
|
8491
|
+
| [`initialView`](#view) | [`ScheduleView`](#view) | — | The view to start from, read once when the hook first runs; a different value on a later render is ignored, as React ignores a changed `defaultValue`. To go to a view later, call `setView`. The schedule remembers none: where a view is kept is the application's decision. |
|
|
8550
8492
|
|
|
8551
|
-
From `ScheduleView` — the full table stands on [View](
|
|
8493
|
+
From `ScheduleView` — the full table stands on [View](#view).
|
|
8552
8494
|
|
|
8553
8495
|
| Prop | Type | Default | Description |
|
|
8554
8496
|
|---|---|---|---|
|
|
8555
|
-
| [`domain`](
|
|
8497
|
+
| [`domain`](#view) | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`. |
|
|
8556
8498
|
|
|
8557
8499
|
## API index
|
|
8558
8500
|
|
|
@@ -8562,8 +8504,6 @@ Every name the package exports, in one place.
|
|
|
8562
8504
|
|
|
8563
8505
|
Everything `@umriss-ui/schedule` exports, with its signature. A component's props stand on its own page.
|
|
8564
8506
|
|
|
8565
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/api/
|
|
8566
|
-
|
|
8567
8507
|
#### Hooks
|
|
8568
8508
|
|
|
8569
8509
|
##### `useSchedule`
|
|
@@ -8577,7 +8517,7 @@ Declares a schedule: hands back `Schedule` and the parts declared inside it
|
|
|
8577
8517
|
function useSchedule(options?: ScheduleOptions): ScheduleParts;
|
|
8578
8518
|
```
|
|
8579
8519
|
|
|
8580
|
-
Used on [Scenarios](
|
|
8520
|
+
Used on [Scenarios](#scenarios), [Installation](#installation), [First schedule](#first-schedule), [Lanes](#lanes), [Lane groups](#lane-groups), [Subtasks](#subtasks), [Bar labels](#bar-labels), [Appearances](#appearances), [Overlap](#overlap), [Dependencies](#dependencies), [Routes](#routes), [Time axis and calendar](#time-axis-and-calendar), [Blocked time](#blocked-time), [Milestones](#milestones), [Now line](#now-line), [Pan and zoom](#pan-and-zoom), [Selection](#selection), [Interactions](#interactions), [Tooltip](#tooltip), [View](#view), [Linked schedules](#linked-schedules), [The handle](#the-handle), [Findings as data](#findings-as-data), [Move and lane](#move-and-lane), [Stretch, lead-in, lead-out](#stretch-lead-in-lead-out), [Snapping](#snapping), [Placing from outside](#placing-from-outside), [Where a subtask may go](#where-a-subtask-may-go), [Ripple](#ripple) and [Benchmark](#benchmark).
|
|
8581
8521
|
|
|
8582
8522
|
#### Functions
|
|
8583
8523
|
|
|
@@ -8590,7 +8530,7 @@ it as it is.
|
|
|
8590
8530
|
function applyIntent<S extends Subtask>(subtask: S, intent: Intent): S;
|
|
8591
8531
|
```
|
|
8592
8532
|
|
|
8593
|
-
Used on [Scenarios](
|
|
8533
|
+
Used on [Scenarios](#scenarios), [Lane groups](#lane-groups), [Time axis and calendar](#time-axis-and-calendar), [Blocked time](#blocked-time), [Interactions](#interactions), [Move and lane](#move-and-lane), [Stretch, lead-in, lead-out](#stretch-lead-in-lead-out), [Snapping](#snapping), [Placing from outside](#placing-from-outside), [Where a subtask may go](#where-a-subtask-may-go) and [Ripple](#ripple).
|
|
8594
8534
|
|
|
8595
8535
|
##### `arrival`
|
|
8596
8536
|
|
|
@@ -8600,7 +8540,7 @@ When a dependency has to have arrived at its subtask, by its anchor.
|
|
|
8600
8540
|
function arrival(dependency: Dependency, to: Subtask): number;
|
|
8601
8541
|
```
|
|
8602
8542
|
|
|
8603
|
-
Used on [Scenarios](
|
|
8543
|
+
Used on [Scenarios](#scenarios), [Now line](#now-line) and [Findings as data](#findings-as-data).
|
|
8604
8544
|
|
|
8605
8545
|
##### `departure`
|
|
8606
8546
|
|
|
@@ -8610,7 +8550,7 @@ When a dependency leaves its subtask, by its anchor.
|
|
|
8610
8550
|
function departure(dependency: Dependency, from: Subtask): number;
|
|
8611
8551
|
```
|
|
8612
8552
|
|
|
8613
|
-
Used on [Findings as data](
|
|
8553
|
+
Used on [Findings as data](#findings-as-data).
|
|
8614
8554
|
|
|
8615
8555
|
##### `findings`
|
|
8616
8556
|
|
|
@@ -8620,7 +8560,7 @@ Every finding at once. Without blocked time there is none in it.
|
|
|
8620
8560
|
function findings(subtasks: readonly Subtask[], dependencies: readonly Dependency[], blocked?: readonly BlockedTime[]): Findings;
|
|
8621
8561
|
```
|
|
8622
8562
|
|
|
8623
|
-
Used on [Scenarios](
|
|
8563
|
+
Used on [Scenarios](#scenarios), [First schedule](#first-schedule), [Lane groups](#lane-groups), [Blocked time](#blocked-time), [Tooltip](#tooltip) and [Findings as data](#findings-as-data).
|
|
8624
8564
|
|
|
8625
8565
|
##### `inBlockedTime`
|
|
8626
8566
|
|
|
@@ -8632,7 +8572,7 @@ subtasks. Touching at a shared edge is not covering.
|
|
|
8632
8572
|
function inBlockedTime(subtasks: readonly Subtask[], blocked: readonly BlockedTime[]): InBlockedTime[];
|
|
8633
8573
|
```
|
|
8634
8574
|
|
|
8635
|
-
Used on [Scenarios](
|
|
8575
|
+
Used on [Scenarios](#scenarios), [Blocked time](#blocked-time) and [Findings as data](#findings-as-data).
|
|
8636
8576
|
|
|
8637
8577
|
##### `occupied`
|
|
8638
8578
|
|
|
@@ -8655,7 +8595,7 @@ nothing.
|
|
|
8655
8595
|
function overlaps(subtasks: readonly Subtask[]): Overlap[];
|
|
8656
8596
|
```
|
|
8657
8597
|
|
|
8658
|
-
Used on [Scenarios](
|
|
8598
|
+
Used on [Scenarios](#scenarios), [Lane groups](#lane-groups), [Findings as data](#findings-as-data) and [Move and lane](#move-and-lane).
|
|
8659
8599
|
|
|
8660
8600
|
##### `resolveAppearance`
|
|
8661
8601
|
|
|
@@ -8669,7 +8609,7 @@ Settles a subtask's appearances into what is drawn. `provisional` and
|
|
|
8669
8609
|
function resolveAppearance(appearance: readonly SubtaskAppearance[] | undefined): ResolvedAppearance;
|
|
8670
8610
|
```
|
|
8671
8611
|
|
|
8672
|
-
Used on [Appearances](
|
|
8612
|
+
Used on [Appearances](#appearances).
|
|
8673
8613
|
|
|
8674
8614
|
##### `ripple`
|
|
8675
8615
|
|
|
@@ -8682,14 +8622,14 @@ bounded number of pushes instead of running on.
|
|
|
8682
8622
|
function ripple(subtasks: readonly Subtask[], dependencies: readonly Dependency[], intent: Intent): MoveIntent[];
|
|
8683
8623
|
```
|
|
8684
8624
|
|
|
8685
|
-
Used on [Scenarios](
|
|
8625
|
+
Used on [Scenarios](#scenarios), [Dependencies](#dependencies) and [Ripple](#ripple).
|
|
8686
8626
|
|
|
8687
8627
|
##### `shiftTask`
|
|
8688
8628
|
|
|
8689
8629
|
The moves that carry a whole task in time - every subtask of it by the same
|
|
8690
8630
|
amount, so that its lengths and the distances between its stops stay as
|
|
8691
8631
|
they were. The schedule never runs it: apply the moves like any other
|
|
8692
|
-
intent, or run [`ripple`](
|
|
8632
|
+
intent, or run [`ripple`](#api-index-1) over them first.
|
|
8693
8633
|
|
|
8694
8634
|
- `subtasks` – All subtasks; only those of `task` are moved.
|
|
8695
8635
|
- `task` – The id of the task, as its subtasks name it in `task`.
|
|
@@ -8701,7 +8641,7 @@ or not finite.
|
|
|
8701
8641
|
function shiftTask(subtasks: readonly Subtask[], task: string, by: number): MoveIntent[];
|
|
8702
8642
|
```
|
|
8703
8643
|
|
|
8704
|
-
Used on [Scenarios](
|
|
8644
|
+
Used on [Scenarios](#scenarios) and [Ripple](#ripple).
|
|
8705
8645
|
|
|
8706
8646
|
##### `snapTime`
|
|
8707
8647
|
|
|
@@ -8713,7 +8653,7 @@ stays as it is.
|
|
|
8713
8653
|
function snapTime(time: number, raster: number | SnapRaster): number;
|
|
8714
8654
|
```
|
|
8715
8655
|
|
|
8716
|
-
Used on [Snapping](
|
|
8656
|
+
Used on [Snapping](#snapping).
|
|
8717
8657
|
|
|
8718
8658
|
##### `subtaskFromPlace`
|
|
8719
8659
|
|
|
@@ -8723,7 +8663,7 @@ The subtask a place intent asks for, under an id the caller chooses.
|
|
|
8723
8663
|
function subtaskFromPlace(intent: PlaceIntent, id: string): Subtask;
|
|
8724
8664
|
```
|
|
8725
8665
|
|
|
8726
|
-
Used on [Placing from outside](
|
|
8666
|
+
Used on [Placing from outside](#placing-from-outside) and [Where a subtask may go](#where-a-subtask-may-go).
|
|
8727
8667
|
|
|
8728
8668
|
##### `violatedDependencies`
|
|
8729
8669
|
|
|
@@ -8735,29 +8675,29 @@ is not in the data is passed over: there is nothing to judge.
|
|
|
8735
8675
|
function violatedDependencies(subtasks: readonly Subtask[], dependencies: readonly Dependency[]): ViolatedDependency[];
|
|
8736
8676
|
```
|
|
8737
8677
|
|
|
8738
|
-
Used on [Scenarios](
|
|
8678
|
+
Used on [Scenarios](#scenarios), [Lane groups](#lane-groups), [Tooltip](#tooltip) and [Findings as data](#findings-as-data).
|
|
8739
8679
|
|
|
8740
8680
|
#### Types
|
|
8741
8681
|
|
|
8742
8682
|
##### `BlockedTime`
|
|
8743
8683
|
|
|
8744
|
-
Its table stands on [Blocked time](
|
|
8684
|
+
Its table stands on [Blocked time](#blocked-time).
|
|
8745
8685
|
|
|
8746
|
-
Used on [Scenarios](
|
|
8686
|
+
Used on [Scenarios](#scenarios), [Blocked time](#blocked-time), [Tooltip](#tooltip), [Findings as data](#findings-as-data) and [Where a subtask may go](#where-a-subtask-may-go).
|
|
8747
8687
|
|
|
8748
8688
|
##### `BlockedTimesProps`
|
|
8749
8689
|
|
|
8750
|
-
Its table stands on [Blocked time](
|
|
8690
|
+
Its table stands on [Blocked time](#blocked-time).
|
|
8751
8691
|
|
|
8752
8692
|
##### `DependenciesProps`
|
|
8753
8693
|
|
|
8754
|
-
Its table stands on [Dependencies](
|
|
8694
|
+
Its table stands on [Dependencies](#dependencies).
|
|
8755
8695
|
|
|
8756
8696
|
##### `Dependency`
|
|
8757
8697
|
|
|
8758
|
-
Its table stands on [Dependencies](
|
|
8698
|
+
Its table stands on [Dependencies](#dependencies).
|
|
8759
8699
|
|
|
8760
|
-
Used on [Scenarios](
|
|
8700
|
+
Used on [Scenarios](#scenarios), [Installation](#installation), [First schedule](#first-schedule), [Lane groups](#lane-groups), [Dependencies](#dependencies), [Routes](#routes), [Time axis and calendar](#time-axis-and-calendar), [Selection](#selection), [Interactions](#interactions), [Tooltip](#tooltip), [Findings as data](#findings-as-data), [Move and lane](#move-and-lane), [Placing from outside](#placing-from-outside), [Ripple](#ripple) and [Benchmark](#benchmark).
|
|
8761
8701
|
|
|
8762
8702
|
##### `DependencyAttachment`
|
|
8763
8703
|
|
|
@@ -8773,7 +8713,7 @@ The tree has an **Anchor** of its own as well (CONTEXT.md).
|
|
|
8773
8713
|
type DependencyAttachment = "centre" | "nearest";
|
|
8774
8714
|
```
|
|
8775
8715
|
|
|
8776
|
-
Used on [Dependencies](
|
|
8716
|
+
Used on [Dependencies](#dependencies).
|
|
8777
8717
|
|
|
8778
8718
|
##### `DependencyEnds`
|
|
8779
8719
|
|
|
@@ -8785,7 +8725,7 @@ plan full of short moves - so it is the caller's choice.
|
|
|
8785
8725
|
type DependencyEnds = "dot" | "none";
|
|
8786
8726
|
```
|
|
8787
8727
|
|
|
8788
|
-
Used on [Dependencies](
|
|
8728
|
+
Used on [Dependencies](#dependencies).
|
|
8789
8729
|
|
|
8790
8730
|
##### `DependencyRoute`
|
|
8791
8731
|
|
|
@@ -8802,13 +8742,13 @@ Every kind of finding over the same data.
|
|
|
8802
8742
|
|
|
8803
8743
|
| Prop | Type | Default | Description |
|
|
8804
8744
|
|---|---|---|---|
|
|
8805
|
-
| `overlaps` *required* | `readonly `[`Overlap`](
|
|
8806
|
-
| `violatedDependencies` *required* | `readonly `[`ViolatedDependency`](
|
|
8807
|
-
| `inBlockedTime` *required* | `readonly `[`InBlockedTime`](
|
|
8745
|
+
| `overlaps` *required* | `readonly `[`Overlap`](#findings-as-data)`[]` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [List the findings (Findings as data)](#findings-as-data), [Say when there is nothing to fix (Findings as data)](#findings-as-data) and 1 more |
|
|
8746
|
+
| `violatedDependencies` *required* | `readonly `[`ViolatedDependency`](#findings-as-data)`[]` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [List the findings (Findings as data)](#findings-as-data), [Say when there is nothing to fix (Findings as data)](#findings-as-data) and 1 more |
|
|
8747
|
+
| `inBlockedTime` *required* | `readonly `[`InBlockedTime`](#findings-as-data)`[]` | — | <br>Shown in: [Block out leave and maintenance (Blocked time)](#blocked-time), [Check a sprint against the leave calendar (Blocked time)](#blocked-time), [List the findings (Findings as data)](#findings-as-data) and 3 more |
|
|
8808
8748
|
|
|
8809
8749
|
##### `InBlockedTime`
|
|
8810
8750
|
|
|
8811
|
-
Its table stands on [Findings as data](
|
|
8751
|
+
Its table stands on [Findings as data](#findings-as-data).
|
|
8812
8752
|
|
|
8813
8753
|
##### `Intent`
|
|
8814
8754
|
|
|
@@ -8820,7 +8760,7 @@ drop - a move and a lane - give the same data in either order.
|
|
|
8820
8760
|
type Intent = MoveIntent | StretchIntent | LeadInIntent | LeadOutIntent | LaneIntent | PlaceIntent;
|
|
8821
8761
|
```
|
|
8822
8762
|
|
|
8823
|
-
Used on [Scenarios](
|
|
8763
|
+
Used on [Scenarios](#scenarios), [Blocked time](#blocked-time), [Move and lane](#move-and-lane), [Placing from outside](#placing-from-outside), [Where a subtask may go](#where-a-subtask-may-go) and [Ripple](#ripple).
|
|
8824
8764
|
|
|
8825
8765
|
##### `IntentKind`
|
|
8826
8766
|
|
|
@@ -8832,7 +8772,7 @@ type IntentKind = Intent["kind"];
|
|
|
8832
8772
|
|
|
8833
8773
|
##### `LaneGroupProps`
|
|
8834
8774
|
|
|
8835
|
-
Its table stands on [Lane groups](
|
|
8775
|
+
Its table stands on [Lane groups](#lane-groups).
|
|
8836
8776
|
|
|
8837
8777
|
##### `LaneIntent`
|
|
8838
8778
|
|
|
@@ -8840,13 +8780,13 @@ Put the subtask on another lane.
|
|
|
8840
8780
|
|
|
8841
8781
|
| Prop | Type | Default | Description |
|
|
8842
8782
|
|---|---|---|---|
|
|
8843
|
-
| `kind` *required* | `"lane"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
8844
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](
|
|
8783
|
+
| `kind` *required* | `"lane"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 7 more |
|
|
8784
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 4 more |
|
|
8845
8785
|
| `lane` *required* | `string` | — | The id of the new lane. |
|
|
8846
8786
|
|
|
8847
8787
|
##### `LaneProps`
|
|
8848
8788
|
|
|
8849
|
-
Its table stands on [Lanes](
|
|
8789
|
+
Its table stands on [Lanes](#lanes).
|
|
8850
8790
|
|
|
8851
8791
|
##### `LeadInIntent`
|
|
8852
8792
|
|
|
@@ -8854,9 +8794,9 @@ Change the lead-in on its own.
|
|
|
8854
8794
|
|
|
8855
8795
|
| Prop | Type | Default | Description |
|
|
8856
8796
|
|---|---|---|---|
|
|
8857
|
-
| `kind` *required* | `"leadIn"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
8858
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](
|
|
8859
|
-
| `leadIn` *required* | `number` | — | The new duration of the lead-in.<br>Shown in: [Replan the day on the line (Scenarios)](
|
|
8797
|
+
| `kind` *required* | `"leadIn"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 7 more |
|
|
8798
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 4 more |
|
|
8799
|
+
| `leadIn` *required* | `number` | — | The new duration of the lead-in.<br>Shown in: [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
8860
8800
|
|
|
8861
8801
|
##### `LeadOutIntent`
|
|
8862
8802
|
|
|
@@ -8864,19 +8804,19 @@ Change the lead-out on its own.
|
|
|
8864
8804
|
|
|
8865
8805
|
| Prop | Type | Default | Description |
|
|
8866
8806
|
|---|---|---|---|
|
|
8867
|
-
| `kind` *required* | `"leadOut"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
8868
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](
|
|
8807
|
+
| `kind` *required* | `"leadOut"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 7 more |
|
|
8808
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 4 more |
|
|
8869
8809
|
| `leadOut` *required* | `number` | — | The new duration of the lead-out. |
|
|
8870
8810
|
|
|
8871
8811
|
##### `Milestone`
|
|
8872
8812
|
|
|
8873
|
-
Its table stands on [Milestones](
|
|
8813
|
+
Its table stands on [Milestones](#milestones).
|
|
8874
8814
|
|
|
8875
|
-
Used on [Milestones](
|
|
8815
|
+
Used on [Milestones](#milestones).
|
|
8876
8816
|
|
|
8877
8817
|
##### `MilestonesProps`
|
|
8878
8818
|
|
|
8879
|
-
Its table stands on [Milestones](
|
|
8819
|
+
Its table stands on [Milestones](#milestones).
|
|
8880
8820
|
|
|
8881
8821
|
##### `MoveIntent`
|
|
8882
8822
|
|
|
@@ -8884,16 +8824,16 @@ Move the subtask in time: the main time keeps its length.
|
|
|
8884
8824
|
|
|
8885
8825
|
| Prop | Type | Default | Description |
|
|
8886
8826
|
|---|---|---|---|
|
|
8887
|
-
| `kind` *required* | `"move"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
8888
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](
|
|
8889
|
-
| `from` *required* | `number` | — | The new start of the main time.<br>Shown in: [Push the later stops of a tour (Ripple)](
|
|
8890
|
-
| `to` *required* | `number` | — | The new end of the main time.<br>Shown in: [Push the later stops of a tour (Ripple)](
|
|
8827
|
+
| `kind` *required* | `"move"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 8 more |
|
|
8828
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 5 more |
|
|
8829
|
+
| `from` *required* | `number` | — | The new start of the main time.<br>Shown in: [Push the later stops of a tour (Ripple)](#ripple), [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
8830
|
+
| `to` *required* | `number` | — | The new end of the main time.<br>Shown in: [Push the later stops of a tour (Ripple)](#ripple), [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
8891
8831
|
|
|
8892
|
-
Used on [Ripple](
|
|
8832
|
+
Used on [Ripple](#ripple).
|
|
8893
8833
|
|
|
8894
8834
|
##### `Overlap`
|
|
8895
8835
|
|
|
8896
|
-
Its table stands on [Findings as data](
|
|
8836
|
+
Its table stands on [Findings as data](#findings-as-data).
|
|
8897
8837
|
|
|
8898
8838
|
##### `PlaceIntent`
|
|
8899
8839
|
|
|
@@ -8904,10 +8844,10 @@ no subtask yet; the caller creates one, with its own identity, from
|
|
|
8904
8844
|
|
|
8905
8845
|
| Prop | Type | Default | Description |
|
|
8906
8846
|
|---|---|---|---|
|
|
8907
|
-
| `kind` *required* | `"place"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
8908
|
-
| `item` *required* | `string` | — | The caller's key for the dragged item, as it declared it while dragging.<br>Shown in: [Drag work in from the backlog (Placing from outside)](
|
|
8847
|
+
| `kind` *required* | `"place"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 7 more |
|
|
8848
|
+
| `item` *required* | `string` | — | The caller's key for the dragged item, as it declared it while dragging.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go), [Replan the day on the line (Scenarios)](#replan-the-day-on-the-line) |
|
|
8909
8849
|
| `task` *required* | `string` | — | The task the work belongs to. |
|
|
8910
|
-
| `lane` *required* | `string` | — | The lane it was dropped on.<br>Shown in: [Drag work in from the backlog (Placing from outside)](
|
|
8850
|
+
| `lane` *required* | `string` | — | The lane it was dropped on.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go) |
|
|
8911
8851
|
| `from` *required* | `number` | — | Where its main time would start. |
|
|
8912
8852
|
| `to` *required* | `number` | — | Where its main time would end. |
|
|
8913
8853
|
| `leadIn` | `number` | — | The lead-in it was declared with. |
|
|
@@ -8921,13 +8861,13 @@ the drop can only come from the caller.
|
|
|
8921
8861
|
|
|
8922
8862
|
| Prop | Type | Default | Description |
|
|
8923
8863
|
|---|---|---|---|
|
|
8924
|
-
| `item` *required* | `string` | — | The caller's key for the dragged item; it comes back in the intent.<br>Shown in: [Drag work in from the backlog (Placing from outside)](
|
|
8925
|
-
| `task` *required* | `string` | — | The task the work belongs to.<br>Shown in: [Drag work in from the backlog (Placing from outside)](
|
|
8926
|
-
| `duration` *required* | `number` | — | How long its main time is.<br>Shown in: [Drag work in from the backlog (Placing from outside)](
|
|
8864
|
+
| `item` *required* | `string` | — | The caller's key for the dragged item; it comes back in the intent.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go) |
|
|
8865
|
+
| `task` *required* | `string` | — | The task the work belongs to.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go) |
|
|
8866
|
+
| `duration` *required* | `number` | — | How long its main time is.<br>Shown in: [Drag work in from the backlog (Placing from outside)](#placing-from-outside), [Apply the same rule to work dragged in (Where a subtask may go)](#where-a-subtask-may-go) |
|
|
8927
8867
|
| `leadIn` | `number` | — | The lead-in it brings. |
|
|
8928
8868
|
| `leadOut` | `number` | — | The lead-out it brings. |
|
|
8929
8869
|
|
|
8930
|
-
Used on [Placing from outside](
|
|
8870
|
+
Used on [Placing from outside](#placing-from-outside) and [Where a subtask may go](#where-a-subtask-may-go).
|
|
8931
8871
|
|
|
8932
8872
|
##### `ResolvedAppearance`
|
|
8933
8873
|
|
|
@@ -8950,11 +8890,11 @@ point on the screen and a time on a lane. Everything else is props.
|
|
|
8950
8890
|
|
|
8951
8891
|
| Prop | Type | Default | Description |
|
|
8952
8892
|
|---|---|---|---|
|
|
8953
|
-
| `positionAt` *required* | `(clientX: number, clientY: number) => { time: number; lane: string \| null } \| null` | — | The time and the lane at a client point, or null outside the plot.<br>Shown in: [Place a mark of your own (The handle)](
|
|
8954
|
-
| `clientPointOf` *required* | `(time: number, lane?: string) => { x: number; y: number } \| null` | — | The client point of a time - on the middle of a lane where one is named - or null while the schedule is not on screen.<br>Shown in: [Place a mark of your own (The handle)](
|
|
8893
|
+
| `positionAt` *required* | `(clientX: number, clientY: number) => { time: number; lane: string \| null } \| null` | — | The time and the lane at a client point, or null outside the plot.<br>Shown in: [Place a mark of your own (The handle)](#the-handle) |
|
|
8894
|
+
| `clientPointOf` *required* | `(time: number, lane?: string) => { x: number; y: number } \| null` | — | The client point of a time - on the middle of a lane where one is named - or null while the schedule is not on screen.<br>Shown in: [Place a mark of your own (The handle)](#the-handle) |
|
|
8955
8895
|
| `visibleDomain` *required* | `() => readonly [number, number]` | — | The visible span, as two wall-clock instants. |
|
|
8956
8896
|
|
|
8957
|
-
Used on [The handle](
|
|
8897
|
+
Used on [The handle](#the-handle).
|
|
8958
8898
|
|
|
8959
8899
|
##### `ScheduleHit`
|
|
8960
8900
|
|
|
@@ -8971,13 +8911,13 @@ type ScheduleHit =
|
|
|
8971
8911
|
|
|
8972
8912
|
##### `ScheduleInteraction`
|
|
8973
8913
|
|
|
8974
|
-
Its table stands on [Interactions](
|
|
8914
|
+
Its table stands on [Interactions](#interactions).
|
|
8975
8915
|
|
|
8976
|
-
Used on [Scenarios](
|
|
8916
|
+
Used on [Scenarios](#scenarios), [Interactions](#interactions), [Tooltip](#tooltip) and [Benchmark](#benchmark).
|
|
8977
8917
|
|
|
8978
8918
|
##### `ScheduleOptions`
|
|
8979
8919
|
|
|
8980
|
-
Its table stands on [View](
|
|
8920
|
+
Its table stands on [View](#view).
|
|
8981
8921
|
|
|
8982
8922
|
##### `ScheduleParts`
|
|
8983
8923
|
|
|
@@ -8986,37 +8926,37 @@ it, its view and the setters that change it.
|
|
|
8986
8926
|
|
|
8987
8927
|
| Prop | Type | Default | Description |
|
|
8988
8928
|
|---|---|---|---|
|
|
8989
|
-
| `Schedule` *required* | `(props: `[`ScheduleProps`](
|
|
8990
|
-
| `Lane` *required* | `typeof Lane` | — | <br>Shown in: [The smallest schedule (Installation)](
|
|
8991
|
-
| `LaneGroup` *required* | `typeof LaneGroup` | — | <br>Shown in: [Group lanes under a head (Lane groups)](
|
|
8992
|
-
| `Subtasks` *required* | `typeof Subtasks` | — | <br>Shown in: [The smallest schedule (Installation)](
|
|
8993
|
-
| `Dependencies` *required* | `typeof Dependencies` | — | <br>Shown in: [The smallest schedule (Installation)](
|
|
8994
|
-
| `BlockedTimes` *required* | `typeof BlockedTimes` | — | <br>Shown in: [Block out leave and maintenance (Blocked time)](
|
|
8995
|
-
| `Milestones` *required* | `typeof Milestones` | — | <br>Shown in: [Mark a handover and a release (Milestones)](
|
|
8996
|
-
| `view` *required* | [`ScheduleView`](
|
|
8997
|
-
| `setView` *required* | `(view: `[`ScheduleView`](
|
|
8998
|
-
| `setDomain` *required* | `(span: readonly [number, number] \| null) => void` | — | Puts a span of two wall-clock instants in view; `null` shows the subtasks' extent.<br>Shown in: [Keep and restore a view (View)](
|
|
8929
|
+
| `Schedule` *required* | `(props: `[`ScheduleProps`](#first-schedule)`) => ReactNode` | — | The schedule. One per `useSchedule`: a second schedule is a second call.<br>Shown in: [The smallest schedule (Installation)](#installation), [A day of tours (First schedule)](#first-schedule), [Start from an empty plan (First schedule)](#first-schedule) and 78 more |
|
|
8930
|
+
| `Lane` *required* | `typeof Lane` | — | <br>Shown in: [The smallest schedule (Installation)](#installation), [A day of tours (First schedule)](#first-schedule), [Start from an empty plan (First schedule)](#first-schedule) and 78 more |
|
|
8931
|
+
| `LaneGroup` *required* | `typeof LaneGroup` | — | <br>Shown in: [Group lanes under a head (Lane groups)](#lane-groups), [Nest groups to any depth (Lane groups)](#lane-groups), [Fold groups from outside (Lane groups)](#lane-groups) and 5 more |
|
|
8932
|
+
| `Subtasks` *required* | `typeof Subtasks` | — | <br>Shown in: [The smallest schedule (Installation)](#installation), [A day of tours (First schedule)](#first-schedule), [Start from an empty plan (First schedule)](#first-schedule) and 78 more |
|
|
8933
|
+
| `Dependencies` *required* | `typeof Dependencies` | — | <br>Shown in: [The smallest schedule (Installation)](#installation), [A day of tours (First schedule)](#first-schedule), [Plan a day in the machine shop (First schedule)](#first-schedule) and 28 more |
|
|
8934
|
+
| `BlockedTimes` *required* | `typeof BlockedTimes` | — | <br>Shown in: [Block out leave and maintenance (Blocked time)](#blocked-time), [Plan work around someone's leave (Blocked time)](#blocked-time), [Check a sprint against the leave calendar (Blocked time)](#blocked-time) and 5 more |
|
|
8935
|
+
| `Milestones` *required* | `typeof Milestones` | — | <br>Shown in: [Mark a handover and a release (Milestones)](#milestones), [Say what a milestone is in your own tooltip (Milestones)](#milestones) |
|
|
8936
|
+
| `view` *required* | [`ScheduleView`](#view) | — | How the planner is looking at the plan: the span and the folded groups.<br>Shown in: [Fold groups from outside (Lane groups)](#lane-groups), [Keep and restore a view (View)](#view), [Keep two schedules in step (Linked schedules)](#linked-schedules) and 1 more |
|
|
8937
|
+
| `setView` *required* | `(view: `[`ScheduleView`](#view)`) => void` | — | Goes to a whole view; what it leaves out is shown whole again. Not reported through `onViewChange`: two schedules kept in step by `onViewChange: (v) => other.setView(v)` in both directions do not answer each other. A view with the content already shown changes nothing.<br>Shown in: [Keep and restore a view (View)](#view), [Keep two schedules in step (Linked schedules)](#linked-schedules), [Read a rota beside the incidents (Linked schedules)](#linked-schedules) |
|
|
8938
|
+
| `setDomain` *required* | `(span: readonly [number, number] \| null) => void` | — | Puts a span of two wall-clock instants in view; `null` shows the subtasks' extent.<br>Shown in: [Keep and restore a view (View)](#view) |
|
|
8999
8939
|
| `toggleGroup` *required* | `(id: string) => void` | — | Folds or unfolds one **Lane group**. |
|
|
9000
|
-
| `foldAll` *required* | `() => void` | — | Folds every group.<br>Shown in: [Fold groups from outside (Lane groups)](
|
|
9001
|
-
| `unfoldAll` *required* | `() => void` | — | Unfolds every group.<br>Shown in: [Fold groups from outside (Lane groups)](
|
|
8940
|
+
| `foldAll` *required* | `() => void` | — | Folds every group.<br>Shown in: [Fold groups from outside (Lane groups)](#lane-groups) |
|
|
8941
|
+
| `unfoldAll` *required* | `() => void` | — | Unfolds every group.<br>Shown in: [Fold groups from outside (Lane groups)](#lane-groups) |
|
|
9002
8942
|
|
|
9003
|
-
Used on [Linked schedules](
|
|
8943
|
+
Used on [Linked schedules](#linked-schedules).
|
|
9004
8944
|
|
|
9005
8945
|
##### `ScheduleProps`
|
|
9006
8946
|
|
|
9007
|
-
Its table stands on [First schedule](
|
|
8947
|
+
Its table stands on [First schedule](#first-schedule).
|
|
9008
8948
|
|
|
9009
8949
|
##### `ScheduleTooltipTarget`
|
|
9010
8950
|
|
|
9011
|
-
Its table stands on [Tooltip](
|
|
8951
|
+
Its table stands on [Tooltip](#tooltip).
|
|
9012
8952
|
|
|
9013
|
-
Used on [Milestones](
|
|
8953
|
+
Used on [Milestones](#milestones) and [Tooltip](#tooltip).
|
|
9014
8954
|
|
|
9015
8955
|
##### `ScheduleView`
|
|
9016
8956
|
|
|
9017
|
-
Its table stands on [View](
|
|
8957
|
+
Its table stands on [View](#view).
|
|
9018
8958
|
|
|
9019
|
-
Used on [View](
|
|
8959
|
+
Used on [View](#view).
|
|
9020
8960
|
|
|
9021
8961
|
##### `SnapRaster`
|
|
9022
8962
|
|
|
@@ -9024,10 +8964,10 @@ A raster: a step, and where it starts after local midnight.
|
|
|
9024
8964
|
|
|
9025
8965
|
| Prop | Type | Default | Description |
|
|
9026
8966
|
|---|---|---|---|
|
|
9027
|
-
| `step` *required* | `number` | — | The distance between two lines of the raster, in milliseconds.<br>Shown in: [Snap to handover times (Snapping)](
|
|
9028
|
-
| `offset` *required* | `number` | — | Where the raster starts after local midnight, in milliseconds: six hours for handovers at 06:00, 14:00 and 22:00.<br>Shown in: [Snap to handover times (Snapping)](
|
|
8967
|
+
| `step` *required* | `number` | — | The distance between two lines of the raster, in milliseconds.<br>Shown in: [Snap to handover times (Snapping)](#snapping) |
|
|
8968
|
+
| `offset` *required* | `number` | — | Where the raster starts after local midnight, in milliseconds: six hours for handovers at 06:00, 14:00 and 22:00.<br>Shown in: [Snap to handover times (Snapping)](#snapping) |
|
|
9029
8969
|
|
|
9030
|
-
Used on [Snapping](
|
|
8970
|
+
Used on [Snapping](#snapping).
|
|
9031
8971
|
|
|
9032
8972
|
##### `StretchIntent`
|
|
9033
8973
|
|
|
@@ -9035,16 +8975,16 @@ Stretch the main time at one or both of its edges.
|
|
|
9035
8975
|
|
|
9036
8976
|
| Prop | Type | Default | Description |
|
|
9037
8977
|
|---|---|---|---|
|
|
9038
|
-
| `kind` *required* | `"stretch"` | — | <br>Shown in: [Read a folded group (Lane groups)](
|
|
9039
|
-
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](
|
|
8978
|
+
| `kind` *required* | `"stretch"` | — | <br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 7 more |
|
|
8979
|
+
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#lane-groups), [Plan work around someone's leave (Blocked time)](#blocked-time), [Refuse a move that double-books someone (Move and lane)](#move-and-lane) and 4 more |
|
|
9040
8980
|
| `from` *required* | `number` | — | The new start of the main time. |
|
|
9041
8981
|
| `to` *required* | `number` | — | The new end of the main time. |
|
|
9042
8982
|
|
|
9043
8983
|
##### `Subtask`
|
|
9044
8984
|
|
|
9045
|
-
Its table stands on [Subtasks](
|
|
8985
|
+
Its table stands on [Subtasks](#subtasks).
|
|
9046
8986
|
|
|
9047
|
-
Used on [Scenarios](
|
|
8987
|
+
Used on [Scenarios](#scenarios), [Installation](#installation), [First schedule](#first-schedule), [Lanes](#lanes), [Lane groups](#lane-groups), [Subtasks](#subtasks), [Bar labels](#bar-labels), [Appearances](#appearances), [Overlap](#overlap), [Dependencies](#dependencies), [Routes](#routes), [Time axis and calendar](#time-axis-and-calendar), [Blocked time](#blocked-time), [Milestones](#milestones), [Now line](#now-line), [Pan and zoom](#pan-and-zoom), [Selection](#selection), [Interactions](#interactions), [Tooltip](#tooltip), [View](#view), [Linked schedules](#linked-schedules), [The handle](#the-handle), [Findings as data](#findings-as-data), [Move and lane](#move-and-lane), [Stretch, lead-in, lead-out](#stretch-lead-in-lead-out), [Snapping](#snapping), [Placing from outside](#placing-from-outside), [Where a subtask may go](#where-a-subtask-may-go), [Ripple](#ripple) and [Benchmark](#benchmark).
|
|
9048
8988
|
|
|
9049
8989
|
##### `SubtaskAppearance`
|
|
9050
8990
|
|
|
@@ -9056,19 +8996,19 @@ type SubtaskAppearance = "provisional" | "fixed" | "muted" | "open";
|
|
|
9056
8996
|
|
|
9057
8997
|
##### `SubtasksProps`
|
|
9058
8998
|
|
|
9059
|
-
Its table stands on [Subtasks](
|
|
8999
|
+
Its table stands on [Subtasks](#subtasks).
|
|
9060
9000
|
|
|
9061
9001
|
##### `Task`
|
|
9062
9002
|
|
|
9063
|
-
Its table stands on [Subtasks](
|
|
9003
|
+
Its table stands on [Subtasks](#subtasks).
|
|
9064
9004
|
|
|
9065
|
-
Used on [Scenarios](
|
|
9005
|
+
Used on [Scenarios](#scenarios), [Installation](#installation), [First schedule](#first-schedule), [Lanes](#lanes), [Lane groups](#lane-groups), [Subtasks](#subtasks), [Bar labels](#bar-labels), [Appearances](#appearances), [Overlap](#overlap), [Dependencies](#dependencies), [Routes](#routes), [Time axis and calendar](#time-axis-and-calendar), [Blocked time](#blocked-time), [Milestones](#milestones), [Now line](#now-line), [Pan and zoom](#pan-and-zoom), [Selection](#selection), [Interactions](#interactions), [Tooltip](#tooltip), [View](#view), [Linked schedules](#linked-schedules), [The handle](#the-handle), [Findings as data](#findings-as-data), [Move and lane](#move-and-lane), [Stretch, lead-in, lead-out](#stretch-lead-in-lead-out), [Snapping](#snapping), [Placing from outside](#placing-from-outside), [Where a subtask may go](#where-a-subtask-may-go), [Ripple](#ripple) and [Benchmark](#benchmark).
|
|
9066
9006
|
|
|
9067
9007
|
##### `ViolatedDependency`
|
|
9068
9008
|
|
|
9069
|
-
Its table stands on [Findings as data](
|
|
9009
|
+
Its table stands on [Findings as data](#findings-as-data).
|
|
9070
9010
|
|
|
9071
|
-
Used on [Dependencies](
|
|
9011
|
+
Used on [Dependencies](#dependencies).
|
|
9072
9012
|
|
|
9073
9013
|
##### `ZoomLimits`
|
|
9074
9014
|
|
|
@@ -9076,5 +9016,5 @@ The narrowest and the widest span zoom may reach.
|
|
|
9076
9016
|
|
|
9077
9017
|
| Prop | Type | Default | Description |
|
|
9078
9018
|
|---|---|---|---|
|
|
9079
|
-
| `min` *required* | `number` | — | <br>Shown in: [Move through the plan (Pan and zoom)](
|
|
9080
|
-
| `max` *required* | `number` | — | <br>Shown in: [Move through the plan (Pan and zoom)](
|
|
9019
|
+
| `min` *required* | `number` | — | <br>Shown in: [Move through the plan (Pan and zoom)](#pan-and-zoom) |
|
|
9020
|
+
| `max` *required* | `number` | — | <br>Shown in: [Move through the plan (Pan and zoom)](#pan-and-zoom) |
|