@devalok/shilp-sutra-karm 0.1.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.
Files changed (182) hide show
  1. package/dist/admin/adjustments/approved-adjustments.d.ts +10 -0
  2. package/dist/admin/adjustments/approved-adjustments.d.ts.map +1 -0
  3. package/dist/admin/adjustments/approved-adjustments.js +42 -0
  4. package/dist/admin/adjustments/index.d.ts +2 -0
  5. package/dist/admin/adjustments/index.d.ts.map +1 -0
  6. package/dist/admin/break/break-admin-skeleton.d.ts +3 -0
  7. package/dist/admin/break/break-admin-skeleton.d.ts.map +1 -0
  8. package/dist/admin/break/break-admin-skeleton.js +58 -0
  9. package/dist/admin/break/break-admin.d.ts +79 -0
  10. package/dist/admin/break/break-admin.d.ts.map +1 -0
  11. package/dist/admin/break/break-admin.js +346 -0
  12. package/dist/admin/break/break-balance.d.ts +14 -0
  13. package/dist/admin/break/break-balance.d.ts.map +1 -0
  14. package/dist/admin/break/break-balance.js +41 -0
  15. package/dist/admin/break/breaks.d.ts +21 -0
  16. package/dist/admin/break/breaks.d.ts.map +1 -0
  17. package/dist/admin/break/breaks.js +90 -0
  18. package/dist/admin/break/delete-break.d.ts +10 -0
  19. package/dist/admin/break/delete-break.d.ts.map +1 -0
  20. package/dist/admin/break/delete-break.js +53 -0
  21. package/dist/admin/break/edit-break-balance.d.ts +15 -0
  22. package/dist/admin/break/edit-break-balance.d.ts.map +1 -0
  23. package/dist/admin/break/edit-break-balance.js +111 -0
  24. package/dist/admin/break/edit-break.d.ts +23 -0
  25. package/dist/admin/break/edit-break.d.ts.map +1 -0
  26. package/dist/admin/break/edit-break.js +485 -0
  27. package/dist/admin/break/header.d.ts +22 -0
  28. package/dist/admin/break/header.d.ts.map +1 -0
  29. package/dist/admin/break/header.js +228 -0
  30. package/dist/admin/break/index.d.ts +18 -0
  31. package/dist/admin/break/index.d.ts.map +1 -0
  32. package/dist/admin/break/leave-request.d.ts +17 -0
  33. package/dist/admin/break/leave-request.d.ts.map +1 -0
  34. package/dist/admin/break/leave-request.js +162 -0
  35. package/dist/admin/break/use-break-date-picker.d.ts +25 -0
  36. package/dist/admin/break/use-break-date-picker.d.ts.map +1 -0
  37. package/dist/admin/break/use-break-date-picker.js +42 -0
  38. package/dist/admin/dashboard/admin-dashboard.d.ts +109 -0
  39. package/dist/admin/dashboard/admin-dashboard.d.ts.map +1 -0
  40. package/dist/admin/dashboard/admin-dashboard.js +336 -0
  41. package/dist/admin/dashboard/associate-detail.d.ts +36 -0
  42. package/dist/admin/dashboard/associate-detail.d.ts.map +1 -0
  43. package/dist/admin/dashboard/associate-detail.js +269 -0
  44. package/dist/admin/dashboard/attendance-overview.d.ts +11 -0
  45. package/dist/admin/dashboard/attendance-overview.d.ts.map +1 -0
  46. package/dist/admin/dashboard/attendance-overview.js +137 -0
  47. package/dist/admin/dashboard/break-request.d.ts +25 -0
  48. package/dist/admin/dashboard/break-request.d.ts.map +1 -0
  49. package/dist/admin/dashboard/break-request.js +174 -0
  50. package/dist/admin/dashboard/calendar.d.ts +7 -0
  51. package/dist/admin/dashboard/calendar.d.ts.map +1 -0
  52. package/dist/admin/dashboard/calendar.js +140 -0
  53. package/dist/admin/dashboard/correction-list.d.ts +21 -0
  54. package/dist/admin/dashboard/correction-list.d.ts.map +1 -0
  55. package/dist/admin/dashboard/correction-list.js +99 -0
  56. package/dist/admin/dashboard/dashboard-header.d.ts +18 -0
  57. package/dist/admin/dashboard/dashboard-header.d.ts.map +1 -0
  58. package/dist/admin/dashboard/dashboard-header.js +153 -0
  59. package/dist/admin/dashboard/dashboard-skeleton.d.ts +3 -0
  60. package/dist/admin/dashboard/dashboard-skeleton.d.ts.map +1 -0
  61. package/dist/admin/dashboard/dashboard-skeleton.js +110 -0
  62. package/dist/admin/dashboard/index.d.ts +13 -0
  63. package/dist/admin/dashboard/index.d.ts.map +1 -0
  64. package/dist/admin/dashboard/leave-requests.d.ts +26 -0
  65. package/dist/admin/dashboard/leave-requests.d.ts.map +1 -0
  66. package/dist/admin/dashboard/leave-requests.js +197 -0
  67. package/dist/admin/dashboard/render-date.d.ts +16 -0
  68. package/dist/admin/dashboard/render-date.d.ts.map +1 -0
  69. package/dist/admin/dashboard/render-date.js +143 -0
  70. package/dist/admin/dashboard/use-calendar-navigation.d.ts +60 -0
  71. package/dist/admin/dashboard/use-calendar-navigation.d.ts.map +1 -0
  72. package/dist/admin/dashboard/use-calendar-navigation.js +168 -0
  73. package/dist/admin/dashboard/use-leave-request-interaction.d.ts +21 -0
  74. package/dist/admin/dashboard/use-leave-request-interaction.d.ts.map +1 -0
  75. package/dist/admin/dashboard/use-leave-request-interaction.js +33 -0
  76. package/dist/admin/icons.d.ts +2 -0
  77. package/dist/admin/icons.d.ts.map +1 -0
  78. package/dist/admin/index.d.ts +9 -0
  79. package/dist/admin/index.d.ts.map +1 -0
  80. package/dist/admin/index.js +62 -0
  81. package/dist/admin/types.d.ts +113 -0
  82. package/dist/admin/types.d.ts.map +1 -0
  83. package/dist/admin/utils/date-range-utils.d.ts +35 -0
  84. package/dist/admin/utils/date-range-utils.d.ts.map +1 -0
  85. package/dist/admin/utils/date-range-utils.js +36 -0
  86. package/dist/admin/utils/date-utils.d.ts +29 -0
  87. package/dist/admin/utils/date-utils.d.ts.map +1 -0
  88. package/dist/admin/utils/date-utils.js +118 -0
  89. package/dist/admin/utils/emoji-utils.d.ts +3 -0
  90. package/dist/admin/utils/emoji-utils.d.ts.map +1 -0
  91. package/dist/admin/utils/emoji-utils.js +16 -0
  92. package/dist/admin/utils/render-adjustment-type.d.ts +17 -0
  93. package/dist/admin/utils/render-adjustment-type.d.ts.map +1 -0
  94. package/dist/admin/utils/render-adjustment-type.js +19 -0
  95. package/dist/admin/utils/render-status.d.ts +3 -0
  96. package/dist/admin/utils/render-status.d.ts.map +1 -0
  97. package/dist/admin/utils/render-status.js +21 -0
  98. package/dist/board/board-column.d.ts +20 -0
  99. package/dist/board/board-column.d.ts.map +1 -0
  100. package/dist/board/board-column.js +233 -0
  101. package/dist/board/index.d.ts +4 -0
  102. package/dist/board/index.d.ts.map +1 -0
  103. package/dist/board/index.js +9 -0
  104. package/dist/board/kanban-board.d.ts +17 -0
  105. package/dist/board/kanban-board.d.ts.map +1 -0
  106. package/dist/board/kanban-board.js +218 -0
  107. package/dist/board/task-card.d.ts +25 -0
  108. package/dist/board/task-card.d.ts.map +1 -0
  109. package/dist/board/task-card.js +169 -0
  110. package/dist/chat/chat-input.d.ts +10 -0
  111. package/dist/chat/chat-input.d.ts.map +1 -0
  112. package/dist/chat/chat-input.js +52 -0
  113. package/dist/chat/chat-panel.d.ts +31 -0
  114. package/dist/chat/chat-panel.d.ts.map +1 -0
  115. package/dist/chat/chat-panel.js +150 -0
  116. package/dist/chat/conversation-list.d.ts +17 -0
  117. package/dist/chat/conversation-list.d.ts.map +1 -0
  118. package/dist/chat/conversation-list.js +98 -0
  119. package/dist/chat/index.d.ts +6 -0
  120. package/dist/chat/index.d.ts.map +1 -0
  121. package/dist/chat/index.js +12 -0
  122. package/dist/chat/message-list.d.ts +16 -0
  123. package/dist/chat/message-list.d.ts.map +1 -0
  124. package/dist/chat/message-list.js +69 -0
  125. package/dist/chat/streaming-text.d.ts +6 -0
  126. package/dist/chat/streaming-text.d.ts.map +1 -0
  127. package/dist/chat/streaming-text.js +29 -0
  128. package/dist/client/accent-provider.d.ts +14 -0
  129. package/dist/client/accent-provider.d.ts.map +1 -0
  130. package/dist/client/accent-provider.js +21 -0
  131. package/dist/client/client-portal-header.d.ts +10 -0
  132. package/dist/client/client-portal-header.d.ts.map +1 -0
  133. package/dist/client/client-portal-header.js +47 -0
  134. package/dist/client/index.d.ts +4 -0
  135. package/dist/client/index.d.ts.map +1 -0
  136. package/dist/client/index.js +8 -0
  137. package/dist/client/project-card.d.ts +11 -0
  138. package/dist/client/project-card.d.ts.map +1 -0
  139. package/dist/client/project-card.js +59 -0
  140. package/dist/dashboard/attendance-cta.d.ts +22 -0
  141. package/dist/dashboard/attendance-cta.d.ts.map +1 -0
  142. package/dist/dashboard/attendance-cta.js +127 -0
  143. package/dist/dashboard/daily-brief.d.ts +13 -0
  144. package/dist/dashboard/daily-brief.d.ts.map +1 -0
  145. package/dist/dashboard/daily-brief.js +66 -0
  146. package/dist/dashboard/index.d.ts +3 -0
  147. package/dist/dashboard/index.d.ts.map +1 -0
  148. package/dist/dashboard/index.js +6 -0
  149. package/dist/index.d.ts +9 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +93 -0
  152. package/dist/page-skeletons.d.ts +5 -0
  153. package/dist/page-skeletons.d.ts.map +1 -0
  154. package/dist/page-skeletons.js +129 -0
  155. package/dist/tasks/activity-tab.d.ts +20 -0
  156. package/dist/tasks/activity-tab.d.ts.map +1 -0
  157. package/dist/tasks/activity-tab.js +184 -0
  158. package/dist/tasks/conversation-tab.d.ts +45 -0
  159. package/dist/tasks/conversation-tab.d.ts.map +1 -0
  160. package/dist/tasks/conversation-tab.js +126 -0
  161. package/dist/tasks/files-tab.d.ts +28 -0
  162. package/dist/tasks/files-tab.d.ts.map +1 -0
  163. package/dist/tasks/files-tab.js +184 -0
  164. package/dist/tasks/index.d.ts +8 -0
  165. package/dist/tasks/index.d.ts.map +1 -0
  166. package/dist/tasks/index.js +16 -0
  167. package/dist/tasks/review-tab.d.ts +32 -0
  168. package/dist/tasks/review-tab.d.ts.map +1 -0
  169. package/dist/tasks/review-tab.js +169 -0
  170. package/dist/tasks/subtasks-tab.d.ts +36 -0
  171. package/dist/tasks/subtasks-tab.d.ts.map +1 -0
  172. package/dist/tasks/subtasks-tab.js +153 -0
  173. package/dist/tasks/task-constants.d.ts +9 -0
  174. package/dist/tasks/task-constants.d.ts.map +1 -0
  175. package/dist/tasks/task-constants.js +21 -0
  176. package/dist/tasks/task-detail-panel.d.ts +93 -0
  177. package/dist/tasks/task-detail-panel.d.ts.map +1 -0
  178. package/dist/tasks/task-detail-panel.js +208 -0
  179. package/dist/tasks/task-properties.d.ts +60 -0
  180. package/dist/tasks/task-properties.d.ts.map +1 -0
  181. package/dist/tasks/task-properties.js +316 -0
  182. package/package.json +67 -0
