@baack-software/baack-ts-tasks 0.0.0-stage → 0.0.1
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/LICENSE +201 -0
- package/README.md +158 -2
- package/dist/activity.d.ts +20 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/activity.js +75 -0
- package/dist/activity.js.map +1 -0
- package/dist/blockers.d.ts +28 -0
- package/dist/blockers.d.ts.map +1 -0
- package/dist/blockers.js +134 -0
- package/dist/blockers.js.map +1 -0
- package/dist/conflicts.d.ts +50 -0
- package/dist/conflicts.d.ts.map +1 -0
- package/dist/conflicts.js +73 -0
- package/dist/conflicts.js.map +1 -0
- package/dist/draft.d.ts +45 -0
- package/dist/draft.d.ts.map +1 -0
- package/dist/draft.js +155 -0
- package/dist/draft.js.map +1 -0
- package/dist/errors.d.ts +30 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +37 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/react/TaskActivity.d.ts +15 -0
- package/dist/react/TaskActivity.d.ts.map +1 -0
- package/dist/react/TaskActivity.js +60 -0
- package/dist/react/TaskActivity.js.map +1 -0
- package/dist/react/TaskBoard.d.ts +38 -0
- package/dist/react/TaskBoard.d.ts.map +1 -0
- package/dist/react/TaskBoard.js +85 -0
- package/dist/react/TaskBoard.js.map +1 -0
- package/dist/react/TaskConflicts.d.ts +26 -0
- package/dist/react/TaskConflicts.d.ts.map +1 -0
- package/dist/react/TaskConflicts.js +87 -0
- package/dist/react/TaskConflicts.js.map +1 -0
- package/dist/react/TaskCreateForm.d.ts +13 -0
- package/dist/react/TaskCreateForm.d.ts.map +1 -0
- package/dist/react/TaskCreateForm.js +68 -0
- package/dist/react/TaskCreateForm.js.map +1 -0
- package/dist/react/TaskEditor.d.ts +33 -0
- package/dist/react/TaskEditor.d.ts.map +1 -0
- package/dist/react/TaskEditor.js +172 -0
- package/dist/react/TaskEditor.js.map +1 -0
- package/dist/react/TaskFilters.d.ts +15 -0
- package/dist/react/TaskFilters.d.ts.map +1 -0
- package/dist/react/TaskFilters.js +48 -0
- package/dist/react/TaskFilters.js.map +1 -0
- package/dist/react/TaskView.d.ts +30 -0
- package/dist/react/TaskView.d.ts.map +1 -0
- package/dist/react/TaskView.js +108 -0
- package/dist/react/TaskView.js.map +1 -0
- package/dist/react/TasksAbout.d.ts +24 -0
- package/dist/react/TasksAbout.d.ts.map +1 -0
- package/dist/react/TasksAbout.js +82 -0
- package/dist/react/TasksAbout.js.map +1 -0
- package/dist/react/copy.d.ts +154 -0
- package/dist/react/copy.d.ts.map +1 -0
- package/dist/react/copy.js +173 -0
- package/dist/react/copy.js.map +1 -0
- package/dist/react/fields.d.ts +36 -0
- package/dist/react/fields.d.ts.map +1 -0
- package/dist/react/fields.js +21 -0
- package/dist/react/fields.js.map +1 -0
- package/dist/react/hooks.d.ts +9 -0
- package/dist/react/hooks.d.ts.map +1 -0
- package/dist/react/hooks.js +31 -0
- package/dist/react/hooks.js.map +1 -0
- package/dist/react/index.d.ts +13 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +13 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/parts.d.ts +55 -0
- package/dist/react/parts.d.ts.map +1 -0
- package/dist/react/parts.js +92 -0
- package/dist/react/parts.js.map +1 -0
- package/dist/react/ui/alert.d.ts +11 -0
- package/dist/react/ui/alert.d.ts.map +1 -0
- package/dist/react/ui/alert.js +29 -0
- package/dist/react/ui/alert.js.map +1 -0
- package/dist/react/ui/avatar.d.ts +12 -0
- package/dist/react/ui/avatar.d.ts.map +1 -0
- package/dist/react/ui/avatar.js +24 -0
- package/dist/react/ui/avatar.js.map +1 -0
- package/dist/react/ui/badge.d.ts +10 -0
- package/dist/react/ui/badge.d.ts.map +1 -0
- package/dist/react/ui/badge.js +26 -0
- package/dist/react/ui/badge.js.map +1 -0
- package/dist/react/ui/button.d.ts +11 -0
- package/dist/react/ui/button.d.ts.map +1 -0
- package/dist/react/ui/button.js +37 -0
- package/dist/react/ui/button.js.map +1 -0
- package/dist/react/ui/card.d.ts +12 -0
- package/dist/react/ui/card.d.ts.map +1 -0
- package/dist/react/ui/card.js +26 -0
- package/dist/react/ui/card.js.map +1 -0
- package/dist/react/ui/input.d.ts +4 -0
- package/dist/react/ui/input.d.ts.map +1 -0
- package/dist/react/ui/input.js +8 -0
- package/dist/react/ui/input.js.map +1 -0
- package/dist/react/ui/label.d.ts +5 -0
- package/dist/react/ui/label.d.ts.map +1 -0
- package/dist/react/ui/label.js +10 -0
- package/dist/react/ui/label.js.map +1 -0
- package/dist/react/ui/radio-group.d.ts +6 -0
- package/dist/react/ui/radio-group.d.ts.map +1 -0
- package/dist/react/ui/radio-group.js +12 -0
- package/dist/react/ui/radio-group.js.map +1 -0
- package/dist/react/ui/select.d.ts +16 -0
- package/dist/react/ui/select.d.ts.map +1 -0
- package/dist/react/ui/select.js +37 -0
- package/dist/react/ui/select.js.map +1 -0
- package/dist/react/ui/separator.d.ts +5 -0
- package/dist/react/ui/separator.d.ts.map +1 -0
- package/dist/react/ui/separator.js +10 -0
- package/dist/react/ui/separator.js.map +1 -0
- package/dist/react/ui/sheet.d.ts +15 -0
- package/dist/react/ui/sheet.d.ts.map +1 -0
- package/dist/react/ui/sheet.js +38 -0
- package/dist/react/ui/sheet.js.map +1 -0
- package/dist/react/ui/skeleton.d.ts +3 -0
- package/dist/react/ui/skeleton.d.ts.map +1 -0
- package/dist/react/ui/skeleton.js +7 -0
- package/dist/react/ui/skeleton.js.map +1 -0
- package/dist/react/ui/table.d.ts +11 -0
- package/dist/react/ui/table.d.ts.map +1 -0
- package/dist/react/ui/table.js +29 -0
- package/dist/react/ui/table.js.map +1 -0
- package/dist/react/ui/tabs.d.ts +12 -0
- package/dist/react/ui/tabs.d.ts.map +1 -0
- package/dist/react/ui/tabs.js +31 -0
- package/dist/react/ui/tabs.js.map +1 -0
- package/dist/react/ui/textarea.d.ts +4 -0
- package/dist/react/ui/textarea.d.ts.map +1 -0
- package/dist/react/ui/textarea.js +8 -0
- package/dist/react/ui/textarea.js.map +1 -0
- package/dist/react/ui/toggle-group.d.ts +11 -0
- package/dist/react/ui/toggle-group.d.ts.map +1 -0
- package/dist/react/ui/toggle-group.js +25 -0
- package/dist/react/ui/toggle-group.js.map +1 -0
- package/dist/react/ui/toggle.d.ts +10 -0
- package/dist/react/ui/toggle.d.ts.map +1 -0
- package/dist/react/ui/toggle.js +27 -0
- package/dist/react/ui/toggle.js.map +1 -0
- package/dist/refs.d.ts +16 -0
- package/dist/refs.d.ts.map +1 -0
- package/dist/refs.js +43 -0
- package/dist/refs.js.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/recipes.d.ts +39 -0
- package/dist/server/recipes.d.ts.map +1 -0
- package/dist/server/recipes.js +81 -0
- package/dist/server/recipes.js.map +1 -0
- package/dist/server/webhooks.d.ts +135 -0
- package/dist/server/webhooks.d.ts.map +1 -0
- package/dist/server/webhooks.js +243 -0
- package/dist/server/webhooks.js.map +1 -0
- package/dist/store.d.ts +124 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +443 -0
- package/dist/store.js.map +1 -0
- package/dist/task-client.d.ts +137 -0
- package/dist/task-client.d.ts.map +1 -0
- package/dist/task-client.js +271 -0
- package/dist/task-client.js.map +1 -0
- package/dist/tasks.d.ts +84 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +208 -0
- package/dist/tasks.js.map +1 -0
- package/dist/time.d.ts +15 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +34 -0
- package/dist/time.js.map +1 -0
- package/dist/types.d.ts +74 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +101 -4
- package/src/activity.ts +86 -0
- package/src/blockers.ts +134 -0
- package/src/conflicts.ts +115 -0
- package/src/draft.ts +162 -0
- package/src/errors.ts +40 -0
- package/src/index.ts +10 -0
- package/src/react/TaskActivity.tsx +187 -0
- package/src/react/TaskBoard.tsx +264 -0
- package/src/react/TaskConflicts.tsx +217 -0
- package/src/react/TaskCreateForm.tsx +165 -0
- package/src/react/TaskEditor.tsx +485 -0
- package/src/react/TaskFilters.tsx +122 -0
- package/src/react/TaskView.tsx +291 -0
- package/src/react/TasksAbout.tsx +226 -0
- package/src/react/copy.tsx +253 -0
- package/src/react/fields.tsx +104 -0
- package/src/react/hooks.ts +41 -0
- package/src/react/index.ts +12 -0
- package/src/react/parts.tsx +176 -0
- package/src/react/ui/README.md +6 -0
- package/src/react/ui/alert.tsx +75 -0
- package/src/react/ui/avatar.tsx +109 -0
- package/src/react/ui/badge.tsx +48 -0
- package/src/react/ui/button.tsx +66 -0
- package/src/react/ui/card.tsx +102 -0
- package/src/react/ui/input.tsx +18 -0
- package/src/react/ui/label.tsx +23 -0
- package/src/react/ui/radio-group.tsx +41 -0
- package/src/react/ui/select.tsx +189 -0
- package/src/react/ui/separator.tsx +27 -0
- package/src/react/ui/sheet.tsx +145 -0
- package/src/react/ui/skeleton.tsx +13 -0
- package/src/react/ui/table.tsx +113 -0
- package/src/react/ui/tabs.tsx +89 -0
- package/src/react/ui/textarea.tsx +17 -0
- package/src/react/ui/toggle-group.tsx +89 -0
- package/src/react/ui/toggle.tsx +44 -0
- package/src/refs.ts +49 -0
- package/src/server/index.ts +3 -0
- package/src/server/recipes.ts +107 -0
- package/src/server/webhooks.ts +369 -0
- package/src/store.ts +538 -0
- package/src/task-client.ts +373 -0
- package/src/tasks.ts +263 -0
- package/src/time.ts +35 -0
- package/src/types.ts +101 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Task } from '@baack-software/baack-ts-client';
|
|
2
|
+
import { type Ref, type TaskInput, type TaskListField } from './types.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Finding and resolving conflicting edits.
|
|
5
|
+
*
|
|
6
|
+
* An editor shows a task (the base), the person changes some fields, and by the time the change is sent someone else
|
|
7
|
+
* may have changed the task too. Fields only the other person changed are kept, since an update applies only this
|
|
8
|
+
* person's changes on top of the task as it is now. A field both changed is a conflict, which the person resolves by
|
|
9
|
+
* keeping their value or using the other one. Lists never conflict: their changes are applied as additions and
|
|
10
|
+
* removals.
|
|
11
|
+
*/
|
|
12
|
+
/** The task fields that hold one value, which can conflict. */
|
|
13
|
+
export type TaskField = 'title' | 'description' | 'status' | 'priority' | 'dueTimestamp' | 'assignee' | 'project' | 'workflowStage';
|
|
14
|
+
export declare const TASK_FIELDS: readonly TaskField[];
|
|
15
|
+
/** A field's value: text, a timestamp, or a reference. Absent and empty values are the same. */
|
|
16
|
+
export type TaskFieldValue = string | Ref | null | undefined;
|
|
17
|
+
/** A field this person and someone else both changed since the base. */
|
|
18
|
+
export interface TaskConflict {
|
|
19
|
+
field: TaskField;
|
|
20
|
+
/** The value when this person started editing. */
|
|
21
|
+
base: TaskFieldValue;
|
|
22
|
+
/** The value someone else saved since. */
|
|
23
|
+
theirs: TaskFieldValue;
|
|
24
|
+
/** The value this person is saving. */
|
|
25
|
+
mine: TaskFieldValue;
|
|
26
|
+
}
|
|
27
|
+
/** Which value to keep for each conflicting field. */
|
|
28
|
+
export type ConflictChoices = Partial<Record<TaskField, 'mine' | 'theirs'>>;
|
|
29
|
+
/** Whether two values of a field are the same: references by URN, timestamps by instant, absent equal to empty. */
|
|
30
|
+
export declare function sameValue(field: TaskField, a: TaskFieldValue, b: TaskFieldValue): boolean;
|
|
31
|
+
/** The fields that differ between two versions of a task, single values first, then lists. */
|
|
32
|
+
export declare function changedFields(before: Task, after: Task): (TaskField | TaskListField)[];
|
|
33
|
+
/** The single-value fields `changes` sets. */
|
|
34
|
+
export declare function fieldsChanged(changes: TaskInput): TaskField[];
|
|
35
|
+
/**
|
|
36
|
+
* The fields `changes` sets that someone else also changed between `base` and `theirs`, to a different value.
|
|
37
|
+
* Empty when the change can be saved as it is.
|
|
38
|
+
*/
|
|
39
|
+
export declare function findConflicts(base: Task, theirs: Task, changes: TaskInput): TaskConflict[];
|
|
40
|
+
/**
|
|
41
|
+
* `changes` with the choices applied: a field resolved to theirs is dropped, so the other person's value stays. Fields
|
|
42
|
+
* without a choice keep this person's value.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveConflicts(changes: TaskInput, choices: ConflictChoices): TaskInput;
|
|
45
|
+
/**
|
|
46
|
+
* List changes made against `base`, replayed on `theirs` as additions and removals, so items someone else added or
|
|
47
|
+
* removed since are kept. Other fields are unchanged.
|
|
48
|
+
*/
|
|
49
|
+
export declare function rebaseLists(base: Task, theirs: Task, changes: TaskInput): TaskInput;
|
|
50
|
+
//# sourceMappingURL=conflicts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../src/conflicts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAG5D,OAAO,EAAoB,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5F;;;;;;;;GAQG;AAEH,+DAA+D;AAC/D,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,aAAa,GACb,QAAQ,GACR,UAAU,GACV,cAAc,GACd,UAAU,GACV,SAAS,GACT,eAAe,CAAC;AAEpB,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAS3C,CAAC;AAEF,gGAAgG;AAChG,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,CAAC;AAE7D,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,kDAAkD;IAClD,IAAI,EAAE,cAAc,CAAC;IACrB,0CAA0C;IAC1C,MAAM,EAAE,cAAc,CAAC;IACvB,uCAAuC;IACvC,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;AAE5E,mHAAmH;AACnH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,GAAG,OAAO,CAQzF;AAED,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,SAAS,GAAG,aAAa,CAAC,EAAE,CAKtF;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,EAAE,CAE7D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,GAAG,YAAY,EAAE,CAI1F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,SAAS,CAIxF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS,CAYnF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { refs, sameRef, sameRefs, urnOf } from "./refs.js";
|
|
2
|
+
import { parseTimestamp } from "./time.js";
|
|
3
|
+
import { TASK_LIST_FIELDS } from "./types.js";
|
|
4
|
+
export const TASK_FIELDS = [
|
|
5
|
+
'title',
|
|
6
|
+
'description',
|
|
7
|
+
'status',
|
|
8
|
+
'priority',
|
|
9
|
+
'dueTimestamp',
|
|
10
|
+
'assignee',
|
|
11
|
+
'project',
|
|
12
|
+
'workflowStage',
|
|
13
|
+
];
|
|
14
|
+
/** Whether two values of a field are the same: references by URN, timestamps by instant, absent equal to empty. */
|
|
15
|
+
export function sameValue(field, a, b) {
|
|
16
|
+
if (field === 'assignee' || field === 'project' || field === 'workflowStage') {
|
|
17
|
+
return sameRef(a, b);
|
|
18
|
+
}
|
|
19
|
+
if (field === 'dueTimestamp') {
|
|
20
|
+
return parseTimestamp(a)?.getTime() === parseTimestamp(b)?.getTime();
|
|
21
|
+
}
|
|
22
|
+
return (a ?? '') === (b ?? '');
|
|
23
|
+
}
|
|
24
|
+
/** The fields that differ between two versions of a task, single values first, then lists. */
|
|
25
|
+
export function changedFields(before, after) {
|
|
26
|
+
return [
|
|
27
|
+
...TASK_FIELDS.filter((field) => !sameValue(field, before[field], after[field])),
|
|
28
|
+
...TASK_LIST_FIELDS.filter((field) => !sameRefs(before[field], after[field])),
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
/** The single-value fields `changes` sets. */
|
|
32
|
+
export function fieldsChanged(changes) {
|
|
33
|
+
return TASK_FIELDS.filter((field) => changes[field] !== undefined);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The fields `changes` sets that someone else also changed between `base` and `theirs`, to a different value.
|
|
37
|
+
* Empty when the change can be saved as it is.
|
|
38
|
+
*/
|
|
39
|
+
export function findConflicts(base, theirs, changes) {
|
|
40
|
+
return fieldsChanged(changes)
|
|
41
|
+
.filter((field) => !sameValue(field, base[field], theirs[field]) && !sameValue(field, theirs[field], changes[field]))
|
|
42
|
+
.map((field) => ({ field, base: base[field], theirs: theirs[field], mine: changes[field] }));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* `changes` with the choices applied: a field resolved to theirs is dropped, so the other person's value stays. Fields
|
|
46
|
+
* without a choice keep this person's value.
|
|
47
|
+
*/
|
|
48
|
+
export function resolveConflicts(changes, choices) {
|
|
49
|
+
const result = { ...changes };
|
|
50
|
+
for (const field of TASK_FIELDS)
|
|
51
|
+
if (choices[field] === 'theirs')
|
|
52
|
+
delete result[field];
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* List changes made against `base`, replayed on `theirs` as additions and removals, so items someone else added or
|
|
57
|
+
* removed since are kept. Other fields are unchanged.
|
|
58
|
+
*/
|
|
59
|
+
export function rebaseLists(base, theirs, changes) {
|
|
60
|
+
const result = { ...changes };
|
|
61
|
+
for (const field of TASK_LIST_FIELDS) {
|
|
62
|
+
const mine = changes[field];
|
|
63
|
+
if (mine === undefined)
|
|
64
|
+
continue;
|
|
65
|
+
const before = new Set((base[field] ?? []).map(urnOf));
|
|
66
|
+
const after = new Set(mine.map(urnOf));
|
|
67
|
+
const removed = new Set([...before].filter((urn) => !after.has(urn)));
|
|
68
|
+
const added = mine.filter((item) => !before.has(urnOf(item)));
|
|
69
|
+
result[field] = refs([...(theirs[field] ?? []).filter((item) => !removed.has(urnOf(item))), ...added]);
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=conflicts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../src/conflicts.ts"],"names":[],"mappings":"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"}
|
package/dist/draft.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Task } from '@baack-software/baack-ts-client';
|
|
2
|
+
import { type RefLike, type TaskDraft, type TaskInput, type TaskUpdate } from './types.ts';
|
|
3
|
+
export declare const TITLE_MAX_LENGTH = 1024;
|
|
4
|
+
export declare const DESCRIPTION_MAX_LENGTH = 65536;
|
|
5
|
+
/** What `draft` needs: an owner and a title. Everything else has a default. */
|
|
6
|
+
export type DraftInput = Omit<Partial<TaskDraft>, 'owner' | 'title'> & {
|
|
7
|
+
owner: RefLike;
|
|
8
|
+
title: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* A new task ready to create: status `PENDING`, priority `NONE`, an empty description and empty lists unless given.
|
|
12
|
+
* References are reduced to bare `{ urn }`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function draft(input: DraftInput): TaskDraft;
|
|
15
|
+
export interface ValidationIssue {
|
|
16
|
+
field: keyof TaskInput;
|
|
17
|
+
message: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Checks a create or update body against the API's documented rules, so a form can show problems before sending.
|
|
21
|
+
* Pass the task's URN when updating, to catch a task blocking itself.
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateTask(input: TaskInput, options?: {
|
|
24
|
+
creating?: boolean;
|
|
25
|
+
urn?: string;
|
|
26
|
+
}): ValidationIssue[];
|
|
27
|
+
/**
|
|
28
|
+
* The update body that turns `before` into `after`: only the fields that differ. Lists count as changed when they hold
|
|
29
|
+
* different references, regardless of order, and are sent whole. Returns `{}` when nothing changed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function taskChanges(before: Task, after: Task | TaskInput): TaskInput;
|
|
32
|
+
/**
|
|
33
|
+
* The task as it will look once `changes` are applied, for showing a change before the server confirms it. References
|
|
34
|
+
* keep only what the change carries (usually just the URN), so names need looking up separately.
|
|
35
|
+
*/
|
|
36
|
+
export declare function applyChanges(task: Task, changes: TaskInput): Task;
|
|
37
|
+
/**
|
|
38
|
+
* The update body that stores `task` with `changes` applied. The API stores the task as an update sends it: required
|
|
39
|
+
* fields must be present and optional fields left out are cleared, so the body carries the whole task. A `null` change
|
|
40
|
+
* clears a field. References are reduced to bare `{ urn }`.
|
|
41
|
+
*/
|
|
42
|
+
export declare function updateBody(task: Task, changes: TaskInput): TaskUpdate;
|
|
43
|
+
/** Whether a body has nothing to send. */
|
|
44
|
+
export declare function isEmptyChange(input: TaskInput): boolean;
|
|
45
|
+
//# sourceMappingURL=draft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../src/draft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAG5D,OAAO,EAAoB,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7G,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG;IACrE,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAgBlD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,SAAS,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,eAAe,EAAE,CA+BpH;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,CAmB5E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI,CAWjE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,GAAG,UAAU,CA2BrE;AAED,0CAA0C;AAC1C,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEvD"}
|
package/dist/draft.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { ref, refs, sameRef, sameRefs, urnOf } from "./refs.js";
|
|
2
|
+
import { parseTimestamp } from "./time.js";
|
|
3
|
+
import { TASK_LIST_FIELDS } from "./types.js";
|
|
4
|
+
export const TITLE_MAX_LENGTH = 1024;
|
|
5
|
+
export const DESCRIPTION_MAX_LENGTH = 65536;
|
|
6
|
+
/**
|
|
7
|
+
* A new task ready to create: status `PENDING`, priority `NONE`, an empty description and empty lists unless given.
|
|
8
|
+
* References are reduced to bare `{ urn }`.
|
|
9
|
+
*/
|
|
10
|
+
export function draft(input) {
|
|
11
|
+
const { owner, ...rest } = input;
|
|
12
|
+
const result = {
|
|
13
|
+
status: 'PENDING',
|
|
14
|
+
priority: 'NONE',
|
|
15
|
+
description: '',
|
|
16
|
+
...rest,
|
|
17
|
+
owner: ref(owner),
|
|
18
|
+
blockedBy: refs(rest.blockedBy),
|
|
19
|
+
blocking: refs(rest.blocking),
|
|
20
|
+
associatedTasks: refs(rest.associatedTasks),
|
|
21
|
+
associatedEntities: refs(rest.associatedEntities),
|
|
22
|
+
associatedIdentities: refs(rest.associatedIdentities),
|
|
23
|
+
associatedCompanies: refs(rest.associatedCompanies),
|
|
24
|
+
};
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Checks a create or update body against the API's documented rules, so a form can show problems before sending.
|
|
29
|
+
* Pass the task's URN when updating, to catch a task blocking itself.
|
|
30
|
+
*/
|
|
31
|
+
export function validateTask(input, options = {}) {
|
|
32
|
+
const issues = [];
|
|
33
|
+
const { creating = false, urn } = options;
|
|
34
|
+
if (creating && !input.owner)
|
|
35
|
+
issues.push({ field: 'owner', message: 'A task needs an owning company.' });
|
|
36
|
+
if (input.title !== undefined || creating) {
|
|
37
|
+
const title = input.title?.trim() ?? '';
|
|
38
|
+
if (title === '')
|
|
39
|
+
issues.push({ field: 'title', message: 'A task needs a title.' });
|
|
40
|
+
else if (title.length > TITLE_MAX_LENGTH)
|
|
41
|
+
issues.push({ field: 'title', message: `The title is longer than ${TITLE_MAX_LENGTH} characters.` });
|
|
42
|
+
}
|
|
43
|
+
if (input.description !== undefined && input.description.length > DESCRIPTION_MAX_LENGTH) {
|
|
44
|
+
issues.push({
|
|
45
|
+
field: 'description',
|
|
46
|
+
message: `The description is longer than ${DESCRIPTION_MAX_LENGTH} characters.`,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (input.dueTimestamp != null && !parseTimestamp(input.dueTimestamp)) {
|
|
50
|
+
issues.push({ field: 'dueTimestamp', message: 'The due date is not a valid timestamp.' });
|
|
51
|
+
}
|
|
52
|
+
if (urn !== undefined) {
|
|
53
|
+
if (input.blockedBy?.some((item) => item.urn === urn))
|
|
54
|
+
issues.push({ field: 'blockedBy', message: 'A task cannot block itself.' });
|
|
55
|
+
if (input.blocking?.some((item) => item.urn === urn))
|
|
56
|
+
issues.push({ field: 'blocking', message: 'A task cannot block itself.' });
|
|
57
|
+
}
|
|
58
|
+
const blockedBy = new Set((input.blockedBy ?? []).map(urnOf));
|
|
59
|
+
if (input.blocking?.some((item) => blockedBy.has(item.urn))) {
|
|
60
|
+
issues.push({ field: 'blocking', message: 'A task cannot both block and be blocked by the same task.' });
|
|
61
|
+
}
|
|
62
|
+
return issues;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The update body that turns `before` into `after`: only the fields that differ. Lists count as changed when they hold
|
|
66
|
+
* different references, regardless of order, and are sent whole. Returns `{}` when nothing changed.
|
|
67
|
+
*/
|
|
68
|
+
export function taskChanges(before, after) {
|
|
69
|
+
const changes = {};
|
|
70
|
+
for (const field of ['status', 'priority', 'title', 'description']) {
|
|
71
|
+
const value = after[field];
|
|
72
|
+
if (value !== undefined && value !== before[field])
|
|
73
|
+
changes[field] = value;
|
|
74
|
+
}
|
|
75
|
+
if (after.dueTimestamp !== undefined && !sameTime(before.dueTimestamp, after.dueTimestamp)) {
|
|
76
|
+
changes.dueTimestamp = after.dueTimestamp || null;
|
|
77
|
+
}
|
|
78
|
+
for (const field of ['assignee', 'project', 'workflowStage']) {
|
|
79
|
+
const value = after[field];
|
|
80
|
+
if (value !== undefined && !sameRef(before[field], value))
|
|
81
|
+
changes[field] = value === null ? null : ref(value);
|
|
82
|
+
}
|
|
83
|
+
for (const field of TASK_LIST_FIELDS) {
|
|
84
|
+
const value = after[field];
|
|
85
|
+
if (value !== undefined && !sameRefs(before[field], value))
|
|
86
|
+
changes[field] = refs(value);
|
|
87
|
+
}
|
|
88
|
+
return changes;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The task as it will look once `changes` are applied, for showing a change before the server confirms it. References
|
|
92
|
+
* keep only what the change carries (usually just the URN), so names need looking up separately.
|
|
93
|
+
*/
|
|
94
|
+
export function applyChanges(task, changes) {
|
|
95
|
+
const result = { ...task };
|
|
96
|
+
for (const field of ['status', 'priority', 'title', 'description']) {
|
|
97
|
+
if (changes[field] !== undefined)
|
|
98
|
+
result[field] = changes[field];
|
|
99
|
+
}
|
|
100
|
+
if (changes.dueTimestamp !== undefined)
|
|
101
|
+
result.dueTimestamp = changes.dueTimestamp ?? '';
|
|
102
|
+
for (const field of ['assignee', 'project', 'workflowStage', ...TASK_LIST_FIELDS]) {
|
|
103
|
+
const value = changes[field];
|
|
104
|
+
if (value !== undefined)
|
|
105
|
+
result[field] = value;
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The update body that stores `task` with `changes` applied. The API stores the task as an update sends it: required
|
|
111
|
+
* fields must be present and optional fields left out are cleared, so the body carries the whole task. A `null` change
|
|
112
|
+
* clears a field. References are reduced to bare `{ urn }`.
|
|
113
|
+
*/
|
|
114
|
+
export function updateBody(task, changes) {
|
|
115
|
+
const owner = changes.owner ?? task.owner;
|
|
116
|
+
if (!owner)
|
|
117
|
+
throw new TypeError(`Task ${task.urn} has no owner, which every update must send.`);
|
|
118
|
+
const body = {
|
|
119
|
+
urn: task.urn,
|
|
120
|
+
owner: ref(owner),
|
|
121
|
+
status: changes.status ?? task.status,
|
|
122
|
+
priority: changes.priority ?? task.priority,
|
|
123
|
+
title: changes.title ?? task.title,
|
|
124
|
+
description: changes.description ?? task.description ?? '',
|
|
125
|
+
blockedBy: refs(changes.blockedBy ?? task.blockedBy),
|
|
126
|
+
blocking: refs(changes.blocking ?? task.blocking),
|
|
127
|
+
associatedTasks: refs(changes.associatedTasks ?? task.associatedTasks),
|
|
128
|
+
associatedEntities: refs(changes.associatedEntities ?? task.associatedEntities),
|
|
129
|
+
associatedIdentities: refs(changes.associatedIdentities ?? task.associatedIdentities),
|
|
130
|
+
associatedCompanies: refs(changes.associatedCompanies ?? task.associatedCompanies),
|
|
131
|
+
};
|
|
132
|
+
for (const field of ['assignee', 'project', 'workflowStage']) {
|
|
133
|
+
const value = changes[field] === undefined ? task[field] : changes[field];
|
|
134
|
+
if (value)
|
|
135
|
+
body[field] = ref(value);
|
|
136
|
+
else if (changes[field] === null)
|
|
137
|
+
body[field] = null;
|
|
138
|
+
}
|
|
139
|
+
const due = changes.dueTimestamp === undefined ? task.dueTimestamp : changes.dueTimestamp;
|
|
140
|
+
if (due)
|
|
141
|
+
body.dueTimestamp = due;
|
|
142
|
+
else if (changes.dueTimestamp !== undefined)
|
|
143
|
+
body.dueTimestamp = null;
|
|
144
|
+
if (changes.identityForLogs)
|
|
145
|
+
body.identityForLogs = ref(changes.identityForLogs);
|
|
146
|
+
return body;
|
|
147
|
+
}
|
|
148
|
+
/** Whether a body has nothing to send. */
|
|
149
|
+
export function isEmptyChange(input) {
|
|
150
|
+
return Object.keys(input).every((key) => key === 'identityForLogs');
|
|
151
|
+
}
|
|
152
|
+
function sameTime(a, b) {
|
|
153
|
+
return parseTimestamp(a)?.getTime() === parseTimestamp(b)?.getTime();
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=draft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.js","sourceRoot":"","sources":["../src/draft.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Task } from '@baack-software/baack-ts-client';
|
|
2
|
+
import type { TaskConflict } from './conflicts.ts';
|
|
3
|
+
import type { ValidationIssue } from './draft.ts';
|
|
4
|
+
/** Thrown before sending a create or update the API would reject. */
|
|
5
|
+
export declare class TaskValidationError extends Error {
|
|
6
|
+
readonly issues: ValidationIssue[];
|
|
7
|
+
readonly name = "TaskValidationError";
|
|
8
|
+
constructor(issues: ValidationIssue[]);
|
|
9
|
+
}
|
|
10
|
+
/** Thrown when a search hasn't reached its full result in the time allowed. */
|
|
11
|
+
export declare class TaskSearchTimeoutError extends Error {
|
|
12
|
+
readonly searchUrn: string | undefined;
|
|
13
|
+
readonly timeoutMs: number;
|
|
14
|
+
readonly name = "TaskSearchTimeoutError";
|
|
15
|
+
constructor(searchUrn: string | undefined, timeoutMs: number);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Thrown before writing when someone else changed a field this update also changes, since the base the change was
|
|
19
|
+
* made against. Nothing was saved. Resolve with `resolveConflicts` and update again with `current` as the base.
|
|
20
|
+
*/
|
|
21
|
+
export declare class TaskConflictError extends Error {
|
|
22
|
+
readonly conflicts: TaskConflict[];
|
|
23
|
+
/** The task as it is now. */
|
|
24
|
+
readonly current: Task;
|
|
25
|
+
readonly name = "TaskConflictError";
|
|
26
|
+
constructor(conflicts: TaskConflict[],
|
|
27
|
+
/** The task as it is now. */
|
|
28
|
+
current: Task);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,qEAAqE;AACrE,qBAAa,mBAAoB,SAAQ,KAAK;IAGhC,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE;IAF9C,SAAkB,IAAI,yBAAyB;gBAE1B,MAAM,EAAE,eAAe,EAAE;CAG/C;AAED,+EAA+E;AAC/E,qBAAa,sBAAuB,SAAQ,KAAK;IAI7C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAJ5B,SAAkB,IAAI,4BAA4B;gBAGvC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,MAAM;CAI7B;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAIxC,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE;IAClC,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,IAAI;IALxB,SAAkB,IAAI,uBAAuB;gBAGlC,SAAS,EAAE,YAAY,EAAE;IAClC,6BAA6B;IACpB,OAAO,EAAE,IAAI;CAIzB"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Thrown before sending a create or update the API would reject. */
|
|
2
|
+
export class TaskValidationError extends Error {
|
|
3
|
+
issues;
|
|
4
|
+
name = 'TaskValidationError';
|
|
5
|
+
constructor(issues) {
|
|
6
|
+
super(issues.map((issue) => issue.message).join(' '));
|
|
7
|
+
this.issues = issues;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/** Thrown when a search hasn't reached its full result in the time allowed. */
|
|
11
|
+
export class TaskSearchTimeoutError extends Error {
|
|
12
|
+
searchUrn;
|
|
13
|
+
timeoutMs;
|
|
14
|
+
name = 'TaskSearchTimeoutError';
|
|
15
|
+
constructor(searchUrn, timeoutMs) {
|
|
16
|
+
super(`Search ${searchUrn ?? ''} did not finish within ${timeoutMs} ms`);
|
|
17
|
+
this.searchUrn = searchUrn;
|
|
18
|
+
this.timeoutMs = timeoutMs;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Thrown before writing when someone else changed a field this update also changes, since the base the change was
|
|
23
|
+
* made against. Nothing was saved. Resolve with `resolveConflicts` and update again with `current` as the base.
|
|
24
|
+
*/
|
|
25
|
+
export class TaskConflictError extends Error {
|
|
26
|
+
conflicts;
|
|
27
|
+
current;
|
|
28
|
+
name = 'TaskConflictError';
|
|
29
|
+
constructor(conflicts,
|
|
30
|
+
/** The task as it is now. */
|
|
31
|
+
current) {
|
|
32
|
+
super(`Someone else changed ${conflicts.map((conflict) => conflict.field).join(', ')} on task ${current.urn}`);
|
|
33
|
+
this.conflicts = conflicts;
|
|
34
|
+
this.current = current;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAIA,qEAAqE;AACrE,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAGvB;IAFH,IAAI,GAAG,qBAAqB,CAAC;IAE/C,YAAqB,MAAyB;QAC5C,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QADnC,WAAM,GAAN,MAAM,CAAmB;IAE9C,CAAC;CACF;AAED,+EAA+E;AAC/E,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAIpC;IACA;IAJO,IAAI,GAAG,wBAAwB,CAAC;IAElD,YACW,SAA6B,EAC7B,SAAiB;QAE1B,KAAK,CAAC,UAAU,SAAS,IAAI,EAAE,0BAA0B,SAAS,KAAK,CAAC,CAAC;QAHhE,cAAS,GAAT,SAAS,CAAoB;QAC7B,cAAS,GAAT,SAAS,CAAQ;IAG5B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAI/B;IAEA;IALO,IAAI,GAAG,mBAAmB,CAAC;IAE7C,YACW,SAAyB;IAClC,6BAA6B;IACpB,OAAa;QAEtB,KAAK,CAAC,wBAAwB,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAJtG,cAAS,GAAT,SAAS,CAAgB;QAEzB,YAAO,GAAP,OAAO,CAAM;IAGxB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './types.ts';
|
|
2
|
+
export * from './refs.ts';
|
|
3
|
+
export * from './time.ts';
|
|
4
|
+
export * from './tasks.ts';
|
|
5
|
+
export * from './draft.ts';
|
|
6
|
+
export * from './conflicts.ts';
|
|
7
|
+
export * from './blockers.ts';
|
|
8
|
+
export * from './activity.ts';
|
|
9
|
+
export * from './errors.ts';
|
|
10
|
+
export * from './task-client.ts';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./refs.js";
|
|
3
|
+
export * from "./time.js";
|
|
4
|
+
export * from "./tasks.js";
|
|
5
|
+
export * from "./draft.js";
|
|
6
|
+
export * from "./conflicts.js";
|
|
7
|
+
export * from "./blockers.js";
|
|
8
|
+
export * from "./activity.js";
|
|
9
|
+
export * from "./errors.js";
|
|
10
|
+
export * from "./task-client.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TaskLog } from '@baack-software/baack-ts-client';
|
|
2
|
+
import { type TaskDirectory } from './parts.tsx';
|
|
3
|
+
export interface TaskActivityProps {
|
|
4
|
+
/** Newest first. */
|
|
5
|
+
logs: readonly TaskLog[];
|
|
6
|
+
directory: TaskDirectory;
|
|
7
|
+
loading?: boolean;
|
|
8
|
+
/** Set when older entries can be loaded. */
|
|
9
|
+
onLoadMore?: (() => void) | undefined;
|
|
10
|
+
/** Adds a comment, optionally as a reply. Omit for a read-only log. */
|
|
11
|
+
onComment?: ((text: string, replyTo?: TaskLog) => Promise<unknown>) | undefined;
|
|
12
|
+
}
|
|
13
|
+
/** A task's activity log, newest first, with a comment box and replies. */
|
|
14
|
+
export declare function TaskActivity({ logs, directory, loading, onLoadMore, onComment }: TaskActivityProps): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=TaskActivity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskActivity.d.ts","sourceRoot":"","sources":["../../src/react/TaskActivity.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAI/D,OAAO,EAAmC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAQlF,MAAM,WAAW,iBAAiB;IAChC,oBAAoB;IACpB,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IACzB,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACtC,uEAAuE;IACvE,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CACjF;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BA4FlG"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId, useState } from 'react';
|
|
3
|
+
import { MessageSquare, Reply } from 'lucide-react';
|
|
4
|
+
import { activityLabel, isComment } from "../activity.js";
|
|
5
|
+
import { activityCopy, useCopy } from "./copy.js";
|
|
6
|
+
import { nameOf, PersonAvatar, Timestamp } from "./parts.js";
|
|
7
|
+
import { Button } from "./ui/button.js";
|
|
8
|
+
import { Label } from "./ui/label.js";
|
|
9
|
+
import { Textarea } from "./ui/textarea.js";
|
|
10
|
+
import { ToggleGroup, ToggleGroupItem } from "./ui/toggle-group.js";
|
|
11
|
+
/** A task's activity log, newest first, with a comment box and replies. */
|
|
12
|
+
export function TaskActivity({ logs, directory, loading, onLoadMore, onComment }) {
|
|
13
|
+
const copy = useCopy();
|
|
14
|
+
const [show, setShow] = useState('all');
|
|
15
|
+
const [replyTo, setReplyTo] = useState();
|
|
16
|
+
const byUrn = new Map(logs.map((log) => [log.urn, log]));
|
|
17
|
+
const shown = logs.filter((log) => show === 'all' || isComment(log) === (show === 'comments'));
|
|
18
|
+
const author = (log) => (log.identity ? nameOf(directory, log.identity) : undefined);
|
|
19
|
+
const describe = (log) => {
|
|
20
|
+
const name = activityCopy(log.activity);
|
|
21
|
+
const label = name ? copy(name) : activityLabel(log.activity);
|
|
22
|
+
return log.subject && log.activity !== 'COMMENT_ADDED' ? `${label}: ${nameOf(directory, log.subject)}` : label;
|
|
23
|
+
};
|
|
24
|
+
return (_jsxs("section", { "aria-label": copy('activity_heading'), children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsx("h3", { className: "text-xs font-semibold tracking-wide uppercase", children: copy('activity_heading') }), _jsxs(ToggleGroup, { type: "single", variant: "outline", size: "sm", spacing: 0, value: show, onValueChange: (value) => value && setShow(value), "aria-label": copy('activity_filter'), children: [_jsx(ToggleGroupItem, { value: "all", children: copy('activity_filter_all') }), _jsx(ToggleGroupItem, { value: "changes", children: copy('activity_filter_changes') }), _jsx(ToggleGroupItem, { value: "comments", children: copy('activity_filter_comments') })] })] }), onComment && (_jsx(CommentForm, { replyTo: replyTo, replyName: replyTo ? (author(replyTo) ?? '') : undefined, onCancelReply: () => setReplyTo(undefined), onSubmit: async (text) => {
|
|
25
|
+
await onComment(text, replyTo);
|
|
26
|
+
setReplyTo(undefined);
|
|
27
|
+
} }, replyTo?.urn ?? 'new')), shown.length === 0 && !loading && _jsx("p", { className: "text-muted-foreground mt-3 text-sm", children: copy('activity_empty') }), _jsx("ul", { className: "mt-3 space-y-3", "aria-busy": loading || undefined, children: shown.map((log) => {
|
|
28
|
+
const name = author(log);
|
|
29
|
+
const parent = log.replyTo ? byUrn.get(log.replyTo.urn) : undefined;
|
|
30
|
+
return (_jsxs("li", { className: "flex gap-2.5", "data-activity": log.activity, children: [_jsx(PersonAvatar, { person: log.identity && name ? { urn: log.identity.urn, name } : null }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: "text-[13px] leading-snug", children: [_jsx("span", { className: "font-medium", children: describe(log) }), name && _jsxs("span", { className: "text-muted-foreground", children: [" ", copy('activity_by', { name })] }), log.createdTimestamp && (_jsxs("span", { className: "text-muted-foreground", children: [' · ', _jsx(Timestamp, { value: log.createdTimestamp })] }))] }), parent && (_jsxs("p", { className: "text-muted-foreground mt-0.5 flex items-center gap-1 text-[11px]", children: [_jsx(Reply, { "aria-hidden": "true", className: "size-3" }), copy('comment_reply_label', { name: author(parent) ?? '' })] })), log.comment && (_jsx("p", { className: "bg-muted mt-1 rounded-md px-2.5 py-1.5 text-[13px] whitespace-pre-wrap", children: log.comment })), onComment && isComment(log) && (_jsx(Button, { variant: "link", size: "xs", className: "h-auto px-0", onClick: () => setReplyTo(log), children: copy('comment_reply') }))] })] }, log.urn));
|
|
31
|
+
}) }), loading && _jsx("p", { className: "text-muted-foreground mt-3 text-sm", children: copy('activity_loading') }), onLoadMore && !loading && (_jsx(Button, { variant: "outline", size: "sm", className: "mt-3", onClick: onLoadMore, children: copy('activity_more') }))] }));
|
|
32
|
+
}
|
|
33
|
+
function CommentForm({ replyTo, replyName, onCancelReply, onSubmit, }) {
|
|
34
|
+
const copy = useCopy();
|
|
35
|
+
const id = useId();
|
|
36
|
+
const [text, setText] = useState('');
|
|
37
|
+
const [sending, setSending] = useState(false);
|
|
38
|
+
const [failed, setFailed] = useState(false);
|
|
39
|
+
return (_jsxs("form", { className: "mt-3 grid gap-2", onSubmit: async (event) => {
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
if (!text.trim())
|
|
42
|
+
return;
|
|
43
|
+
setSending(true);
|
|
44
|
+
setFailed(false);
|
|
45
|
+
try {
|
|
46
|
+
await onSubmit(text.trim());
|
|
47
|
+
setText('');
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
setFailed(true);
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
setSending(false);
|
|
54
|
+
}
|
|
55
|
+
}, children: [_jsx(Label, { htmlFor: id, className: replyTo ? 'text-xs' : 'sr-only', children: replyTo ? copy('comment_reply_label', { name: replyName ?? '' }) : copy('comment_label') }), _jsx(Textarea, { id: id, rows: 2, autoFocus: replyTo !== undefined, placeholder: copy('comment_placeholder'), value: text, onChange: (event) => setText(event.target.value), onKeyDown: (event) => {
|
|
56
|
+
if (event.key === 'Enter' && (event.metaKey || event.ctrlKey))
|
|
57
|
+
event.currentTarget.form?.requestSubmit();
|
|
58
|
+
} }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Button, { type: "submit", size: "sm", variant: "outline", disabled: !text.trim() || sending, children: [_jsx(MessageSquare, { "aria-hidden": "true" }), replyTo ? copy('comment_reply') : copy('comment_submit')] }), replyTo && (_jsx(Button, { type: "button", size: "sm", variant: "ghost", onClick: onCancelReply, children: copy('comment_cancel') })), failed && (_jsx("p", { role: "alert", className: "text-destructive text-xs", children: copy('editor_save_failed') }))] })] }));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=TaskActivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskActivity.js","sourceRoot":"","sources":["../../src/react/TaskActivity.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Task, Workflow } from '@baack-software/baack-ts-client';
|
|
2
|
+
import { type TaskComparator, type TaskGrouping } from '../tasks.ts';
|
|
3
|
+
import { type TaskDirectory } from './parts.tsx';
|
|
4
|
+
export interface TaskListProps {
|
|
5
|
+
tasks: readonly Task[];
|
|
6
|
+
directory: TaskDirectory;
|
|
7
|
+
/** The task open in the editor, highlighted. */
|
|
8
|
+
selected?: string | undefined;
|
|
9
|
+
onOpen: (task: Task) => void;
|
|
10
|
+
/** Gives each task's button an id, so focus can return to it when the editor closes. */
|
|
11
|
+
itemId?: (urn: string) => string;
|
|
12
|
+
now?: Date;
|
|
13
|
+
}
|
|
14
|
+
/** A task as a board card: priority, blocked, title, due date and assignee. Opens the task when chosen. */
|
|
15
|
+
export declare function TaskCard({ task, directory, selected, blockedBy, onOpen, id, now, }: {
|
|
16
|
+
task: Task;
|
|
17
|
+
directory: TaskDirectory;
|
|
18
|
+
selected?: boolean;
|
|
19
|
+
blockedBy: readonly string[];
|
|
20
|
+
onOpen: (task: Task) => void;
|
|
21
|
+
id?: string;
|
|
22
|
+
now?: Date;
|
|
23
|
+
}): import("react").JSX.Element;
|
|
24
|
+
export interface TaskBoardProps extends TaskListProps {
|
|
25
|
+
/** What the columns are. Default status. */
|
|
26
|
+
groupBy?: TaskGrouping;
|
|
27
|
+
/** Sorts each column. */
|
|
28
|
+
sort?: TaskComparator;
|
|
29
|
+
/** Columns hidden while empty. Default the undefined status. */
|
|
30
|
+
hideEmpty?: readonly string[];
|
|
31
|
+
/** With `groupBy: 'workflowStage'`, the workflow whose stages are the columns, in order. */
|
|
32
|
+
workflow?: Workflow | undefined;
|
|
33
|
+
}
|
|
34
|
+
/** Tasks in columns by status, priority, assignee, project, workflow or workflow stage, each with its count. */
|
|
35
|
+
export declare function TaskBoard({ tasks, directory, selected, onOpen, itemId, now, groupBy, sort, hideEmpty, workflow, }: TaskBoardProps): import("react").JSX.Element;
|
|
36
|
+
/** Tasks as table rows: title, status, priority, assignee, project and due date. The title opens the task. */
|
|
37
|
+
export declare function TaskTable({ tasks, directory, selected, onOpen, itemId, now }: TaskListProps): import("react").JSX.Element;
|
|
38
|
+
//# sourceMappingURL=TaskBoard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskBoard.d.ts","sourceRoot":"","sources":["../../src/react/TaskBoard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAA4B,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAGhG,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAA2E,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAG1H,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,SAAS,EAAE,aAAa,CAAC;IACzB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC7B,wFAAwF;IACxF,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACjC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAOD,2GAA2G;AAC3G,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,SAAS,EACT,MAAM,EACN,EAAE,EACF,GAAG,GACJ,EAAE;IACD,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,+BA4CA;AAUD,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,4CAA4C;IAC5C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,yBAAyB;IACzB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,gEAAgE;IAChE,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACjC;AAED,gHAAgH;AAChH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,EACN,GAAG,EACH,OAAkB,EAClB,IAAI,EACJ,SAAyB,EACzB,QAAQ,GACT,EAAE,cAAc,+BAqEhB;AAED,8GAA8G;AAC9G,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,aAAa,+BA+D3F"}
|