@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,15 @@
|
|
|
1
|
+
import { type TaskFilter } from '../tasks.ts';
|
|
2
|
+
import type { TaskDirectory } from './parts.tsx';
|
|
3
|
+
export interface TaskFiltersProps {
|
|
4
|
+
value: TaskFilter;
|
|
5
|
+
onChange: (filter: TaskFilter) => void;
|
|
6
|
+
directory: TaskDirectory;
|
|
7
|
+
/** The signed-in person, for "Assigned to me". */
|
|
8
|
+
me?: string | undefined;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A toolbar of filters: text search, status, priority, assignee, project and open only. Controlled: pass the filter
|
|
12
|
+
* and apply it with `filterTasks` or `selectTasks`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function TaskFilters({ value, onChange, directory, me }: TaskFiltersProps): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=TaskFilters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskFilters.d.ts","sourceRoot":"","sources":["../../src/react/TaskFilters.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,aAAa,CAAC;IACzB,kDAAkD;IAClD,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAcD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,gBAAgB,+BAqF/E"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId } from 'react';
|
|
3
|
+
import { Search, X } from 'lucide-react';
|
|
4
|
+
import { urnOf } from "../refs.js";
|
|
5
|
+
import { TASK_PRIORITIES, TASK_STATUSES } from "../tasks.js";
|
|
6
|
+
import { priorityCopy, statusCopy, useCopy } from "./copy.js";
|
|
7
|
+
import { ANY, ChoiceSelect, Field, NONE } from "./fields.js";
|
|
8
|
+
import { Button } from "./ui/button.js";
|
|
9
|
+
import { Input } from "./ui/input.js";
|
|
10
|
+
import { Toggle } from "./ui/toggle.js";
|
|
11
|
+
function first(list) {
|
|
12
|
+
const value = list?.[0];
|
|
13
|
+
if (value === undefined)
|
|
14
|
+
return ANY;
|
|
15
|
+
if (value === null)
|
|
16
|
+
return NONE;
|
|
17
|
+
return urnOf(value);
|
|
18
|
+
}
|
|
19
|
+
function without(filter, key) {
|
|
20
|
+
const { [key]: _removed, ...rest } = filter;
|
|
21
|
+
return rest;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A toolbar of filters: text search, status, priority, assignee, project and open only. Controlled: pass the filter
|
|
25
|
+
* and apply it with `filterTasks` or `selectTasks`.
|
|
26
|
+
*/
|
|
27
|
+
export function TaskFilters({ value, onChange, directory, me }) {
|
|
28
|
+
const copy = useCopy();
|
|
29
|
+
const ids = useId();
|
|
30
|
+
const any = { value: ANY, label: copy('filter_any') };
|
|
31
|
+
const set = (key, next) => onChange(next === undefined ? without(value, key) : { ...value, [key]: next });
|
|
32
|
+
const pick = (selected) => (selected === ANY ? undefined : selected === NONE ? [null] : [selected]);
|
|
33
|
+
const active = Object.keys(value).length > 0;
|
|
34
|
+
return (_jsxs("div", { role: "search", "aria-label": copy('filter_label'), className: "flex flex-wrap items-end gap-3", children: [_jsxs("div", { className: "relative min-w-48 flex-1", children: [_jsx(Search, { "aria-hidden": "true", className: "text-muted-foreground absolute top-1/2 left-2.5 size-4 -translate-y-1/2" }), _jsx(Input, { type: "search", "aria-label": copy('filter_search'), placeholder: copy('filter_search'), value: value.text ?? '', onChange: (event) => set('text', event.target.value || undefined), className: "pl-8" })] }), _jsx(Field, { id: `${ids}-status`, label: copy('field_status'), className: "w-36", children: _jsx(ChoiceSelect, { id: `${ids}-status`, value: first(value.status), choices: [any, ...TASK_STATUSES.map((status) => ({ value: status, label: copy(statusCopy(status)) }))], onChange: (selected) => set('status', selected === ANY ? undefined : [selected]) }) }), _jsx(Field, { id: `${ids}-priority`, label: copy('field_priority'), className: "w-32", children: _jsx(ChoiceSelect, { id: `${ids}-priority`, value: first(value.priority), choices: [
|
|
35
|
+
any,
|
|
36
|
+
...[...TASK_PRIORITIES].reverse().map((priority) => ({ value: priority, label: copy(priorityCopy(priority)) })),
|
|
37
|
+
], onChange: (selected) => set('priority', selected === ANY ? undefined : [selected]) }) }), _jsx(Field, { id: `${ids}-assignee`, label: copy('field_assignee'), className: "w-44", children: _jsx(ChoiceSelect, { id: `${ids}-assignee`, value: first(value.assignee), choices: [
|
|
38
|
+
any,
|
|
39
|
+
...(me ? [{ value: me, label: copy('filter_mine') }] : []),
|
|
40
|
+
{ value: NONE, label: copy('option_unassigned') },
|
|
41
|
+
...directory.people.filter((p) => p.urn !== me).map((p) => ({ value: p.urn, label: p.name })),
|
|
42
|
+
], onChange: (selected) => set('assignee', pick(selected)) }) }), directory.projects.length > 0 && (_jsx(Field, { id: `${ids}-project`, label: copy('field_project'), className: "w-44", children: _jsx(ChoiceSelect, { id: `${ids}-project`, value: first(value.project), choices: [
|
|
43
|
+
any,
|
|
44
|
+
{ value: NONE, label: copy('option_no_project') },
|
|
45
|
+
...directory.projects.map((p) => ({ value: p.urn, label: p.name })),
|
|
46
|
+
], onChange: (selected) => set('project', pick(selected)) }) })), _jsx(Toggle, { variant: "outline", size: "sm", pressed: value.open === true, onPressedChange: (pressed) => set('open', pressed ? true : undefined), children: copy('filter_open') }), active && (_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => onChange({}), children: [_jsx(X, { "aria-hidden": "true" }), copy('filter_clear')] }))] }));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=TaskFilters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskFilters.js","sourceRoot":"","sources":["../../src/react/TaskFilters.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type TaskStore } from '../store.ts';
|
|
2
|
+
import { type TaskFilter, type TaskGrouping } from '../tasks.ts';
|
|
3
|
+
import type { TaskDirectory } from './parts.tsx';
|
|
4
|
+
export type TaskLayout = 'board' | 'table';
|
|
5
|
+
export interface TaskViewProps {
|
|
6
|
+
store: TaskStore;
|
|
7
|
+
/** The signed-in person's identity URN, for "Assigned to me". */
|
|
8
|
+
me?: string | undefined;
|
|
9
|
+
/** Starting layout. Default board. */
|
|
10
|
+
layout?: TaskLayout;
|
|
11
|
+
/**
|
|
12
|
+
* Starting board columns. Default status. `workflow` has a column per workflow; `workflowStage` shows the first
|
|
13
|
+
* workflow's stages. Each column is sorted open first, then by priority, due date and title.
|
|
14
|
+
*/
|
|
15
|
+
groupBy?: TaskGrouping;
|
|
16
|
+
/** Starting filter. */
|
|
17
|
+
filter?: TaskFilter;
|
|
18
|
+
/** Opens this task on load, e.g. from the URL. */
|
|
19
|
+
selected?: string | undefined;
|
|
20
|
+
/** Told when the open task changes, e.g. to put it in the URL. */
|
|
21
|
+
onSelect?: ((urn: string | undefined) => void) | undefined;
|
|
22
|
+
/** Companies and content to offer as related items, which the store doesn't load. */
|
|
23
|
+
related?: Pick<TaskDirectory, 'companies' | 'entities'> | undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The full task view: a filterable board or table of a company's tasks, with the open task's editor and activity log
|
|
27
|
+
* beside it, and a form for new tasks. Loads the store when it hasn't been loaded.
|
|
28
|
+
*/
|
|
29
|
+
export declare function TaskView({ store, me, layout: initialLayout, groupBy: initialGroupBy, filter: initialFilter, selected: initialSelected, onSelect, related, }: TaskViewProps): import("react").JSX.Element;
|
|
30
|
+
//# sourceMappingURL=TaskView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskView.d.ts","sourceRoot":"","sources":["../../src/react/TaskView.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAgC,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAS/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOjD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,iEAAiE;IACjE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,sCAAsC;IACtC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,uBAAuB;IACvB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3D,qFAAqF;IACrF,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC;CACrE;AAWD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,EAAE,EACF,MAAM,EAAE,aAAuB,EAC/B,OAAO,EAAE,cAAyB,EAClC,MAAM,EAAE,aAAkB,EAC1B,QAAQ,EAAE,eAAe,EACzB,QAAQ,EACR,OAAO,GACR,EAAE,aAAa,+BAgOf"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useId, useMemo, useState } from 'react';
|
|
3
|
+
import { Columns3, Plus, Rows3 } from 'lucide-react';
|
|
4
|
+
import { cn } from 'cn';
|
|
5
|
+
import { selectTasks } from "../store.js";
|
|
6
|
+
import { byPriorityThenDue, byUrgency } from "../tasks.js";
|
|
7
|
+
import { useCopy } from "./copy.js";
|
|
8
|
+
import { ChoiceSelect } from "./fields.js";
|
|
9
|
+
import { useMediaQuery, useTaskDirectory, useTaskStore } from "./hooks.js";
|
|
10
|
+
import { TaskActivity } from "./TaskActivity.js";
|
|
11
|
+
import { TaskBoard, TaskTable } from "./TaskBoard.js";
|
|
12
|
+
import { TaskCreateForm } from "./TaskCreateForm.js";
|
|
13
|
+
import { TaskEditor } from "./TaskEditor.js";
|
|
14
|
+
import { TaskFilters } from "./TaskFilters.js";
|
|
15
|
+
import { Alert, AlertDescription } from "./ui/alert.js";
|
|
16
|
+
import { Button } from "./ui/button.js";
|
|
17
|
+
import { Sheet, SheetContent, SheetTitle } from "./ui/sheet.js";
|
|
18
|
+
import { Skeleton } from "./ui/skeleton.js";
|
|
19
|
+
import { ToggleGroup, ToggleGroupItem } from "./ui/toggle-group.js";
|
|
20
|
+
const GROUPINGS = [
|
|
21
|
+
'status',
|
|
22
|
+
'priority',
|
|
23
|
+
'assignee',
|
|
24
|
+
'project',
|
|
25
|
+
];
|
|
26
|
+
/** Prefixes a workflow URN in the grouping choice. */
|
|
27
|
+
const STAGE = 'stage:';
|
|
28
|
+
/**
|
|
29
|
+
* The full task view: a filterable board or table of a company's tasks, with the open task's editor and activity log
|
|
30
|
+
* beside it, and a form for new tasks. Loads the store when it hasn't been loaded.
|
|
31
|
+
*/
|
|
32
|
+
export function TaskView({ store, me, layout: initialLayout = 'board', groupBy: initialGroupBy = 'status', filter: initialFilter = {}, selected: initialSelected, onSelect, related, }) {
|
|
33
|
+
const copy = useCopy();
|
|
34
|
+
const ids = useId();
|
|
35
|
+
const state = useTaskStore(store);
|
|
36
|
+
const loaded = useTaskDirectory(state);
|
|
37
|
+
const directory = useMemo(() => ({ ...loaded, companies: related?.companies, entities: related?.entities }), [loaded, related?.companies, related?.entities]);
|
|
38
|
+
const [layout, setLayout] = useState(initialLayout);
|
|
39
|
+
const [groupBy, setGroupBy] = useState(initialGroupBy);
|
|
40
|
+
const [workflowUrn, setWorkflowUrn] = useState();
|
|
41
|
+
const workflow = directory.workflows?.find((w) => w.urn === workflowUrn) ?? directory.workflows?.[0];
|
|
42
|
+
const [filter, setFilter] = useState(initialFilter);
|
|
43
|
+
const [selected, setSelected] = useState(initialSelected);
|
|
44
|
+
const [creating, setCreating] = useState(false);
|
|
45
|
+
const [announcement, setAnnouncement] = useState('');
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (store.getState().status === 'idle')
|
|
48
|
+
store.load().catch(() => undefined);
|
|
49
|
+
}, [store]);
|
|
50
|
+
const task = selected ? state.byUrn.get(selected) : undefined;
|
|
51
|
+
const logs = selected ? state.logs.get(selected) : undefined;
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
if (selected && store.getState().logs.get(selected) === undefined && store.get(selected)) {
|
|
54
|
+
store.loadLogs(selected).catch(() => undefined);
|
|
55
|
+
}
|
|
56
|
+
}, [store, selected, task !== undefined]);
|
|
57
|
+
const itemId = (urn) => `${ids}-task-${urn}`;
|
|
58
|
+
const select = (urn) => {
|
|
59
|
+
setSelected(urn);
|
|
60
|
+
setCreating(false);
|
|
61
|
+
onSelect?.(urn);
|
|
62
|
+
};
|
|
63
|
+
const close = () => {
|
|
64
|
+
const from = selected;
|
|
65
|
+
select(undefined);
|
|
66
|
+
if (from)
|
|
67
|
+
requestAnimationFrame(() => document.getElementById(itemId(from))?.focus());
|
|
68
|
+
};
|
|
69
|
+
const wide = useMediaQuery('(min-width: 64rem)');
|
|
70
|
+
const visible = useMemo(() => selectTasks(state, filter, byUrgency), [state, filter]);
|
|
71
|
+
const list = {
|
|
72
|
+
tasks: visible,
|
|
73
|
+
directory,
|
|
74
|
+
selected,
|
|
75
|
+
itemId,
|
|
76
|
+
onOpen: (t) => select(t.urn),
|
|
77
|
+
};
|
|
78
|
+
const panel = (_jsx(_Fragment, { children: creating ? (_jsx(TaskCreateForm, { directory: directory, onCancel: () => setCreating(false), onCreate: async (input) => {
|
|
79
|
+
const created = await store.create(input);
|
|
80
|
+
setAnnouncement(created.title);
|
|
81
|
+
select(created.urn);
|
|
82
|
+
} })) : (task && (_jsx(TaskEditor, { task: task, directory: directory, saving: state.saving.has(task.urn), onChange: (changes) => store.update(task.urn, changes), onDelete: async () => {
|
|
83
|
+
await store.delete(task.urn);
|
|
84
|
+
select(undefined);
|
|
85
|
+
}, onClose: close, changedElsewhere: state.changedElsewhere.get(task.urn), onDismissChangedElsewhere: () => store.dismissChangedElsewhere(task.urn), activity: _jsx(TaskActivity, { logs: logs?.logs ?? [], directory: directory, loading: logs?.status === 'loading', onLoadMore: logs?.after ? () => store.loadMoreLogs(task.urn).catch(() => undefined) : undefined, onComment: (text, replyTo) => store.comment(task.urn, text, replyTo ? { replyTo: replyTo.urn } : {}) }) }))) }));
|
|
86
|
+
return (_jsxs("div", { className: "grid gap-4", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsxs("h2", { className: "mr-auto text-xl font-bold", children: [copy('tasks_heading'), state.status === 'ready' && (_jsx("span", { className: "text-muted-foreground ml-2 text-sm font-normal tabular-nums", children: visible.length === 1 ? copy('tasks_count_one') : copy('tasks_count', { count: visible.length }) }))] }), _jsxs(ToggleGroup, { type: "single", variant: "outline", size: "sm", spacing: 0, value: layout, onValueChange: (value) => value && setLayout(value), "aria-label": copy('tasks_view'), children: [_jsxs(ToggleGroupItem, { value: "board", children: [_jsx(Columns3, { "aria-hidden": "true" }), copy('tasks_view_board')] }), _jsxs(ToggleGroupItem, { value: "table", children: [_jsx(Rows3, { "aria-hidden": "true" }), copy('tasks_view_table')] })] }), layout === 'board' && (_jsx("div", { className: "w-36", children: _jsx(ChoiceSelect, { value: groupBy === 'workflowStage' && workflow ? `${STAGE}${workflow.urn}` : groupBy, label: copy('tasks_group_by'), choices: [
|
|
87
|
+
...GROUPINGS.map((grouping) => ({ value: grouping, label: copy(`tasks_group_${grouping}`) })),
|
|
88
|
+
// Workflows as columns, then one choice per workflow for its stages as columns.
|
|
89
|
+
...(directory.workflows?.length ? [{ value: 'workflow', label: copy('tasks_group_workflow') }] : []),
|
|
90
|
+
...(directory.workflows ?? []).map((w) => ({
|
|
91
|
+
value: `${STAGE}${w.urn}`,
|
|
92
|
+
label: copy('tasks_group_stages', { workflow: w.name }),
|
|
93
|
+
})),
|
|
94
|
+
], onChange: (value) => {
|
|
95
|
+
if (value.startsWith(STAGE)) {
|
|
96
|
+
setGroupBy('workflowStage');
|
|
97
|
+
setWorkflowUrn(value.slice(STAGE.length));
|
|
98
|
+
}
|
|
99
|
+
else
|
|
100
|
+
setGroupBy(value);
|
|
101
|
+
} }) })), _jsxs(Button, { size: "sm", onClick: () => {
|
|
102
|
+
setSelected(undefined);
|
|
103
|
+
setCreating(true);
|
|
104
|
+
}, children: [_jsx(Plus, { "aria-hidden": "true" }), copy('tasks_new')] })] }), _jsx(TaskFilters, { value: filter, onChange: setFilter, directory: directory, me: me }), _jsxs("div", { className: cn('grid grid-cols-1 items-start gap-4', (creating || task) && wide && 'grid-cols-[minmax(0,1fr)_minmax(22rem,28rem)]'), children: [_jsxs("div", { className: "min-w-0", children: [state.status === 'error' && (_jsx(Alert, { variant: "destructive", children: _jsxs(AlertDescription, { className: "flex flex-wrap items-center gap-2", children: [copy('tasks_load_failed'), _jsx(Button, { variant: "outline", size: "sm", onClick: () => store.load().catch(() => undefined), children: copy('tasks_retry') })] }) })), (state.status === 'loading' || state.status === 'idle') && state.tasks.length === 0 ? (_jsxs("div", { "aria-busy": "true", className: "grid gap-2", children: [_jsx("span", { className: "sr-only", children: copy('tasks_loading') }), [0, 1, 2].map((row) => (_jsx(Skeleton, { className: "h-16 w-full" }, row)))] })) : state.status === 'ready' && visible.length === 0 ? (_jsx("p", { className: "text-muted-foreground rounded-xl border border-dashed p-8 text-center text-sm", children: state.tasks.length === 0 ? copy('tasks_none') : copy('tasks_empty') })) : layout === 'board' ? (_jsx(TaskBoard, { ...list, groupBy: groupBy, workflow: workflow, sort: byPriorityThenDue })) : (_jsx(TaskTable, { ...list }))] }), (creating || task) && wide && (_jsx("aside", { className: "bg-card sticky top-4 max-h-[calc(100vh-2rem)] overflow-y-auto rounded-xl border p-4", children: panel }))] }), !wide && (_jsx(Sheet, { open: creating || task !== undefined, onOpenChange: (open) => !open && (creating ? setCreating(false) : close()), children: _jsxs(SheetContent, { side: "right", showCloseButton: false, "aria-describedby": undefined, className: "w-full overflow-y-auto p-4 sm:max-w-md",
|
|
105
|
+
// The editor and form focus their own heading or first field, and closing focuses the task's card.
|
|
106
|
+
onOpenAutoFocus: (event) => event.preventDefault(), onCloseAutoFocus: (event) => event.preventDefault(), children: [_jsx(SheetTitle, { className: "sr-only", children: creating ? copy('tasks_new') : copy('editor_label') }), panel] }) })), _jsx("p", { "aria-live": "polite", className: "sr-only", children: announcement })] }));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=TaskView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskView.js","sourceRoot":"","sources":["../../src/react/TaskView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Task } from '@baack-software/baack-ts-client';
|
|
2
|
+
import { type TaskStore } from '../store.ts';
|
|
3
|
+
/** What a page is about, and so which tasks it shows. */
|
|
4
|
+
export type TaskSubjectKind = 'identity' | 'company' | 'entity' | 'task' | 'project';
|
|
5
|
+
export interface TaskSubject {
|
|
6
|
+
kind: TaskSubjectKind;
|
|
7
|
+
urn: string;
|
|
8
|
+
}
|
|
9
|
+
export interface TasksAboutProps {
|
|
10
|
+
store: TaskStore;
|
|
11
|
+
/** The person, company, content, task or project the page is about. */
|
|
12
|
+
about: TaskSubject;
|
|
13
|
+
/** Opens a task, e.g. in the full task view. Without it, titles aren't links. */
|
|
14
|
+
onOpen?: ((task: Task) => void) | undefined;
|
|
15
|
+
/** The heading's level, to fit the page's outline. Default 2. */
|
|
16
|
+
headingLevel?: 2 | 3 | 4;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The tasks about one thing, for a console page about it: open tasks, most urgent first, then completed ones on
|
|
20
|
+
* request, and a quick-add whose task is related to it. The API can't search by association yet, so this filters the
|
|
21
|
+
* store's tasks; share one store across a page's panels. Loads the store when it hasn't been loaded.
|
|
22
|
+
*/
|
|
23
|
+
export declare function TasksAbout({ store, about, onOpen, headingLevel }: TasksAboutProps): import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=TasksAbout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TasksAbout.d.ts","sourceRoot":"","sources":["../../src/react/TasksAbout.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAE5D,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAW1D,yDAAyD;AACzD,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,uEAAuE;IACvE,KAAK,EAAE,WAAW,CAAC;IACnB,iFAAiF;IACjF,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,iEAAiE;IACjE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC1B;AAmBD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAgB,EAAE,EAAE,eAAe,+BAyHrF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useId, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { CircleCheck, Plus } from 'lucide-react';
|
|
4
|
+
import { selectTasks } from "../store.js";
|
|
5
|
+
import { byUrgency, isOpen } from "../tasks.js";
|
|
6
|
+
import { useCopy } from "./copy.js";
|
|
7
|
+
import { useTaskDirectory, useTaskStore } from "./hooks.js";
|
|
8
|
+
import { DueDate, nameOf, PersonAvatar, StatusBadge } from "./parts.js";
|
|
9
|
+
import { Alert, AlertDescription } from "./ui/alert.js";
|
|
10
|
+
import { Button } from "./ui/button.js";
|
|
11
|
+
import { Input } from "./ui/input.js";
|
|
12
|
+
import { Skeleton } from "./ui/skeleton.js";
|
|
13
|
+
/** The new task's fields that tie it to the subject. */
|
|
14
|
+
function subjectFields(about) {
|
|
15
|
+
const ref = { urn: about.urn };
|
|
16
|
+
switch (about.kind) {
|
|
17
|
+
case 'project':
|
|
18
|
+
return { project: ref };
|
|
19
|
+
case 'identity':
|
|
20
|
+
return { associatedIdentities: [ref] };
|
|
21
|
+
case 'company':
|
|
22
|
+
return { associatedCompanies: [ref] };
|
|
23
|
+
case 'entity':
|
|
24
|
+
return { associatedEntities: [ref] };
|
|
25
|
+
case 'task':
|
|
26
|
+
return { associatedTasks: [ref] };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The tasks about one thing, for a console page about it: open tasks, most urgent first, then completed ones on
|
|
31
|
+
* request, and a quick-add whose task is related to it. The API can't search by association yet, so this filters the
|
|
32
|
+
* store's tasks; share one store across a page's panels. Loads the store when it hasn't been loaded.
|
|
33
|
+
*/
|
|
34
|
+
export function TasksAbout({ store, about, onOpen, headingLevel = 2 }) {
|
|
35
|
+
const copy = useCopy();
|
|
36
|
+
const ids = useId();
|
|
37
|
+
const state = useTaskStore(store);
|
|
38
|
+
const directory = useTaskDirectory(state);
|
|
39
|
+
const input = useRef(null);
|
|
40
|
+
const [title, setTitle] = useState('');
|
|
41
|
+
const [adding, setAdding] = useState(false);
|
|
42
|
+
const [failed, setFailed] = useState(false);
|
|
43
|
+
const [showDone, setShowDone] = useState(false);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (store.getState().status === 'idle')
|
|
46
|
+
store.load().catch(() => undefined);
|
|
47
|
+
}, [store]);
|
|
48
|
+
const filter = about.kind === 'project' ? { project: [about.urn] } : { relatedTo: about.urn };
|
|
49
|
+
const tasks = useMemo(() => selectTasks(state, filter, byUrgency), [state, about.kind, about.urn]);
|
|
50
|
+
const open = tasks.filter(isOpen);
|
|
51
|
+
const done = tasks.filter((task) => !isOpen(task));
|
|
52
|
+
const Heading = `h${headingLevel}`;
|
|
53
|
+
const add = async () => {
|
|
54
|
+
if (!title.trim())
|
|
55
|
+
return;
|
|
56
|
+
setAdding(true);
|
|
57
|
+
setFailed(false);
|
|
58
|
+
try {
|
|
59
|
+
await store.create({ title: title.trim(), ...subjectFields(about) });
|
|
60
|
+
setTitle('');
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
setFailed(true);
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
setAdding(false);
|
|
67
|
+
input.current?.focus();
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
return (_jsxs("section", { "aria-labelledby": `${ids}-heading`, className: "bg-card grid gap-3 rounded-xl border p-4", children: [_jsxs(Heading, { id: `${ids}-heading`, className: "flex items-baseline gap-2 text-base font-semibold", children: [copy('about_heading'), ' ', state.status === 'ready' && (_jsx("span", { className: "text-muted-foreground text-sm font-normal tabular-nums", children: copy('about_open_count', { count: open.length }) }))] }), _jsxs("form", { className: "flex gap-2", onSubmit: (event) => {
|
|
71
|
+
event.preventDefault();
|
|
72
|
+
void add();
|
|
73
|
+
}, children: [_jsx(Input, { ref: input, value: title, onChange: (event) => setTitle(event.target.value), placeholder: copy('about_add_placeholder'), "aria-label": copy('about_add_label'), disabled: adding, className: "h-8" }), _jsxs(Button, { type: "submit", size: "sm", disabled: adding || !title.trim(), children: [_jsx(Plus, { "aria-hidden": "true" }), copy('about_add')] })] }), failed && (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: copy('about_add_failed') }) })), state.status === 'error' && (_jsx(Alert, { variant: "destructive", children: _jsxs(AlertDescription, { className: "flex flex-wrap items-center gap-2", children: [copy('tasks_load_failed'), _jsx(Button, { variant: "outline", size: "sm", onClick: () => store.load().catch(() => undefined), children: copy('tasks_retry') })] }) })), (state.status === 'loading' || state.status === 'idle') && state.tasks.length === 0 ? (_jsxs("div", { "aria-busy": "true", className: "grid gap-2", children: [_jsx("span", { className: "sr-only", children: copy('tasks_loading') }), [0, 1].map((row) => (_jsx(Skeleton, { className: "h-10 w-full" }, row)))] })) : (state.status !== 'error' && (_jsxs(_Fragment, { children: [open.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: copy('about_none') })) : (_jsx(TaskRows, { tasks: open, store: store, onOpen: onOpen, directory: directory })), done.length > 0 && (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", size: "sm", className: "justify-self-start", "aria-expanded": showDone, "aria-controls": `${ids}-done`, onClick: () => setShowDone(!showDone), children: showDone ? copy('about_hide_done') : copy('about_show_done', { count: done.length }) }), _jsx("div", { id: `${ids}-done`, hidden: !showDone, children: showDone && _jsx(TaskRows, { tasks: done, store: store, onOpen: onOpen, directory: directory }) })] }))] })))] }));
|
|
74
|
+
}
|
|
75
|
+
function TaskRows({ tasks, store, onOpen, directory, }) {
|
|
76
|
+
const copy = useCopy();
|
|
77
|
+
return (_jsx("ul", { className: "divide-border grid divide-y", children: tasks.map((task) => {
|
|
78
|
+
const assignee = task.assignee ? { urn: task.assignee.urn, name: nameOf(directory, task.assignee) } : null;
|
|
79
|
+
return (_jsxs("li", { className: "flex min-w-0 items-center gap-2 py-2 text-sm", children: [isOpen(task) ? (_jsx(Button, { variant: "ghost", size: "icon-xs", "aria-label": copy('about_complete', { name: task.title }), onClick: () => store.setStatus(task.urn, 'COMPLETED').catch(() => undefined), children: _jsx(CircleCheck, { "aria-hidden": "true" }) })) : (_jsx(StatusBadge, { status: task.status })), onOpen ? (_jsx("button", { type: "button", onClick: () => onOpen(task), className: "hover:text-primary min-w-0 flex-1 truncate text-left font-medium hover:underline", children: task.title })) : (_jsx("span", { className: "min-w-0 flex-1 truncate font-medium", children: task.title })), _jsx(DueDate, { task: task }), _jsx(PersonAvatar, { person: assignee })] }, task.urn));
|
|
80
|
+
}) }));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=TasksAbout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TasksAbout.js","sourceRoot":"","sources":["../../src/react/TasksAbout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { Entity, TaskPriority, TaskStatus } from '@baack-software/baack-ts-client';
|
|
3
|
+
import type { Activity } from '../types.ts';
|
|
4
|
+
/**
|
|
5
|
+
* The task components' own words (labels, headings, buttons, empty states) as Baack content: each is a text item
|
|
6
|
+
* named here, at sort order 0, on one content entity. Until that entity is loaded, or while an item is missing, the
|
|
7
|
+
* en-GB placeholder below is shown, so the components work without any content and editors can fill it in, or
|
|
8
|
+
* translate it, later.
|
|
9
|
+
*
|
|
10
|
+
* Text that varies with data uses `{name}` slots, e.g. `{count} tasks`.
|
|
11
|
+
*/
|
|
12
|
+
declare const BASE_COPY: {
|
|
13
|
+
readonly tasks_heading: "Tasks";
|
|
14
|
+
readonly tasks_new: "New task";
|
|
15
|
+
readonly tasks_view: "View";
|
|
16
|
+
readonly tasks_view_board: "Board";
|
|
17
|
+
readonly tasks_view_table: "Table";
|
|
18
|
+
readonly tasks_group_by: "Columns";
|
|
19
|
+
readonly tasks_group_status: "Status";
|
|
20
|
+
readonly tasks_group_priority: "Priority";
|
|
21
|
+
readonly tasks_group_assignee: "Assignee";
|
|
22
|
+
readonly tasks_group_project: "Project";
|
|
23
|
+
readonly tasks_group_workflow: "Workflow";
|
|
24
|
+
readonly tasks_group_stages: "{workflow} stages";
|
|
25
|
+
readonly tasks_count: "{count} tasks";
|
|
26
|
+
readonly tasks_count_one: "1 task";
|
|
27
|
+
readonly tasks_empty: "No tasks match these filters.";
|
|
28
|
+
readonly tasks_none: "There are no tasks yet. Create the first one.";
|
|
29
|
+
readonly tasks_loading: "Loading tasks…";
|
|
30
|
+
readonly tasks_load_failed: "The tasks could not be loaded.";
|
|
31
|
+
readonly tasks_retry: "Try again";
|
|
32
|
+
readonly about_heading: "Tasks";
|
|
33
|
+
readonly about_open_count: "{count} open";
|
|
34
|
+
readonly about_add_label: "New task";
|
|
35
|
+
readonly about_add_placeholder: "Add a task…";
|
|
36
|
+
readonly about_add: "Add";
|
|
37
|
+
readonly about_add_failed: "The task could not be added.";
|
|
38
|
+
readonly about_none: "No open tasks.";
|
|
39
|
+
readonly about_show_done: "Show completed ({count})";
|
|
40
|
+
readonly about_hide_done: "Hide completed";
|
|
41
|
+
readonly about_complete: "Mark {name} as completed";
|
|
42
|
+
readonly filter_label: "Filter tasks";
|
|
43
|
+
readonly filter_search: "Search tasks";
|
|
44
|
+
readonly filter_any: "Any";
|
|
45
|
+
readonly filter_mine: "Assigned to me";
|
|
46
|
+
readonly filter_open: "Open only";
|
|
47
|
+
readonly filter_clear: "Clear filters";
|
|
48
|
+
readonly field_title: "Title";
|
|
49
|
+
readonly field_description: "Description";
|
|
50
|
+
readonly field_status: "Status";
|
|
51
|
+
readonly field_priority: "Priority";
|
|
52
|
+
readonly field_assignee: "Assignee";
|
|
53
|
+
readonly field_project: "Project";
|
|
54
|
+
readonly field_due: "Due";
|
|
55
|
+
readonly field_updated: "Updated";
|
|
56
|
+
readonly field_stage: "Stage";
|
|
57
|
+
readonly field_blocking: "Blocking";
|
|
58
|
+
readonly option_unassigned: "Unassigned";
|
|
59
|
+
readonly option_no_project: "No project";
|
|
60
|
+
readonly option_no_stage: "No stage";
|
|
61
|
+
readonly option_no_workflow: "No workflow";
|
|
62
|
+
readonly due_none: "No due date";
|
|
63
|
+
readonly due_overdue: "overdue";
|
|
64
|
+
readonly due_clear: "Clear due date";
|
|
65
|
+
readonly blockers_heading: "Blocked by";
|
|
66
|
+
readonly blockers_none: "Nothing is blocking this task.";
|
|
67
|
+
readonly blockers_add: "Add a blocker";
|
|
68
|
+
readonly blockers_remove: "Remove {name} as a blocker";
|
|
69
|
+
readonly blockers_cycle: "That task already waits on this one.";
|
|
70
|
+
readonly blocked: "Blocked";
|
|
71
|
+
readonly blocked_by: "Blocked by {name}";
|
|
72
|
+
readonly related_heading: "Related";
|
|
73
|
+
readonly related_none: "Nothing related yet.";
|
|
74
|
+
readonly related_add: "Add related";
|
|
75
|
+
readonly related_remove: "Remove {name}";
|
|
76
|
+
readonly related_people: "People";
|
|
77
|
+
readonly related_companies: "Companies";
|
|
78
|
+
readonly related_entities: "Content";
|
|
79
|
+
readonly related_tasks: "Tasks";
|
|
80
|
+
readonly activity_heading: "Activity";
|
|
81
|
+
readonly activity_filter: "Show activity";
|
|
82
|
+
readonly activity_filter_all: "All";
|
|
83
|
+
readonly activity_filter_changes: "Changes";
|
|
84
|
+
readonly activity_filter_comments: "Comments";
|
|
85
|
+
readonly activity_more: "Show older activity";
|
|
86
|
+
readonly activity_empty: "No activity yet.";
|
|
87
|
+
readonly activity_by: "by {name}";
|
|
88
|
+
readonly activity_loading: "Loading activity…";
|
|
89
|
+
readonly comment_label: "Comment";
|
|
90
|
+
readonly comment_placeholder: "Add a comment…";
|
|
91
|
+
readonly comment_submit: "Comment";
|
|
92
|
+
readonly comment_reply: "Reply";
|
|
93
|
+
readonly comment_reply_label: "Reply to {name}";
|
|
94
|
+
readonly comment_cancel: "Cancel";
|
|
95
|
+
readonly editor_label: "Task details";
|
|
96
|
+
readonly editor_close: "Close";
|
|
97
|
+
readonly editor_save: "Save";
|
|
98
|
+
readonly editor_saving: "Saving…";
|
|
99
|
+
readonly editor_save_failed: "The change could not be saved.";
|
|
100
|
+
readonly conflict_heading: "Someone else changed this task";
|
|
101
|
+
readonly conflict_intro: "They saved changes to the same fields while you were editing, so yours weren’t saved. Choose what to keep.";
|
|
102
|
+
readonly conflict_theirs: "Use theirs";
|
|
103
|
+
readonly conflict_mine: "Keep mine";
|
|
104
|
+
readonly conflict_save: "Save choices";
|
|
105
|
+
readonly conflict_discard: "Use theirs for all";
|
|
106
|
+
readonly value_empty: "Empty";
|
|
107
|
+
readonly changed_elsewhere: "Someone else changed {fields} while you were editing. Their changes are kept.";
|
|
108
|
+
readonly changed_elsewhere_dismiss: "Dismiss";
|
|
109
|
+
readonly task_delete: "Delete task";
|
|
110
|
+
readonly task_delete_confirm: "Delete this task? This can’t be undone.";
|
|
111
|
+
readonly task_delete_cancel: "Keep it";
|
|
112
|
+
readonly create_heading: "New task";
|
|
113
|
+
readonly create_submit: "Create task";
|
|
114
|
+
readonly create_cancel: "Cancel";
|
|
115
|
+
readonly create_failed: "The task could not be created.";
|
|
116
|
+
};
|
|
117
|
+
type Lower<T extends string> = Lowercase<T>;
|
|
118
|
+
export type TaskCopyName = keyof typeof BASE_COPY | `status_${Lower<TaskStatus>}` | `priority_${Lower<TaskPriority>}` | `activity_${Lower<Activity>}`;
|
|
119
|
+
/** Every copy item's name and its en-GB placeholder. */
|
|
120
|
+
export declare const TASK_COPY: Readonly<Record<TaskCopyName, string>>;
|
|
121
|
+
export declare const statusCopy: (status: TaskStatus) => TaskCopyName;
|
|
122
|
+
export declare const priorityCopy: (priority: TaskPriority) => TaskCopyName;
|
|
123
|
+
/** The copy name for an activity, or undefined for one this library doesn't know yet. */
|
|
124
|
+
export declare const activityCopy: (activity: string) => TaskCopyName | undefined;
|
|
125
|
+
export interface TaskCopyProviderProps {
|
|
126
|
+
/**
|
|
127
|
+
* The content entity holding the copy, for example read from the entity view. While it is absent, every text
|
|
128
|
+
* shows its placeholder.
|
|
129
|
+
*/
|
|
130
|
+
entity?: Entity | undefined;
|
|
131
|
+
/** Replaces placeholders, for an app that wants different defaults before content exists. */
|
|
132
|
+
placeholders?: Partial<Record<TaskCopyName, string>> | undefined;
|
|
133
|
+
children: ReactNode;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Supplies the task components' copy. With an entity, the Baack editor can change the copy in place: the content is
|
|
137
|
+
* followed live (`useLiveEntity`) and marked with `data-content-live`.
|
|
138
|
+
*/
|
|
139
|
+
export declare function TaskCopyProvider({ entity, placeholders, children }: TaskCopyProviderProps): import("react").JSX.Element;
|
|
140
|
+
/**
|
|
141
|
+
* Copy as plain strings, for attributes (`aria-label`, `placeholder`) and text with `{slots}`. Prefer `<CopyText>`
|
|
142
|
+
* for visible text without slots, which the Baack editor can edit in place.
|
|
143
|
+
*/
|
|
144
|
+
export declare function useCopy(): (name: TaskCopyName, values?: Readonly<Record<string, string | number>>) => string;
|
|
145
|
+
export interface CopyTextProps {
|
|
146
|
+
name: TaskCopyName;
|
|
147
|
+
className?: string;
|
|
148
|
+
/** Element to render; default `span`. */
|
|
149
|
+
as?: string;
|
|
150
|
+
}
|
|
151
|
+
/** A piece of copy as a Baack text component, so the editor can find and change it. */
|
|
152
|
+
export declare function CopyText({ name, className, as }: CopyTextProps): import("react").JSX.Element;
|
|
153
|
+
export {};
|
|
154
|
+
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/react/copy.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACxF,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAY,MAAM,iCAAiC,CAAC;AAIlG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;GAOG;AACH,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiHL,CAAC;AAEX,KAAK,KAAK,CAAC,CAAC,SAAS,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;AAE5C,MAAM,MAAM,YAAY,GACpB,MAAM,OAAO,SAAS,GACtB,UAAU,KAAK,CAAC,UAAU,CAAC,EAAE,GAC7B,YAAY,KAAK,CAAC,YAAY,CAAC,EAAE,GACjC,YAAY,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;AAQlC,wDAAwD;AACxD,eAAO,MAAM,SAAS,EAKjB,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5C,eAAO,MAAM,UAAU,GAAI,QAAQ,UAAU,KAAG,YAAqE,CAAC;AACtH,eAAO,MAAM,YAAY,GAAI,UAAU,YAAY,KAAG,YACO,CAAC;AAC9D,yFAAyF;AACzF,eAAO,MAAM,YAAY,GAAI,UAAU,MAAM,KAAG,YAAY,GAAG,SAG9D,CAAC;AASF,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,6FAA6F;IAC7F,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IACjE,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,qBAAqB,+BAQzF;AA+BD;;;GAGG;AACH,wBAAgB,OAAO,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,KAAK,MAAM,CAM5G;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,uFAAuF;AACvF,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,aAAa,+BAU9D"}
|