@@ -0,0 +1,169 @@
1
+ import { jsxs as a, jsx as t } from "react/jsx-runtime";
2
+ import * as d from "react";
3
+ import { cn as p } from "@devalok/shilp-sutra/ui";
4
+ import { Avatar as R, AvatarImage as v, AvatarFallback as k } from "@devalok/shilp-sutra/ui";
5
+ import { Badge as I } from "@devalok/shilp-sutra/ui";
6
+ import { EmptyState as S } from "@devalok/shilp-sutra/composed";
7
+ import { MemberPicker as A } from "@devalok/shilp-sutra/composed";
8
+ import { IconCheck as C, IconMessage as P, IconX as D, IconGitPullRequest as T, IconPlus as M } from "@tabler/icons-react";
9
+ import { getInitials as q } from "@devalok/shilp-sutra/composed";
10
+ import { REVIEW_STATUS_MAP as O } from "./task-constants.js";
11
+ function _(l) {
12
+ return new Date(l).toLocaleDateString("en-IN", {
13
+ month: "short",
14
+ day: "numeric",
15
+ hour: "numeric",
16
+ minute: "2-digit"
17
+ });
18
+ }
19
+ const G = [
20
+ { status: "APPROVED", label: "Approve", icon: C },
21
+ { status: "CHANGES_REQUESTED", label: "Request Changes", icon: P },
22
+ { status: "REJECTED", label: "Reject", icon: D }
23
+ ], j = d.forwardRef(
24
+ function({
25
+ reviews: i,
26
+ members: m,
27
+ onRequestReview: b,
28
+ onUpdateStatus: h,
29
+ className: f
30
+ }, N) {
31
+ const [u, x] = d.useState({}), [g, n] = d.useState(null), y = d.useMemo(
32
+ () => m.map((e) => ({ id: e.id, name: e.name, avatar: e.image ?? void 0 })),
33
+ [m]
34
+ ), E = (e, r) => {
35
+ h(e, r, u[e]), x((o) => {
36
+ const s = { ...o };
37
+ return delete s[e], s;
38
+ }), n(null);
39
+ };
40
+ return /* @__PURE__ */ a("div", { ref: N, className: p("flex flex-col", f), children: [
41
+ i.length > 0 ? /* @__PURE__ */ t("div", { className: "space-y-ds-04", children: i.map((e) => {
42
+ const r = O[e.status], o = g === e.id;
43
+ return /* @__PURE__ */ a(
44
+ "div",
45
+ {
46
+ className: "rounded-ds-lg border border-border bg-layer-01 shadow-01 p-ds-04",
47
+ children: [
48
+ /* @__PURE__ */ a("div", { className: "flex items-center gap-ds-03", children: [
49
+ /* @__PURE__ */ a(R, { className: "h-ds-xs w-ds-xs shrink-0", children: [
50
+ e.reviewer.image && /* @__PURE__ */ t(
51
+ v,
52
+ {
53
+ src: e.reviewer.image,
54
+ alt: e.reviewer.name
55
+ }
56
+ ),
57
+ /* @__PURE__ */ t(k, { className: "bg-layer-03 text-ds-xs font-semibold text-text-on-color", children: q(e.reviewer.name) })
58
+ ] }),
59
+ /* @__PURE__ */ a("div", { className: "flex-1 min-w-0", children: [
60
+ /* @__PURE__ */ t("span", { className: "text-ds-md font-medium text-text-primary", children: e.reviewer.name }),
61
+ /* @__PURE__ */ a("span", { className: "ml-ds-03 text-ds-sm text-text-placeholder", children: [
62
+ "requested by ",
63
+ e.requestedBy.name
64
+ ] })
65
+ ] }),
66
+ /* @__PURE__ */ t(
67
+ I,
68
+ {
69
+ variant: r.variant,
70
+ children: r.label
71
+ }
72
+ )
73
+ ] }),
74
+ e.feedback && /* @__PURE__ */ t("div", { className: "mt-ds-03 rounded-ds-md bg-layer-02 px-ds-04 py-ds-03", children: /* @__PURE__ */ t("p", { className: "text-ds-sm text-text-secondary", children: e.feedback }) }),
75
+ e.status === "PENDING" && /* @__PURE__ */ t("div", { className: "mt-ds-03", children: o ? /* @__PURE__ */ a("div", { className: "space-y-ds-03", children: [
76
+ /* @__PURE__ */ t(
77
+ "textarea",
78
+ {
79
+ value: u[e.id] || "",
80
+ onChange: (s) => x((c) => ({
81
+ ...c,
82
+ [e.id]: s.target.value
83
+ })),
84
+ placeholder: "Add feedback (optional)...",
85
+ rows: 2,
86
+ className: "w-full resize-none rounded-ds-md border border-border bg-transparent px-ds-03 py-ds-03 text-ds-sm text-text-primary placeholder:text-text-placeholder outline-none focus:border-border-subtle"
87
+ }
88
+ ),
89
+ /* @__PURE__ */ a("div", { className: "flex items-center gap-ds-02b", children: [
90
+ G.map((s) => {
91
+ const c = s.icon;
92
+ return /* @__PURE__ */ a(
93
+ "button",
94
+ {
95
+ type: "button",
96
+ onClick: () => E(e.id, s.status),
97
+ className: p(
98
+ "inline-flex items-center gap-ds-02 rounded-ds-md px-ds-03 py-ds-02 text-ds-sm font-semibold transition-colors",
99
+ s.status === "APPROVED" && "bg-success-surface text-text-success hover:opacity-90",
100
+ s.status === "CHANGES_REQUESTED" && "bg-warning-surface text-text-warning hover:opacity-90",
101
+ s.status === "REJECTED" && "bg-error-surface text-text-error hover:opacity-90"
102
+ ),
103
+ children: [
104
+ /* @__PURE__ */ t(c, { className: "h-3 w-3", stroke: 2 }),
105
+ s.label
106
+ ]
107
+ },
108
+ s.status
109
+ );
110
+ }),
111
+ /* @__PURE__ */ t(
112
+ "button",
113
+ {
114
+ type: "button",
115
+ onClick: () => n(null),
116
+ className: "ml-auto text-ds-sm text-text-placeholder hover:text-text-secondary",
117
+ children: "Cancel"
118
+ }
119
+ )
120
+ ] })
121
+ ] }) : /* @__PURE__ */ t(
122
+ "button",
123
+ {
124
+ type: "button",
125
+ onClick: () => n(e.id),
126
+ className: "text-ds-sm font-medium text-interactive transition-colors hover:underline",
127
+ children: "Respond"
128
+ }
129
+ ) }),
130
+ /* @__PURE__ */ t("p", { className: "mt-ds-03 text-ds-xs text-text-placeholder", children: _(e.createdAt) })
131
+ ]
132
+ },
133
+ e.id
134
+ );
135
+ }) }) : /* @__PURE__ */ t(
136
+ S,
137
+ {
138
+ icon: T,
139
+ title: "No reviews yet",
140
+ description: "Request a review from a team member",
141
+ compact: !0
142
+ }
143
+ ),
144
+ /* @__PURE__ */ t(
145
+ A,
146
+ {
147
+ members: y,
148
+ selectedIds: [],
149
+ onSelect: (e) => b(e),
150
+ children: /* @__PURE__ */ a(
151
+ "button",
152
+ {
153
+ type: "button",
154
+ className: "mt-ds-04 inline-flex items-center gap-ds-02b rounded-ds-lg px-ds-03 py-ds-02b text-ds-md text-text-placeholder transition-colors hover:bg-field hover:text-text-secondary",
155
+ children: [
156
+ /* @__PURE__ */ t(M, { className: "h-ico-sm w-ico-sm", stroke: 1.5 }),
157
+ "Request Review"
158
+ ]
159
+ }
160
+ )
161
+ }
162
+ )
163
+ ] });
164
+ }
165
+ );
166
+ j.displayName = "ReviewTab";
167
+ export {
168
+ j as ReviewTab
169
+ };
@@ -0,0 +1,36 @@
1
+ import * as React from 'react';
2
+ export interface Subtask {
3
+ id: string;
4
+ title: string;
5
+ priority: 'LOW' | 'MEDIUM' | 'HIGH' | 'URGENT';
6
+ columnId: string;
7
+ column?: {
8
+ id: string;
9
+ name: string;
10
+ isTerminal?: boolean;
11
+ };
12
+ assignees: {
13
+ user: {
14
+ id: string;
15
+ name: string;
16
+ image?: string | null;
17
+ };
18
+ }[];
19
+ }
20
+ interface SubtasksTabProps {
21
+ subtasks: Subtask[];
22
+ terminalColumnId?: string;
23
+ projectId: string;
24
+ parentTaskId: string;
25
+ defaultColumnId: string;
26
+ onCreateSubtask: (title: string) => void;
27
+ onToggleSubtask: (taskId: string, isComplete: boolean) => void;
28
+ onClickSubtask?: (taskId: string) => void;
29
+ className?: string;
30
+ /** When true, hide create/toggle controls (client view) */
31
+ readOnly?: boolean;
32
+ }
33
+ declare const SubtasksTab: React.ForwardRefExoticComponent<SubtasksTabProps & React.RefAttributes<HTMLDivElement>>;
34
+ export { SubtasksTab };
35
+ export type { SubtasksTabProps };
36
+ //# sourceMappingURL=subtasks-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subtasks-tab.d.ts","sourceRoot":"","sources":["../../src/tasks/subtasks-tab.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAsB9B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAA;IAC9C,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IAC3D,SAAS,EAAE;QACT,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAA;KAC1D,EAAE,CAAA;CACJ;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9D,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAMD,QAAA,MAAM,WAAW,yFAyLhB,CAAA;AAID,OAAO,EAAE,WAAW,EAAE,CAAA;AACtB,YAAY,EAAE,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,153 @@
1
+ import { jsxs as r, jsx as t } from "react/jsx-runtime";
2
+ import * as l from "react";
3
+ import { cn as a } from "@devalok/shilp-sutra/ui";
4
+ import { Avatar as D, AvatarImage as E, AvatarFallback as P } from "@devalok/shilp-sutra/ui";
5
+ import { Progress as K } from "@devalok/shilp-sutra/ui";
6
+ import { EmptyState as j } from "@devalok/shilp-sutra/composed";
7
+ import { IconSquareCheck as q, IconSquare as B, IconListCheck as L, IconPlus as O } from "@tabler/icons-react";
8
+ import { getInitials as S } from "@devalok/shilp-sutra/composed";
9
+ import { PRIORITY_DOT_COLORS as _ } from "./task-constants.js";
10
+ const C = l.forwardRef(
11
+ function({
12
+ subtasks: d,
13
+ terminalColumnId: g,
14
+ onCreateSubtask: w,
15
+ onToggleSubtask: I,
16
+ onClickSubtask: s,
17
+ className: T,
18
+ readOnly: f = !1
19
+ }, A) {
20
+ const [c, h] = l.useState(""), [m, x] = l.useState(!1), u = l.useRef(null), v = d.filter(
21
+ (e) => {
22
+ var o;
23
+ return ((o = e.column) == null ? void 0 : o.isTerminal) || e.columnId === g;
24
+ }
25
+ ).length, p = d.length, y = () => {
26
+ const e = c.trim();
27
+ e && (w(e), h(""));
28
+ }, R = (e) => {
29
+ e.key === "Enter" && (e.preventDefault(), y()), e.key === "Escape" && (x(!1), h(""));
30
+ };
31
+ return l.useEffect(() => {
32
+ m && u.current && u.current.focus();
33
+ }, [m]), /* @__PURE__ */ r("div", { ref: A, className: a("flex flex-col", T), children: [
34
+ p > 0 && /* @__PURE__ */ r("div", { className: "mb-ds-05 flex items-center gap-ds-04", children: [
35
+ /* @__PURE__ */ t(K, { value: p > 0 ? v / p * 100 : 0, className: "h-ds-02b" }),
36
+ /* @__PURE__ */ r("span", { className: "shrink-0 text-ds-sm font-medium text-text-placeholder", children: [
37
+ v,
38
+ "/",
39
+ p
40
+ ] })
41
+ ] }),
42
+ d.length > 0 ? /* @__PURE__ */ t("div", { className: "space-y-ds-01", children: d.map((e) => {
43
+ var N, b;
44
+ const o = ((N = e.column) == null ? void 0 : N.isTerminal) || e.columnId === g, i = (b = e.assignees[0]) == null ? void 0 : b.user;
45
+ return /* @__PURE__ */ r(
46
+ "div",
47
+ {
48
+ role: "button",
49
+ tabIndex: 0,
50
+ className: a(
51
+ "group flex items-center gap-ds-03 rounded-ds-lg px-ds-03 py-ds-02b transition-colors",
52
+ "hover:bg-field cursor-pointer"
53
+ ),
54
+ onClick: () => s == null ? void 0 : s(e.id),
55
+ onKeyDown: (n) => {
56
+ (n.key === "Enter" || n.key === " ") && (n.preventDefault(), s == null || s(e.id));
57
+ },
58
+ children: [
59
+ /* @__PURE__ */ t(
60
+ "button",
61
+ {
62
+ type: "button",
63
+ onClick: (n) => {
64
+ n.stopPropagation(), f || I(e.id, !o);
65
+ },
66
+ className: a(
67
+ "shrink-0 rounded p-ds-01 transition-colors",
68
+ f ? "cursor-default" : "hover:bg-layer-02"
69
+ ),
70
+ children: o ? /* @__PURE__ */ t(q, { className: "h-ico-sm w-ico-sm text-interactive", stroke: 1.5 }) : /* @__PURE__ */ t(B, { className: "h-ico-sm w-ico-sm text-text-placeholder", stroke: 1.5 })
71
+ }
72
+ ),
73
+ /* @__PURE__ */ t(
74
+ "div",
75
+ {
76
+ className: a(
77
+ "h-2 w-2 shrink-0 rounded-ds-full",
78
+ _[e.priority]
79
+ )
80
+ }
81
+ ),
82
+ /* @__PURE__ */ t(
83
+ "span",
84
+ {
85
+ className: a(
86
+ "flex-1 truncate text-ds-md",
87
+ o ? "text-text-placeholder line-through" : "text-text-primary"
88
+ ),
89
+ children: e.title
90
+ }
91
+ ),
92
+ i && /* @__PURE__ */ r(D, { className: "h-ico-md w-ico-md shrink-0", children: [
93
+ i.image && /* @__PURE__ */ t(E, { src: i.image, alt: i.name }),
94
+ /* @__PURE__ */ t(P, { className: "bg-layer-03 text-ds-xs font-semibold text-text-on-color", children: S(i.name) })
95
+ ] })
96
+ ]
97
+ },
98
+ e.id
99
+ );
100
+ }) }) : !m && /* @__PURE__ */ t(
101
+ j,
102
+ {
103
+ icon: L,
104
+ title: "No subtasks",
105
+ description: "Break this task into smaller pieces",
106
+ compact: !0
107
+ }
108
+ ),
109
+ !f && (m ? /* @__PURE__ */ r("div", { className: "mt-ds-03 flex items-center gap-ds-03 rounded-ds-lg border border-border bg-layer-01 shadow-01 px-ds-04 py-ds-03", children: [
110
+ /* @__PURE__ */ t(
111
+ "input",
112
+ {
113
+ ref: u,
114
+ type: "text",
115
+ value: c,
116
+ onChange: (e) => h(e.target.value),
117
+ onKeyDown: R,
118
+ onBlur: () => {
119
+ c.trim() || x(!1);
120
+ },
121
+ placeholder: "Subtask title...",
122
+ className: "flex-1 bg-transparent text-ds-md text-text-primary placeholder:text-text-placeholder outline-none"
123
+ }
124
+ ),
125
+ /* @__PURE__ */ t(
126
+ "button",
127
+ {
128
+ type: "button",
129
+ onClick: y,
130
+ disabled: !c.trim(),
131
+ className: "inline-flex h-6 items-center gap-ds-02 rounded-ds-md bg-interactive px-ds-03 text-ds-sm font-semibold text-text-on-color transition-colors hover:bg-interactive-hover disabled:opacity-[0.38]",
132
+ children: "Add"
133
+ }
134
+ )
135
+ ] }) : /* @__PURE__ */ r(
136
+ "button",
137
+ {
138
+ type: "button",
139
+ onClick: () => x(!0),
140
+ className: "mt-ds-03 inline-flex items-center gap-ds-02b rounded-ds-lg px-ds-03 py-ds-02b text-ds-md text-text-placeholder transition-colors hover:bg-field hover:text-text-secondary",
141
+ children: [
142
+ /* @__PURE__ */ t(O, { className: "h-ico-sm w-ico-sm", stroke: 1.5 }),
143
+ "Add subtask"
144
+ ]
145
+ }
146
+ ))
147
+ ] });
148
+ }
149
+ );
150
+ C.displayName = "SubtasksTab";
151
+ export {
152
+ C as SubtasksTab
153
+ };
@@ -0,0 +1,9 @@
1
+ export declare const PRIORITY_LABELS: Record<string, string>;
2
+ export declare const PRIORITY_DOT_COLORS: Record<string, string>;
3
+ export type BadgeVariant = 'neutral' | 'info' | 'success' | 'error' | 'warning' | 'brand' | 'accent' | 'teal' | 'amber' | 'slate' | 'indigo' | 'cyan' | 'orange' | 'emerald';
4
+ export interface ReviewStatusConfig {
5
+ variant: BadgeVariant;
6
+ label: string;
7
+ }
8
+ export declare const REVIEW_STATUS_MAP: Record<string, ReviewStatusConfig>;
9
+ //# sourceMappingURL=task-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-constants.d.ts","sourceRoot":"","sources":["../../src/tasks/task-constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKlD,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKtD,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE5K,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,YAAY,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAKhE,CAAA"}
@@ -0,0 +1,21 @@
1
+ const r = {
2
+ LOW: "Low",
3
+ MEDIUM: "Medium",
4
+ HIGH: "High",
5
+ URGENT: "Urgent"
6
+ }, a = {
7
+ LOW: "bg-[var(--color-category-slate)]",
8
+ MEDIUM: "bg-[var(--color-warning)]",
9
+ HIGH: "bg-[var(--color-error)]",
10
+ URGENT: "bg-[var(--color-error)]"
11
+ }, e = {
12
+ PENDING: { variant: "warning", label: "Pending" },
13
+ APPROVED: { variant: "success", label: "Approved" },
14
+ CHANGES_REQUESTED: { variant: "brand", label: "Changes Requested" },
15
+ REJECTED: { variant: "error", label: "Rejected" }
16
+ };
17
+ export {
18
+ a as PRIORITY_DOT_COLORS,
19
+ r as PRIORITY_LABELS,
20
+ e as REVIEW_STATUS_MAP
21
+ };
@@ -0,0 +1,93 @@
1
+ import { Member, Column } from './task-properties';
2
+ import { Subtask } from './subtasks-tab';
3
+ import { ReviewRequest } from './review-tab';
4
+ import { Comment } from './conversation-tab';
5
+ import { TaskFile } from './files-tab';
6
+ import { AuditLogEntry } from './activity-tab';
7
+ import * as React from 'react';
8
+ export interface FullTask {
9
+ id: string;
10
+ title: string;
11
+ description: string | null;
12
+ projectId: string;
13
+ columnId: string;
14
+ column: {
15
+ id: string;
16
+ name: string;
17
+ };
18
+ ownerId: string | null;
19
+ owner: Member | null;
20
+ priority: 'LOW' | 'MEDIUM' | 'HIGH' | 'URGENT';
21
+ dueDate: string | null;
22
+ labels: string[];
23
+ visibility: 'INTERNAL' | 'EVERYONE';
24
+ parentTaskId: string | null;
25
+ depth: number;
26
+ order: number;
27
+ isBlocked: boolean;
28
+ assignees: {
29
+ user: Member;
30
+ }[];
31
+ subtasks: Subtask[];
32
+ reviewRequests: ReviewRequest[];
33
+ comments: Comment[];
34
+ files: TaskFile[];
35
+ createdAt: string;
36
+ updatedAt: string;
37
+ }
38
+ interface TaskDetailPanelProps {
39
+ task: FullTask | null;
40
+ loading?: boolean;
41
+ open: boolean;
42
+ onOpenChange: (open: boolean) => void;
43
+ columns: Column[];
44
+ members: Member[];
45
+ activities?: AuditLogEntry[];
46
+ /** Override comments (e.g. enriched from a separate API) */
47
+ enrichedComments?: Comment[] | null;
48
+ /** Client portal mode: hides staff-only tabs/fields */
49
+ clientMode?: boolean;
50
+ /** Fields the client can edit (only used when clientMode=true) */
51
+ clientEditableFields?: string[];
52
+ onTitleUpdate?: (title: string) => void;
53
+ onPropertyUpdate?: (field: string, value: unknown) => void;
54
+ onAssign?: (userId: string) => void;
55
+ onUnassign?: (userId: string) => void;
56
+ onCreateSubtask?: (title: string) => void;
57
+ onToggleSubtask?: (taskId: string, isComplete: boolean) => void;
58
+ onRequestReview?: (reviewerId: string) => void;
59
+ onUpdateReviewStatus?: (reviewId: string, status: string, feedback?: string) => void;
60
+ onPostComment?: (content: string, authorType: 'INTERNAL' | 'CLIENT') => void;
61
+ onUploadFile?: (file: File, title?: string) => void;
62
+ onDeleteFile?: (fileId: string) => void;
63
+ onTabChange?: (tab: string) => void;
64
+ /** Optional render props for rich text editor/viewer in comments */
65
+ renderEditor?: (props: {
66
+ content: string;
67
+ onChange: (content: string) => void;
68
+ placeholder: string;
69
+ }) => React.ReactNode;
70
+ renderViewer?: (props: {
71
+ content: string;
72
+ className?: string;
73
+ }) => React.ReactNode;
74
+ /** Optional priority indicator component */
75
+ renderPriorityIndicator?: (props: {
76
+ priority: string;
77
+ }) => React.ReactNode;
78
+ /** Optional date picker component */
79
+ renderDatePicker?: (props: {
80
+ value: Date | null;
81
+ onChange: (date: Date | null) => void;
82
+ placeholder: string;
83
+ className?: string;
84
+ }) => React.ReactNode;
85
+ isUploading?: boolean;
86
+ }
87
+ declare function TaskDetailPanel({ task, loading, open, onOpenChange, columns, members, activities, enrichedComments, clientMode, clientEditableFields, onTitleUpdate, onPropertyUpdate, onAssign, onUnassign, onCreateSubtask, onToggleSubtask, onRequestReview, onUpdateReviewStatus, onPostComment, onUploadFile, onDeleteFile, onTabChange, renderEditor, renderViewer, renderPriorityIndicator, renderDatePicker, isUploading, }: TaskDetailPanelProps): import("react/jsx-runtime").JSX.Element;
88
+ declare namespace TaskDetailPanel {
89
+ var displayName: string;
90
+ }
91
+ export { TaskDetailPanel };
92
+ export type { TaskDetailPanelProps };
93
+ //# sourceMappingURL=task-detail-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-detail-panel.d.ts","sourceRoot":"","sources":["../../src/tasks/task-detail-panel.tsx"],"names":[],"mappings":"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"}