@emberai-engg/task-board 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +160 -9
- package/dist/index.d.ts +160 -9
- package/dist/index.js +1979 -947
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1995 -967
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +93 -5
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -27,6 +27,8 @@ interface StructuredDescription {
|
|
|
27
27
|
* Not rendered in the current detail UI.
|
|
28
28
|
*/
|
|
29
29
|
open_questions: string;
|
|
30
|
+
/** Long-form markdown rendered under the Technical Details tab on the detail page. */
|
|
31
|
+
technical_details?: string;
|
|
30
32
|
/** Per-section review status, e.g. `{ problem: "approved" }`. Defaults to draft when absent. */
|
|
31
33
|
section_status?: Record<string, SectionStatus>;
|
|
32
34
|
}
|
|
@@ -41,11 +43,25 @@ interface Task {
|
|
|
41
43
|
created_by: string;
|
|
42
44
|
created_by_name: string;
|
|
43
45
|
comment_count: number;
|
|
46
|
+
/** Legacy free-form tag slugs (read-only on new tasks). Prefer `applied_tag_ids`. */
|
|
44
47
|
tags?: string[];
|
|
48
|
+
/** Workspace tag pool IDs applied to this task. */
|
|
49
|
+
applied_tag_ids?: string[];
|
|
45
50
|
created_at: string;
|
|
46
51
|
updated_at: string;
|
|
47
52
|
has_unread?: boolean;
|
|
48
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* A workspace-level tag definition. Tasks reference these by `applied_tag_ids`
|
|
56
|
+
* so a rename instantly affects every task that carries the tag.
|
|
57
|
+
*/
|
|
58
|
+
interface Tag {
|
|
59
|
+
id: string;
|
|
60
|
+
name: string;
|
|
61
|
+
/** Tailwind class string (e.g. `"bg-red-100 text-red-700"`). */
|
|
62
|
+
color: string;
|
|
63
|
+
created_at?: string;
|
|
64
|
+
}
|
|
49
65
|
interface ActivityEntry {
|
|
50
66
|
id: string;
|
|
51
67
|
type: string;
|
|
@@ -218,7 +234,8 @@ interface CreateTaskPayload {
|
|
|
218
234
|
description?: StructuredDescription;
|
|
219
235
|
priority: string;
|
|
220
236
|
status: string;
|
|
221
|
-
tags
|
|
237
|
+
tags?: string[];
|
|
238
|
+
applied_tag_ids?: string[];
|
|
222
239
|
}
|
|
223
240
|
interface UpdateTaskPayload {
|
|
224
241
|
title?: string;
|
|
@@ -227,6 +244,44 @@ interface UpdateTaskPayload {
|
|
|
227
244
|
status?: string;
|
|
228
245
|
position?: number;
|
|
229
246
|
tags?: string[];
|
|
247
|
+
applied_tag_ids?: string[];
|
|
248
|
+
}
|
|
249
|
+
interface CreateTagPayload {
|
|
250
|
+
name: string;
|
|
251
|
+
color?: string;
|
|
252
|
+
}
|
|
253
|
+
interface UpdateTagPayload {
|
|
254
|
+
name?: string;
|
|
255
|
+
color?: string;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Activity entry enriched with parent task metadata for the Overview feed.
|
|
259
|
+
* The detail page uses the plainer `ActivityEntry` instead.
|
|
260
|
+
*/
|
|
261
|
+
interface ActivityFeedItem {
|
|
262
|
+
id: string;
|
|
263
|
+
type: string;
|
|
264
|
+
task_id: string;
|
|
265
|
+
task_title: string;
|
|
266
|
+
project_slug: string;
|
|
267
|
+
from_status?: string | null;
|
|
268
|
+
to_status?: string | null;
|
|
269
|
+
user: string;
|
|
270
|
+
user_name: string;
|
|
271
|
+
created_at: string;
|
|
272
|
+
}
|
|
273
|
+
/** Outstanding question enriched with parent task metadata. */
|
|
274
|
+
interface OutstandingQuestion {
|
|
275
|
+
id: string;
|
|
276
|
+
task_id: string;
|
|
277
|
+
task_title: string;
|
|
278
|
+
project_slug: string;
|
|
279
|
+
text: string;
|
|
280
|
+
status: QuestionStatus;
|
|
281
|
+
asked_by: string;
|
|
282
|
+
asked_by_name: string;
|
|
283
|
+
created_at: string;
|
|
284
|
+
updated_at: string;
|
|
230
285
|
}
|
|
231
286
|
interface CreateCommentPayload {
|
|
232
287
|
content: string;
|
|
@@ -293,6 +348,17 @@ interface TaskCardProps {
|
|
|
293
348
|
onClick: () => void;
|
|
294
349
|
onShare: (e: React__default.MouseEvent) => void;
|
|
295
350
|
copied: boolean;
|
|
351
|
+
/**
|
|
352
|
+
* Workspace tag pool, keyed by ID. When provided, `task.applied_tag_ids` are
|
|
353
|
+
* resolved through this map; otherwise the card falls back to the legacy
|
|
354
|
+
* string-based `task.tags` field.
|
|
355
|
+
*/
|
|
356
|
+
tagsById?: Map<string, Tag>;
|
|
357
|
+
/**
|
|
358
|
+
* Optional handler for the dashed "+" tag button on the card. When omitted
|
|
359
|
+
* the button is hidden — keeps existing consumers backwards-compatible.
|
|
360
|
+
*/
|
|
361
|
+
onAddTag?: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
|
|
296
362
|
}
|
|
297
363
|
declare const TaskCard: React__default.NamedExoticComponent<TaskCardProps>;
|
|
298
364
|
|
|
@@ -307,17 +373,26 @@ interface KanbanColumnProps {
|
|
|
307
373
|
onTaskShare: (taskId: string, e: React__default.MouseEvent) => void;
|
|
308
374
|
copiedTaskId: string | null;
|
|
309
375
|
onLoadMore: () => void;
|
|
376
|
+
/** Workspace tag pool keyed by ID. Forwarded to each TaskCard. */
|
|
377
|
+
tagsById?: Map<string, Tag>;
|
|
378
|
+
/** Click handler for the dashed "+" tag button on each card. */
|
|
379
|
+
onAddTag?: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
|
|
310
380
|
}
|
|
311
|
-
declare function KanbanColumn({ column, tasks, totalCount, unreadCount, loadingMore, onAddTask, onTaskClick, onTaskShare, copiedTaskId, onLoadMore, }: KanbanColumnProps): react_jsx_runtime.JSX.Element;
|
|
381
|
+
declare function KanbanColumn({ column, tasks, totalCount, unreadCount, loadingMore, onAddTask, onTaskClick, onTaskShare, copiedTaskId, onLoadMore, tagsById, onAddTag, }: KanbanColumnProps): react_jsx_runtime.JSX.Element;
|
|
312
382
|
|
|
313
383
|
interface FilterBarProps {
|
|
314
384
|
projects: Project[];
|
|
315
385
|
selectedProject: string;
|
|
316
386
|
onSelectProject: (slug: string) => void;
|
|
317
|
-
|
|
318
|
-
|
|
387
|
+
/** Workspace tag pool — filter dropdown lists every tag in here. */
|
|
388
|
+
tagPool?: Tag[];
|
|
389
|
+
/** Selected workspace tag IDs that the filter is currently active for. */
|
|
390
|
+
filterTagIds?: string[];
|
|
391
|
+
onSetFilterTagIds?: (ids: string[]) => void;
|
|
392
|
+
/** Extra controls rendered on the right of the bar (e.g. layout toggle). */
|
|
393
|
+
rightSlot?: React__default.ReactNode;
|
|
319
394
|
}
|
|
320
|
-
declare function FilterBar({ projects, selectedProject, onSelectProject,
|
|
395
|
+
declare function FilterBar({ projects, selectedProject, onSelectProject, tagPool, filterTagIds, onSetFilterTagIds, rightSlot, }: FilterBarProps): react_jsx_runtime.JSX.Element;
|
|
321
396
|
|
|
322
397
|
interface NotificationBellProps {
|
|
323
398
|
onOpenTask: (taskId: string, projectSlug: string) => void;
|
|
@@ -345,14 +420,21 @@ interface TagBadgeProps {
|
|
|
345
420
|
}
|
|
346
421
|
declare function TagBadge({ tag, onRemove, size }: TagBadgeProps): react_jsx_runtime.JSX.Element;
|
|
347
422
|
|
|
348
|
-
/**
|
|
423
|
+
/**
|
|
424
|
+
* Renders text with `@[Name](username)` mention markup highlighted as
|
|
425
|
+
* styled badges. Plain text is rendered verbatim.
|
|
426
|
+
*
|
|
427
|
+
* Splitting and stripping go through hand-written `indexOf` scanners in
|
|
428
|
+
* `utils/mentions` to keep parsing linear-time on adversarial input
|
|
429
|
+
* (CodeQL js/polynomial-redos).
|
|
430
|
+
*/
|
|
349
431
|
declare function MentionText({ text, className }: {
|
|
350
432
|
text: string;
|
|
351
433
|
className?: string;
|
|
352
434
|
}): react_jsx_runtime.JSX.Element | null;
|
|
353
|
-
/** Convert stored
|
|
435
|
+
/** Convert stored `@[Name](username)` to display `@Name` for textarea. */
|
|
354
436
|
declare function toDisplayText(stored: string): string;
|
|
355
|
-
/** Convert display
|
|
437
|
+
/** Convert display `@Name` back to stored `@[Name](username)` using a mention map. */
|
|
356
438
|
declare function toStoredText(display: string, mentionMap: Map<string, string>): string;
|
|
357
439
|
|
|
358
440
|
interface MentionTextareaProps {
|
|
@@ -769,6 +851,46 @@ interface HighlightBubbleProps {
|
|
|
769
851
|
*/
|
|
770
852
|
declare function HighlightBubble({ bubble, onComment }: HighlightBubbleProps): react_jsx_runtime.JSX.Element | null;
|
|
771
853
|
|
|
854
|
+
interface TagManagerPopoverProps {
|
|
855
|
+
/** Trigger button rect (viewport coords). Used for fixed positioning. */
|
|
856
|
+
anchor: DOMRect;
|
|
857
|
+
/** IDs of tags currently applied to this task. */
|
|
858
|
+
appliedTagIds: string[];
|
|
859
|
+
/** The full workspace tag pool. */
|
|
860
|
+
pool: Tag[];
|
|
861
|
+
/** Persist the next set of applied tag IDs. */
|
|
862
|
+
onApplyTagIds: (nextIds: string[]) => void;
|
|
863
|
+
/** Create a new pool tag and resolve with its persisted form. */
|
|
864
|
+
onCreateTag: (name: string) => Promise<Tag | null>;
|
|
865
|
+
/** Rename a pool tag (propagates everywhere). */
|
|
866
|
+
onRenameTag: (id: string, newName: string) => void;
|
|
867
|
+
onClose: () => void;
|
|
868
|
+
}
|
|
869
|
+
declare function TagManagerPopover({ anchor, appliedTagIds, pool, onApplyTagIds, onCreateTag, onRenameTag, onClose, }: TagManagerPopoverProps): react_jsx_runtime.JSX.Element;
|
|
870
|
+
|
|
871
|
+
interface OverviewPanelProps {
|
|
872
|
+
/** Projects the current user has access to (drives the filter dropdown). */
|
|
873
|
+
availableProjects: Project[];
|
|
874
|
+
/** Initial project filter — defaults to "all". */
|
|
875
|
+
initialProjectSlug?: string;
|
|
876
|
+
/** Open a task in the consumer's preferred way (route push, slide-over, etc). */
|
|
877
|
+
onOpenTask?: (taskId: string, projectSlug: string) => void;
|
|
878
|
+
/** Optional column registry — used to render coloured status pills in moves. */
|
|
879
|
+
columns?: ColumnConfig[];
|
|
880
|
+
}
|
|
881
|
+
declare function OverviewPanel({ availableProjects, initialProjectSlug, onOpenTask, columns: columnsOverride, }: OverviewPanelProps): react_jsx_runtime.JSX.Element;
|
|
882
|
+
|
|
883
|
+
interface ListLayoutProps {
|
|
884
|
+
tasks: Record<string, Task[]>;
|
|
885
|
+
columnTotals: Record<string, number>;
|
|
886
|
+
filterTagIds: string[];
|
|
887
|
+
tagsById: Map<string, Tag>;
|
|
888
|
+
onTaskClick: (task: Task) => void;
|
|
889
|
+
onAddTag: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
|
|
890
|
+
onAddTaskToColumn: (statusKey: string) => void;
|
|
891
|
+
}
|
|
892
|
+
declare function ListLayout({ tasks, columnTotals, filterTagIds, tagsById, onTaskClick, onAddTag, onAddTaskToColumn, }: ListLayoutProps): react_jsx_runtime.JSX.Element;
|
|
893
|
+
|
|
772
894
|
interface TaskBoardService {
|
|
773
895
|
listTasks(projectSlug: string, perColumn?: number): Promise<Record<string, ColumnResponse>>;
|
|
774
896
|
listColumnTasks(projectSlug: string, statusKey: string, offset: number, limit: number): Promise<Task[]>;
|
|
@@ -801,6 +923,12 @@ interface TaskBoardService {
|
|
|
801
923
|
listNotifications(limit?: number): Promise<Notification[]>;
|
|
802
924
|
markNotificationRead(notificationId: string): Promise<void>;
|
|
803
925
|
markAllNotificationsRead(): Promise<void>;
|
|
926
|
+
listTags(): Promise<Tag[]>;
|
|
927
|
+
createTag(data: CreateTagPayload): Promise<Tag>;
|
|
928
|
+
updateTag(tagId: string, data: UpdateTagPayload): Promise<Tag>;
|
|
929
|
+
deleteTag(tagId: string): Promise<void>;
|
|
930
|
+
listActivityFeed(projectSlug?: string, limit?: number): Promise<ActivityFeedItem[]>;
|
|
931
|
+
listOutstandingQuestions(projectSlug?: string, statusFilter?: QuestionStatus, limit?: number): Promise<OutstandingQuestion[]>;
|
|
804
932
|
}
|
|
805
933
|
declare function createTaskBoardService(apiClient: ApiClient, basePath?: string): TaskBoardService;
|
|
806
934
|
|
|
@@ -946,6 +1074,29 @@ interface UseTaskAttachmentsResult {
|
|
|
946
1074
|
*/
|
|
947
1075
|
declare function useTaskAttachments(taskId: string | null, initial?: Attachment[]): UseTaskAttachmentsResult;
|
|
948
1076
|
|
|
1077
|
+
/**
|
|
1078
|
+
* Workspace-level tag pool. Every consumer reads from the same server-backed
|
|
1079
|
+
* list and mutates through the same CRUD endpoints, so a rename or create on
|
|
1080
|
+
* one surface (e.g. the board's tag popover) is instantly reflected on every
|
|
1081
|
+
* other surface (e.g. the task detail page) on the next render.
|
|
1082
|
+
*/
|
|
1083
|
+
interface TagPool {
|
|
1084
|
+
tags: Tag[];
|
|
1085
|
+
byId: Map<string, Tag>;
|
|
1086
|
+
loading: boolean;
|
|
1087
|
+
refresh: () => Promise<void>;
|
|
1088
|
+
/** Create a pool tag by name (idempotent — returns the existing one if the name matches). */
|
|
1089
|
+
create: (name: string, color?: string) => Promise<Tag | null>;
|
|
1090
|
+
/** Rename and/or recolor an existing pool tag. */
|
|
1091
|
+
update: (id: string, body: {
|
|
1092
|
+
name?: string;
|
|
1093
|
+
color?: string;
|
|
1094
|
+
}) => Promise<Tag | null>;
|
|
1095
|
+
/** Delete a pool tag (and remove it from every task that references it). */
|
|
1096
|
+
remove: (id: string) => Promise<boolean>;
|
|
1097
|
+
}
|
|
1098
|
+
declare function useTagPool(): TagPool;
|
|
1099
|
+
|
|
949
1100
|
declare function getPriorityStyle(priority: string): PriorityConfig;
|
|
950
1101
|
declare function getTagStyle(tag: string): TagConfig;
|
|
951
1102
|
declare function getInitials(name: string): string;
|
|
@@ -1032,4 +1183,4 @@ declare const HistoryIcon: React__default.FC<IconProps>;
|
|
|
1032
1183
|
/** Sidebar-toggle icon used to collapse / re-open the threads panel. */
|
|
1033
1184
|
declare const SidebarToggleIcon: React__default.FC<IconProps>;
|
|
1034
1185
|
|
|
1035
|
-
export { type ActivityEntry, ActivityList, type ActivityListProps, type ApiClient, type ApiClientConfig, ArrowLeftIcon, type Attachment, type AttachmentKind, AttachmentsSection, type AttachmentsSectionProps, BellIcon, BoardSkeleton, Bold, type BubbleState, ChatDotsIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, Code, type ColumnConfig, type ColumnResponse, type ColumnTotals, type ColumnUnreads, type Comment, ContextPill, type ContextPillProps, type ContextPillVariant, CornerUpLeftIcon, type CreateCommentPayload, type CreateLinkAttachmentPayload, type CreateQuestionPayload, type CreateQuestionReplyPayload, CreateTaskModal, type CreateTaskModalProps, type CreateTaskPayload, DEFAULT_COLUMNS, DEFAULT_INTERNAL_LABEL, DEFAULT_PAGE_SIZE, DEFAULT_PRIORITIES, DESCRIPTION_SECTIONS, DescriptionSection, type DescriptionSectionConfig, type DescriptionSectionProps, EMPTY_DESCRIPTION, type EditCommentPayload, ExternalLinkIcon, FeedbackIcon, FileTextIcon, FilterBar, type FilterBarProps, FilterIcon, Heading2, HelpCircleIcon, HighlightBubble, type HighlightBubbleProps, HistoryIcon, ImageIcon, Italic, KanbanColumn, type KanbanColumnProps, KanbanIcon, Link2Icon, LinkIcon, List, ListOrdered, LockIcon, MarkdownEditor, type MarkdownEditorProps, MarkdownView, MentionText, MentionTextarea, type MentionTextareaProps, type MentionUser, MessageSquareIcon, MoreVerticalIcon, type Notification, NotificationBell, type NotificationBellProps, type NotificationCountResponse, OutstandingQuestionsSection, type OutstandingQuestionsSectionProps, POSITION_GAP, PREDEFINED_TAGS, PencilIcon, PlusIcon, PriorityBadge, type PriorityBadgeProps, type PriorityConfig, type Project, type Question, type QuestionReply, type QuestionStatus, Quote, RotateCcwIcon, type SectionKey, type SectionStatus, Share2Icon, SidebarToggleIcon, SkeletonCard, SkeletonPulse, type StructuredDescription, TagBadge, type TagBadgeProps, type TagConfig, type Task, TaskBoard, type TaskBoardConfig, type TaskBoardContextValue, type TaskBoardProps, TaskBoardProvider, type TaskBoardService, type TaskBoardUser, TaskCard, type TaskCardProps, TaskDetailPanel, type TaskDetailPanelProps, type TaskDetailResponse, TaskDetailView, type TaskDetailViewProps, type TasksByStatus, type Thread, type ThreadAnchor, ThreadCard, type ThreadCardProps, ThreadComposer, type ThreadComposerProps, ThreadDetailView, type ThreadDetailViewProps, type ThreadReply, type ThreadStatus, ThreadsPanel, type ThreadsPanelProps, TrashIcon, type UpdateQuestionPayload, type UpdateTaskPayload, type UpdateThreadPayload, type UseHighlightAnchorResult, type UseTaskAttachmentsResult, type UseTaskQuestionsResult, UserAvatar, type UserAvatarProps, XIcon, createTaskBoardService, deriveThreads, formatDate, formatDateTime, formatTaskId, getDescriptionPreview, getInitials, getPriorityStyle, getTagStyle, getUserProjects, hasDescription, htmlToMd, mdToHtml, parseDate, sectionLabel, timeAgo, toDisplayText, toStoredText, useHighlightAnchor, useShareLink, useTaskActions, useTaskAttachments, useTaskBoard, useTaskBoardContext, useTaskDetail, useTaskQuestions };
|
|
1186
|
+
export { type ActivityEntry, type ActivityFeedItem, ActivityList, type ActivityListProps, type ApiClient, type ApiClientConfig, ArrowLeftIcon, type Attachment, type AttachmentKind, AttachmentsSection, type AttachmentsSectionProps, BellIcon, BoardSkeleton, Bold, type BubbleState, ChatDotsIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, Code, type ColumnConfig, type ColumnResponse, type ColumnTotals, type ColumnUnreads, type Comment, ContextPill, type ContextPillProps, type ContextPillVariant, CornerUpLeftIcon, type CreateCommentPayload, type CreateLinkAttachmentPayload, type CreateQuestionPayload, type CreateQuestionReplyPayload, type CreateTagPayload, CreateTaskModal, type CreateTaskModalProps, type CreateTaskPayload, DEFAULT_COLUMNS, DEFAULT_INTERNAL_LABEL, DEFAULT_PAGE_SIZE, DEFAULT_PRIORITIES, DESCRIPTION_SECTIONS, DescriptionSection, type DescriptionSectionConfig, type DescriptionSectionProps, EMPTY_DESCRIPTION, type EditCommentPayload, ExternalLinkIcon, FeedbackIcon, FileTextIcon, FilterBar, type FilterBarProps, FilterIcon, Heading2, HelpCircleIcon, HighlightBubble, type HighlightBubbleProps, HistoryIcon, ImageIcon, Italic, KanbanColumn, type KanbanColumnProps, KanbanIcon, Link2Icon, LinkIcon, List, ListLayout, type ListLayoutProps, ListOrdered, LockIcon, MarkdownEditor, type MarkdownEditorProps, MarkdownView, MentionText, MentionTextarea, type MentionTextareaProps, type MentionUser, MessageSquareIcon, MoreVerticalIcon, type Notification, NotificationBell, type NotificationBellProps, type NotificationCountResponse, type OutstandingQuestion, OutstandingQuestionsSection, type OutstandingQuestionsSectionProps, OverviewPanel, type OverviewPanelProps, POSITION_GAP, PREDEFINED_TAGS, PencilIcon, PlusIcon, PriorityBadge, type PriorityBadgeProps, type PriorityConfig, type Project, type Question, type QuestionReply, type QuestionStatus, Quote, RotateCcwIcon, type SectionKey, type SectionStatus, Share2Icon, SidebarToggleIcon, SkeletonCard, SkeletonPulse, type StructuredDescription, type Tag, TagBadge, type TagBadgeProps, type TagConfig, TagManagerPopover, type TagManagerPopoverProps, type TagPool, type Task, TaskBoard, type TaskBoardConfig, type TaskBoardContextValue, type TaskBoardProps, TaskBoardProvider, type TaskBoardService, type TaskBoardUser, TaskCard, type TaskCardProps, TaskDetailPanel, type TaskDetailPanelProps, type TaskDetailResponse, TaskDetailView, type TaskDetailViewProps, type TasksByStatus, type Thread, type ThreadAnchor, ThreadCard, type ThreadCardProps, ThreadComposer, type ThreadComposerProps, ThreadDetailView, type ThreadDetailViewProps, type ThreadReply, type ThreadStatus, ThreadsPanel, type ThreadsPanelProps, TrashIcon, type UpdateQuestionPayload, type UpdateTagPayload, type UpdateTaskPayload, type UpdateThreadPayload, type UseHighlightAnchorResult, type UseTaskAttachmentsResult, type UseTaskQuestionsResult, UserAvatar, type UserAvatarProps, XIcon, createTaskBoardService, deriveThreads, formatDate, formatDateTime, formatTaskId, getDescriptionPreview, getInitials, getPriorityStyle, getTagStyle, getUserProjects, hasDescription, htmlToMd, mdToHtml, parseDate, sectionLabel, timeAgo, toDisplayText, toStoredText, useHighlightAnchor, useShareLink, useTagPool, useTaskActions, useTaskAttachments, useTaskBoard, useTaskBoardContext, useTaskDetail, useTaskQuestions };
|
package/dist/index.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ interface StructuredDescription {
|
|
|
27
27
|
* Not rendered in the current detail UI.
|
|
28
28
|
*/
|
|
29
29
|
open_questions: string;
|
|
30
|
+
/** Long-form markdown rendered under the Technical Details tab on the detail page. */
|
|
31
|
+
technical_details?: string;
|
|
30
32
|
/** Per-section review status, e.g. `{ problem: "approved" }`. Defaults to draft when absent. */
|
|
31
33
|
section_status?: Record<string, SectionStatus>;
|
|
32
34
|
}
|
|
@@ -41,11 +43,25 @@ interface Task {
|
|
|
41
43
|
created_by: string;
|
|
42
44
|
created_by_name: string;
|
|
43
45
|
comment_count: number;
|
|
46
|
+
/** Legacy free-form tag slugs (read-only on new tasks). Prefer `applied_tag_ids`. */
|
|
44
47
|
tags?: string[];
|
|
48
|
+
/** Workspace tag pool IDs applied to this task. */
|
|
49
|
+
applied_tag_ids?: string[];
|
|
45
50
|
created_at: string;
|
|
46
51
|
updated_at: string;
|
|
47
52
|
has_unread?: boolean;
|
|
48
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* A workspace-level tag definition. Tasks reference these by `applied_tag_ids`
|
|
56
|
+
* so a rename instantly affects every task that carries the tag.
|
|
57
|
+
*/
|
|
58
|
+
interface Tag {
|
|
59
|
+
id: string;
|
|
60
|
+
name: string;
|
|
61
|
+
/** Tailwind class string (e.g. `"bg-red-100 text-red-700"`). */
|
|
62
|
+
color: string;
|
|
63
|
+
created_at?: string;
|
|
64
|
+
}
|
|
49
65
|
interface ActivityEntry {
|
|
50
66
|
id: string;
|
|
51
67
|
type: string;
|
|
@@ -218,7 +234,8 @@ interface CreateTaskPayload {
|
|
|
218
234
|
description?: StructuredDescription;
|
|
219
235
|
priority: string;
|
|
220
236
|
status: string;
|
|
221
|
-
tags
|
|
237
|
+
tags?: string[];
|
|
238
|
+
applied_tag_ids?: string[];
|
|
222
239
|
}
|
|
223
240
|
interface UpdateTaskPayload {
|
|
224
241
|
title?: string;
|
|
@@ -227,6 +244,44 @@ interface UpdateTaskPayload {
|
|
|
227
244
|
status?: string;
|
|
228
245
|
position?: number;
|
|
229
246
|
tags?: string[];
|
|
247
|
+
applied_tag_ids?: string[];
|
|
248
|
+
}
|
|
249
|
+
interface CreateTagPayload {
|
|
250
|
+
name: string;
|
|
251
|
+
color?: string;
|
|
252
|
+
}
|
|
253
|
+
interface UpdateTagPayload {
|
|
254
|
+
name?: string;
|
|
255
|
+
color?: string;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Activity entry enriched with parent task metadata for the Overview feed.
|
|
259
|
+
* The detail page uses the plainer `ActivityEntry` instead.
|
|
260
|
+
*/
|
|
261
|
+
interface ActivityFeedItem {
|
|
262
|
+
id: string;
|
|
263
|
+
type: string;
|
|
264
|
+
task_id: string;
|
|
265
|
+
task_title: string;
|
|
266
|
+
project_slug: string;
|
|
267
|
+
from_status?: string | null;
|
|
268
|
+
to_status?: string | null;
|
|
269
|
+
user: string;
|
|
270
|
+
user_name: string;
|
|
271
|
+
created_at: string;
|
|
272
|
+
}
|
|
273
|
+
/** Outstanding question enriched with parent task metadata. */
|
|
274
|
+
interface OutstandingQuestion {
|
|
275
|
+
id: string;
|
|
276
|
+
task_id: string;
|
|
277
|
+
task_title: string;
|
|
278
|
+
project_slug: string;
|
|
279
|
+
text: string;
|
|
280
|
+
status: QuestionStatus;
|
|
281
|
+
asked_by: string;
|
|
282
|
+
asked_by_name: string;
|
|
283
|
+
created_at: string;
|
|
284
|
+
updated_at: string;
|
|
230
285
|
}
|
|
231
286
|
interface CreateCommentPayload {
|
|
232
287
|
content: string;
|
|
@@ -293,6 +348,17 @@ interface TaskCardProps {
|
|
|
293
348
|
onClick: () => void;
|
|
294
349
|
onShare: (e: React__default.MouseEvent) => void;
|
|
295
350
|
copied: boolean;
|
|
351
|
+
/**
|
|
352
|
+
* Workspace tag pool, keyed by ID. When provided, `task.applied_tag_ids` are
|
|
353
|
+
* resolved through this map; otherwise the card falls back to the legacy
|
|
354
|
+
* string-based `task.tags` field.
|
|
355
|
+
*/
|
|
356
|
+
tagsById?: Map<string, Tag>;
|
|
357
|
+
/**
|
|
358
|
+
* Optional handler for the dashed "+" tag button on the card. When omitted
|
|
359
|
+
* the button is hidden — keeps existing consumers backwards-compatible.
|
|
360
|
+
*/
|
|
361
|
+
onAddTag?: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
|
|
296
362
|
}
|
|
297
363
|
declare const TaskCard: React__default.NamedExoticComponent<TaskCardProps>;
|
|
298
364
|
|
|
@@ -307,17 +373,26 @@ interface KanbanColumnProps {
|
|
|
307
373
|
onTaskShare: (taskId: string, e: React__default.MouseEvent) => void;
|
|
308
374
|
copiedTaskId: string | null;
|
|
309
375
|
onLoadMore: () => void;
|
|
376
|
+
/** Workspace tag pool keyed by ID. Forwarded to each TaskCard. */
|
|
377
|
+
tagsById?: Map<string, Tag>;
|
|
378
|
+
/** Click handler for the dashed "+" tag button on each card. */
|
|
379
|
+
onAddTag?: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
|
|
310
380
|
}
|
|
311
|
-
declare function KanbanColumn({ column, tasks, totalCount, unreadCount, loadingMore, onAddTask, onTaskClick, onTaskShare, copiedTaskId, onLoadMore, }: KanbanColumnProps): react_jsx_runtime.JSX.Element;
|
|
381
|
+
declare function KanbanColumn({ column, tasks, totalCount, unreadCount, loadingMore, onAddTask, onTaskClick, onTaskShare, copiedTaskId, onLoadMore, tagsById, onAddTag, }: KanbanColumnProps): react_jsx_runtime.JSX.Element;
|
|
312
382
|
|
|
313
383
|
interface FilterBarProps {
|
|
314
384
|
projects: Project[];
|
|
315
385
|
selectedProject: string;
|
|
316
386
|
onSelectProject: (slug: string) => void;
|
|
317
|
-
|
|
318
|
-
|
|
387
|
+
/** Workspace tag pool — filter dropdown lists every tag in here. */
|
|
388
|
+
tagPool?: Tag[];
|
|
389
|
+
/** Selected workspace tag IDs that the filter is currently active for. */
|
|
390
|
+
filterTagIds?: string[];
|
|
391
|
+
onSetFilterTagIds?: (ids: string[]) => void;
|
|
392
|
+
/** Extra controls rendered on the right of the bar (e.g. layout toggle). */
|
|
393
|
+
rightSlot?: React__default.ReactNode;
|
|
319
394
|
}
|
|
320
|
-
declare function FilterBar({ projects, selectedProject, onSelectProject,
|
|
395
|
+
declare function FilterBar({ projects, selectedProject, onSelectProject, tagPool, filterTagIds, onSetFilterTagIds, rightSlot, }: FilterBarProps): react_jsx_runtime.JSX.Element;
|
|
321
396
|
|
|
322
397
|
interface NotificationBellProps {
|
|
323
398
|
onOpenTask: (taskId: string, projectSlug: string) => void;
|
|
@@ -345,14 +420,21 @@ interface TagBadgeProps {
|
|
|
345
420
|
}
|
|
346
421
|
declare function TagBadge({ tag, onRemove, size }: TagBadgeProps): react_jsx_runtime.JSX.Element;
|
|
347
422
|
|
|
348
|
-
/**
|
|
423
|
+
/**
|
|
424
|
+
* Renders text with `@[Name](username)` mention markup highlighted as
|
|
425
|
+
* styled badges. Plain text is rendered verbatim.
|
|
426
|
+
*
|
|
427
|
+
* Splitting and stripping go through hand-written `indexOf` scanners in
|
|
428
|
+
* `utils/mentions` to keep parsing linear-time on adversarial input
|
|
429
|
+
* (CodeQL js/polynomial-redos).
|
|
430
|
+
*/
|
|
349
431
|
declare function MentionText({ text, className }: {
|
|
350
432
|
text: string;
|
|
351
433
|
className?: string;
|
|
352
434
|
}): react_jsx_runtime.JSX.Element | null;
|
|
353
|
-
/** Convert stored
|
|
435
|
+
/** Convert stored `@[Name](username)` to display `@Name` for textarea. */
|
|
354
436
|
declare function toDisplayText(stored: string): string;
|
|
355
|
-
/** Convert display
|
|
437
|
+
/** Convert display `@Name` back to stored `@[Name](username)` using a mention map. */
|
|
356
438
|
declare function toStoredText(display: string, mentionMap: Map<string, string>): string;
|
|
357
439
|
|
|
358
440
|
interface MentionTextareaProps {
|
|
@@ -769,6 +851,46 @@ interface HighlightBubbleProps {
|
|
|
769
851
|
*/
|
|
770
852
|
declare function HighlightBubble({ bubble, onComment }: HighlightBubbleProps): react_jsx_runtime.JSX.Element | null;
|
|
771
853
|
|
|
854
|
+
interface TagManagerPopoverProps {
|
|
855
|
+
/** Trigger button rect (viewport coords). Used for fixed positioning. */
|
|
856
|
+
anchor: DOMRect;
|
|
857
|
+
/** IDs of tags currently applied to this task. */
|
|
858
|
+
appliedTagIds: string[];
|
|
859
|
+
/** The full workspace tag pool. */
|
|
860
|
+
pool: Tag[];
|
|
861
|
+
/** Persist the next set of applied tag IDs. */
|
|
862
|
+
onApplyTagIds: (nextIds: string[]) => void;
|
|
863
|
+
/** Create a new pool tag and resolve with its persisted form. */
|
|
864
|
+
onCreateTag: (name: string) => Promise<Tag | null>;
|
|
865
|
+
/** Rename a pool tag (propagates everywhere). */
|
|
866
|
+
onRenameTag: (id: string, newName: string) => void;
|
|
867
|
+
onClose: () => void;
|
|
868
|
+
}
|
|
869
|
+
declare function TagManagerPopover({ anchor, appliedTagIds, pool, onApplyTagIds, onCreateTag, onRenameTag, onClose, }: TagManagerPopoverProps): react_jsx_runtime.JSX.Element;
|
|
870
|
+
|
|
871
|
+
interface OverviewPanelProps {
|
|
872
|
+
/** Projects the current user has access to (drives the filter dropdown). */
|
|
873
|
+
availableProjects: Project[];
|
|
874
|
+
/** Initial project filter — defaults to "all". */
|
|
875
|
+
initialProjectSlug?: string;
|
|
876
|
+
/** Open a task in the consumer's preferred way (route push, slide-over, etc). */
|
|
877
|
+
onOpenTask?: (taskId: string, projectSlug: string) => void;
|
|
878
|
+
/** Optional column registry — used to render coloured status pills in moves. */
|
|
879
|
+
columns?: ColumnConfig[];
|
|
880
|
+
}
|
|
881
|
+
declare function OverviewPanel({ availableProjects, initialProjectSlug, onOpenTask, columns: columnsOverride, }: OverviewPanelProps): react_jsx_runtime.JSX.Element;
|
|
882
|
+
|
|
883
|
+
interface ListLayoutProps {
|
|
884
|
+
tasks: Record<string, Task[]>;
|
|
885
|
+
columnTotals: Record<string, number>;
|
|
886
|
+
filterTagIds: string[];
|
|
887
|
+
tagsById: Map<string, Tag>;
|
|
888
|
+
onTaskClick: (task: Task) => void;
|
|
889
|
+
onAddTag: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
|
|
890
|
+
onAddTaskToColumn: (statusKey: string) => void;
|
|
891
|
+
}
|
|
892
|
+
declare function ListLayout({ tasks, columnTotals, filterTagIds, tagsById, onTaskClick, onAddTag, onAddTaskToColumn, }: ListLayoutProps): react_jsx_runtime.JSX.Element;
|
|
893
|
+
|
|
772
894
|
interface TaskBoardService {
|
|
773
895
|
listTasks(projectSlug: string, perColumn?: number): Promise<Record<string, ColumnResponse>>;
|
|
774
896
|
listColumnTasks(projectSlug: string, statusKey: string, offset: number, limit: number): Promise<Task[]>;
|
|
@@ -801,6 +923,12 @@ interface TaskBoardService {
|
|
|
801
923
|
listNotifications(limit?: number): Promise<Notification[]>;
|
|
802
924
|
markNotificationRead(notificationId: string): Promise<void>;
|
|
803
925
|
markAllNotificationsRead(): Promise<void>;
|
|
926
|
+
listTags(): Promise<Tag[]>;
|
|
927
|
+
createTag(data: CreateTagPayload): Promise<Tag>;
|
|
928
|
+
updateTag(tagId: string, data: UpdateTagPayload): Promise<Tag>;
|
|
929
|
+
deleteTag(tagId: string): Promise<void>;
|
|
930
|
+
listActivityFeed(projectSlug?: string, limit?: number): Promise<ActivityFeedItem[]>;
|
|
931
|
+
listOutstandingQuestions(projectSlug?: string, statusFilter?: QuestionStatus, limit?: number): Promise<OutstandingQuestion[]>;
|
|
804
932
|
}
|
|
805
933
|
declare function createTaskBoardService(apiClient: ApiClient, basePath?: string): TaskBoardService;
|
|
806
934
|
|
|
@@ -946,6 +1074,29 @@ interface UseTaskAttachmentsResult {
|
|
|
946
1074
|
*/
|
|
947
1075
|
declare function useTaskAttachments(taskId: string | null, initial?: Attachment[]): UseTaskAttachmentsResult;
|
|
948
1076
|
|
|
1077
|
+
/**
|
|
1078
|
+
* Workspace-level tag pool. Every consumer reads from the same server-backed
|
|
1079
|
+
* list and mutates through the same CRUD endpoints, so a rename or create on
|
|
1080
|
+
* one surface (e.g. the board's tag popover) is instantly reflected on every
|
|
1081
|
+
* other surface (e.g. the task detail page) on the next render.
|
|
1082
|
+
*/
|
|
1083
|
+
interface TagPool {
|
|
1084
|
+
tags: Tag[];
|
|
1085
|
+
byId: Map<string, Tag>;
|
|
1086
|
+
loading: boolean;
|
|
1087
|
+
refresh: () => Promise<void>;
|
|
1088
|
+
/** Create a pool tag by name (idempotent — returns the existing one if the name matches). */
|
|
1089
|
+
create: (name: string, color?: string) => Promise<Tag | null>;
|
|
1090
|
+
/** Rename and/or recolor an existing pool tag. */
|
|
1091
|
+
update: (id: string, body: {
|
|
1092
|
+
name?: string;
|
|
1093
|
+
color?: string;
|
|
1094
|
+
}) => Promise<Tag | null>;
|
|
1095
|
+
/** Delete a pool tag (and remove it from every task that references it). */
|
|
1096
|
+
remove: (id: string) => Promise<boolean>;
|
|
1097
|
+
}
|
|
1098
|
+
declare function useTagPool(): TagPool;
|
|
1099
|
+
|
|
949
1100
|
declare function getPriorityStyle(priority: string): PriorityConfig;
|
|
950
1101
|
declare function getTagStyle(tag: string): TagConfig;
|
|
951
1102
|
declare function getInitials(name: string): string;
|
|
@@ -1032,4 +1183,4 @@ declare const HistoryIcon: React__default.FC<IconProps>;
|
|
|
1032
1183
|
/** Sidebar-toggle icon used to collapse / re-open the threads panel. */
|
|
1033
1184
|
declare const SidebarToggleIcon: React__default.FC<IconProps>;
|
|
1034
1185
|
|
|
1035
|
-
export { type ActivityEntry, ActivityList, type ActivityListProps, type ApiClient, type ApiClientConfig, ArrowLeftIcon, type Attachment, type AttachmentKind, AttachmentsSection, type AttachmentsSectionProps, BellIcon, BoardSkeleton, Bold, type BubbleState, ChatDotsIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, Code, type ColumnConfig, type ColumnResponse, type ColumnTotals, type ColumnUnreads, type Comment, ContextPill, type ContextPillProps, type ContextPillVariant, CornerUpLeftIcon, type CreateCommentPayload, type CreateLinkAttachmentPayload, type CreateQuestionPayload, type CreateQuestionReplyPayload, CreateTaskModal, type CreateTaskModalProps, type CreateTaskPayload, DEFAULT_COLUMNS, DEFAULT_INTERNAL_LABEL, DEFAULT_PAGE_SIZE, DEFAULT_PRIORITIES, DESCRIPTION_SECTIONS, DescriptionSection, type DescriptionSectionConfig, type DescriptionSectionProps, EMPTY_DESCRIPTION, type EditCommentPayload, ExternalLinkIcon, FeedbackIcon, FileTextIcon, FilterBar, type FilterBarProps, FilterIcon, Heading2, HelpCircleIcon, HighlightBubble, type HighlightBubbleProps, HistoryIcon, ImageIcon, Italic, KanbanColumn, type KanbanColumnProps, KanbanIcon, Link2Icon, LinkIcon, List, ListOrdered, LockIcon, MarkdownEditor, type MarkdownEditorProps, MarkdownView, MentionText, MentionTextarea, type MentionTextareaProps, type MentionUser, MessageSquareIcon, MoreVerticalIcon, type Notification, NotificationBell, type NotificationBellProps, type NotificationCountResponse, OutstandingQuestionsSection, type OutstandingQuestionsSectionProps, POSITION_GAP, PREDEFINED_TAGS, PencilIcon, PlusIcon, PriorityBadge, type PriorityBadgeProps, type PriorityConfig, type Project, type Question, type QuestionReply, type QuestionStatus, Quote, RotateCcwIcon, type SectionKey, type SectionStatus, Share2Icon, SidebarToggleIcon, SkeletonCard, SkeletonPulse, type StructuredDescription, TagBadge, type TagBadgeProps, type TagConfig, type Task, TaskBoard, type TaskBoardConfig, type TaskBoardContextValue, type TaskBoardProps, TaskBoardProvider, type TaskBoardService, type TaskBoardUser, TaskCard, type TaskCardProps, TaskDetailPanel, type TaskDetailPanelProps, type TaskDetailResponse, TaskDetailView, type TaskDetailViewProps, type TasksByStatus, type Thread, type ThreadAnchor, ThreadCard, type ThreadCardProps, ThreadComposer, type ThreadComposerProps, ThreadDetailView, type ThreadDetailViewProps, type ThreadReply, type ThreadStatus, ThreadsPanel, type ThreadsPanelProps, TrashIcon, type UpdateQuestionPayload, type UpdateTaskPayload, type UpdateThreadPayload, type UseHighlightAnchorResult, type UseTaskAttachmentsResult, type UseTaskQuestionsResult, UserAvatar, type UserAvatarProps, XIcon, createTaskBoardService, deriveThreads, formatDate, formatDateTime, formatTaskId, getDescriptionPreview, getInitials, getPriorityStyle, getTagStyle, getUserProjects, hasDescription, htmlToMd, mdToHtml, parseDate, sectionLabel, timeAgo, toDisplayText, toStoredText, useHighlightAnchor, useShareLink, useTaskActions, useTaskAttachments, useTaskBoard, useTaskBoardContext, useTaskDetail, useTaskQuestions };
|
|
1186
|
+
export { type ActivityEntry, type ActivityFeedItem, ActivityList, type ActivityListProps, type ApiClient, type ApiClientConfig, ArrowLeftIcon, type Attachment, type AttachmentKind, AttachmentsSection, type AttachmentsSectionProps, BellIcon, BoardSkeleton, Bold, type BubbleState, ChatDotsIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, Code, type ColumnConfig, type ColumnResponse, type ColumnTotals, type ColumnUnreads, type Comment, ContextPill, type ContextPillProps, type ContextPillVariant, CornerUpLeftIcon, type CreateCommentPayload, type CreateLinkAttachmentPayload, type CreateQuestionPayload, type CreateQuestionReplyPayload, type CreateTagPayload, CreateTaskModal, type CreateTaskModalProps, type CreateTaskPayload, DEFAULT_COLUMNS, DEFAULT_INTERNAL_LABEL, DEFAULT_PAGE_SIZE, DEFAULT_PRIORITIES, DESCRIPTION_SECTIONS, DescriptionSection, type DescriptionSectionConfig, type DescriptionSectionProps, EMPTY_DESCRIPTION, type EditCommentPayload, ExternalLinkIcon, FeedbackIcon, FileTextIcon, FilterBar, type FilterBarProps, FilterIcon, Heading2, HelpCircleIcon, HighlightBubble, type HighlightBubbleProps, HistoryIcon, ImageIcon, Italic, KanbanColumn, type KanbanColumnProps, KanbanIcon, Link2Icon, LinkIcon, List, ListLayout, type ListLayoutProps, ListOrdered, LockIcon, MarkdownEditor, type MarkdownEditorProps, MarkdownView, MentionText, MentionTextarea, type MentionTextareaProps, type MentionUser, MessageSquareIcon, MoreVerticalIcon, type Notification, NotificationBell, type NotificationBellProps, type NotificationCountResponse, type OutstandingQuestion, OutstandingQuestionsSection, type OutstandingQuestionsSectionProps, OverviewPanel, type OverviewPanelProps, POSITION_GAP, PREDEFINED_TAGS, PencilIcon, PlusIcon, PriorityBadge, type PriorityBadgeProps, type PriorityConfig, type Project, type Question, type QuestionReply, type QuestionStatus, Quote, RotateCcwIcon, type SectionKey, type SectionStatus, Share2Icon, SidebarToggleIcon, SkeletonCard, SkeletonPulse, type StructuredDescription, type Tag, TagBadge, type TagBadgeProps, type TagConfig, TagManagerPopover, type TagManagerPopoverProps, type TagPool, type Task, TaskBoard, type TaskBoardConfig, type TaskBoardContextValue, type TaskBoardProps, TaskBoardProvider, type TaskBoardService, type TaskBoardUser, TaskCard, type TaskCardProps, TaskDetailPanel, type TaskDetailPanelProps, type TaskDetailResponse, TaskDetailView, type TaskDetailViewProps, type TasksByStatus, type Thread, type ThreadAnchor, ThreadCard, type ThreadCardProps, ThreadComposer, type ThreadComposerProps, ThreadDetailView, type ThreadDetailViewProps, type ThreadReply, type ThreadStatus, ThreadsPanel, type ThreadsPanelProps, TrashIcon, type UpdateQuestionPayload, type UpdateTagPayload, type UpdateTaskPayload, type UpdateThreadPayload, type UseHighlightAnchorResult, type UseTaskAttachmentsResult, type UseTaskQuestionsResult, UserAvatar, type UserAvatarProps, XIcon, createTaskBoardService, deriveThreads, formatDate, formatDateTime, formatTaskId, getDescriptionPreview, getInitials, getPriorityStyle, getTagStyle, getUserProjects, hasDescription, htmlToMd, mdToHtml, parseDate, sectionLabel, timeAgo, toDisplayText, toStoredText, useHighlightAnchor, useShareLink, useTagPool, useTaskActions, useTaskAttachments, useTaskBoard, useTaskBoardContext, useTaskDetail, useTaskQuestions };
|