@devalok/shilp-sutra-karm 0.18.0 → 0.19.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/_chunks/task-detail-panel.js +1339 -1144
- package/dist/tasks/activity-tab.d.ts +2 -11
- package/dist/tasks/activity-tab.d.ts.map +1 -1
- package/dist/tasks/conversation-tab.d.ts +2 -21
- package/dist/tasks/conversation-tab.d.ts.map +1 -1
- package/dist/tasks/files-tab.d.ts +2 -18
- package/dist/tasks/files-tab.d.ts.map +1 -1
- package/dist/tasks/index.d.ts +12 -6
- package/dist/tasks/index.d.ts.map +1 -1
- package/dist/tasks/index.js +765 -8
- package/dist/tasks/pickers/index.d.ts +16 -0
- package/dist/tasks/pickers/index.d.ts.map +1 -0
- package/dist/tasks/pickers/task-assignee-picker.d.ts +14 -0
- package/dist/tasks/pickers/task-assignee-picker.d.ts.map +1 -0
- package/dist/tasks/pickers/task-column-picker.d.ts +13 -0
- package/dist/tasks/pickers/task-column-picker.d.ts.map +1 -0
- package/dist/tasks/pickers/task-date-picker.d.ts +12 -0
- package/dist/tasks/pickers/task-date-picker.d.ts.map +1 -0
- package/dist/tasks/pickers/task-label-editor.d.ts +13 -0
- package/dist/tasks/pickers/task-label-editor.d.ts.map +1 -0
- package/dist/tasks/pickers/task-member-picker.d.ts +14 -0
- package/dist/tasks/pickers/task-member-picker.d.ts.map +1 -0
- package/dist/tasks/pickers/task-priority-picker.d.ts +12 -0
- package/dist/tasks/pickers/task-priority-picker.d.ts.map +1 -0
- package/dist/tasks/pickers/task-visibility-picker.d.ts +13 -0
- package/dist/tasks/pickers/task-visibility-picker.d.ts.map +1 -0
- package/dist/tasks/review-tab.d.ts +4 -20
- package/dist/tasks/review-tab.d.ts.map +1 -1
- package/dist/tasks/subtasks-tab.d.ts +2 -18
- package/dist/tasks/subtasks-tab.d.ts.map +1 -1
- package/dist/tasks/tabs/activity-entry.d.ts +9 -0
- package/dist/tasks/tabs/activity-entry.d.ts.map +1 -0
- package/dist/tasks/tabs/activity-timeline.d.ts +8 -0
- package/dist/tasks/tabs/activity-timeline.d.ts.map +1 -0
- package/dist/tasks/tabs/file-drop-zone.d.ts +10 -0
- package/dist/tasks/tabs/file-drop-zone.d.ts.map +1 -0
- package/dist/tasks/tabs/file-item.d.ts +11 -0
- package/dist/tasks/tabs/file-item.d.ts.map +1 -0
- package/dist/tasks/tabs/file-list.d.ts +8 -0
- package/dist/tasks/tabs/file-list.d.ts.map +1 -0
- package/dist/tasks/tabs/index.d.ts +34 -0
- package/dist/tasks/tabs/index.d.ts.map +1 -0
- package/dist/tasks/tabs/message-bubble.d.ts +14 -0
- package/dist/tasks/tabs/message-bubble.d.ts.map +1 -0
- package/dist/tasks/tabs/message-input.d.ts +16 -0
- package/dist/tasks/tabs/message-input.d.ts.map +1 -0
- package/dist/tasks/tabs/message-list.d.ts +9 -0
- package/dist/tasks/tabs/message-list.d.ts.map +1 -0
- package/dist/tasks/tabs/review-card.d.ts +10 -0
- package/dist/tasks/tabs/review-card.d.ts.map +1 -0
- package/dist/tasks/tabs/review-request-button.d.ts +10 -0
- package/dist/tasks/tabs/review-request-button.d.ts.map +1 -0
- package/dist/tasks/tabs/review-response-form.d.ts +11 -0
- package/dist/tasks/tabs/review-response-form.d.ts.map +1 -0
- package/dist/tasks/tabs/subtask-add-form.d.ts +9 -0
- package/dist/tasks/tabs/subtask-add-form.d.ts.map +1 -0
- package/dist/tasks/tabs/subtask-item.d.ts +12 -0
- package/dist/tasks/tabs/subtask-item.d.ts.map +1 -0
- package/dist/tasks/tabs/subtask-list.d.ts +8 -0
- package/dist/tasks/tabs/subtask-list.d.ts.map +1 -0
- package/dist/tasks/tabs/subtask-progress.d.ts +9 -0
- package/dist/tasks/tabs/subtask-progress.d.ts.map +1 -0
- package/dist/tasks/tabs/visibility-warning.d.ts +7 -0
- package/dist/tasks/tabs/visibility-warning.d.ts.map +1 -0
- package/dist/tasks/task-panel.d.ts +104 -0
- package/dist/tasks/task-panel.d.ts.map +1 -0
- package/dist/tasks/task-properties.d.ts +2 -12
- package/dist/tasks/task-properties.d.ts.map +1 -1
- package/dist/tasks/task-types.d.ts +104 -0
- package/dist/tasks/task-types.d.ts.map +1 -0
- package/docs/components/admin/admin-dashboard.md +215 -0
- package/docs/components/admin/admin-types.md +167 -0
- package/docs/components/admin/admin-utils.md +165 -0
- package/docs/components/admin/break-admin.md +167 -0
- package/docs/components/board/board-column.md +35 -0
- package/docs/components/board/board-provider.md +89 -0
- package/docs/components/board/board-toolbar.md +36 -0
- package/docs/components/board/board-types.md +62 -0
- package/docs/components/board/bulk-action-bar.md +38 -0
- package/docs/components/board/column-empty.md +33 -0
- package/docs/components/board/column-header.md +36 -0
- package/docs/components/board/kanban-board.md +53 -0
- package/docs/components/board/task-card.md +62 -0
- package/docs/components/board/task-context-menu.md +36 -0
- package/docs/components/chat/chat-input.md +37 -0
- package/docs/components/chat/chat-panel.md +58 -0
- package/docs/components/chat/conversation-list.md +47 -0
- package/docs/components/chat/message-list.md +44 -0
- package/docs/components/chat/streaming-text.md +29 -0
- package/docs/components/client/accent-provider.md +29 -0
- package/docs/components/client/client-portal-header.md +40 -0
- package/docs/components/client/project-card.md +39 -0
- package/docs/components/dashboard/attendance-cta.md +47 -0
- package/docs/components/dashboard/daily-brief.md +45 -0
- package/docs/components/dashboard/scratchpad-widget.md +52 -0
- package/docs/components/dashboard/sidebar-scratchpad.md +39 -0
- package/docs/components/other/karm-command-registry.md +61 -0
- package/docs/components/other/page-skeletons.md +52 -0
- package/docs/components/tasks/activity-tab.md +45 -0
- package/docs/components/tasks/conversation-tab.md +56 -0
- package/docs/components/tasks/files-tab.md +55 -0
- package/docs/components/tasks/review-tab.md +53 -0
- package/docs/components/tasks/subtasks-tab.md +61 -0
- package/docs/components/tasks/task-assignee-picker.md +36 -0
- package/docs/components/tasks/task-column-picker.md +37 -0
- package/docs/components/tasks/task-date-picker.md +49 -0
- package/docs/components/tasks/task-detail-panel.md +275 -0
- package/docs/components/tasks/task-label-editor.md +42 -0
- package/docs/components/tasks/task-member-picker.md +35 -0
- package/docs/components/tasks/task-panel.md +89 -0
- package/docs/components/tasks/task-priority-picker.md +37 -0
- package/docs/components/tasks/task-properties.md +84 -0
- package/docs/components/tasks/task-visibility-picker.md +38 -0
- package/llms.txt +40 -13
- package/package.json +82 -80
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
interface TaskPanelTabProps {
|
|
4
|
+
/** Unique tab identifier */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Optional icon rendered in the tab trigger */
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
|
+
/** Tab trigger label */
|
|
9
|
+
label: string;
|
|
10
|
+
/** Tab panel content */
|
|
11
|
+
children: React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Declarative tab definition for TaskPanel.Tabs.
|
|
15
|
+
* Does not render anything on its own — TaskPanelTabs extracts props from these children.
|
|
16
|
+
*/
|
|
17
|
+
declare function TaskPanelTab(_props: TaskPanelTabProps): React.ReactElement | null;
|
|
18
|
+
declare namespace TaskPanelTab {
|
|
19
|
+
var displayName: string;
|
|
20
|
+
}
|
|
21
|
+
interface TaskPanelRootProps {
|
|
22
|
+
children: React.ReactNode;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
declare function TaskPanelRoot({ children, className }: TaskPanelRootProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
declare namespace TaskPanelRoot {
|
|
27
|
+
var displayName: string;
|
|
28
|
+
}
|
|
29
|
+
interface TaskPanelHeaderProps {
|
|
30
|
+
children: React.ReactNode;
|
|
31
|
+
className?: string;
|
|
32
|
+
}
|
|
33
|
+
declare function TaskPanelHeader({ children, className }: TaskPanelHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
declare namespace TaskPanelHeader {
|
|
35
|
+
var displayName: string;
|
|
36
|
+
}
|
|
37
|
+
interface TaskPanelTitleProps {
|
|
38
|
+
/** Current title value */
|
|
39
|
+
value: string;
|
|
40
|
+
/** Whether the title can be edited inline */
|
|
41
|
+
editable?: boolean;
|
|
42
|
+
/** Called when the user commits a title change */
|
|
43
|
+
onUpdate?: (title: string) => void;
|
|
44
|
+
/** When true, shows a small "Subtask" label above the title */
|
|
45
|
+
subtask?: boolean;
|
|
46
|
+
className?: string;
|
|
47
|
+
}
|
|
48
|
+
declare function TaskPanelTitle({ value, editable, onUpdate, subtask, className, }: TaskPanelTitleProps): import("react/jsx-runtime").JSX.Element;
|
|
49
|
+
declare namespace TaskPanelTitle {
|
|
50
|
+
var displayName: string;
|
|
51
|
+
}
|
|
52
|
+
interface TaskPanelPropertiesProps {
|
|
53
|
+
children: React.ReactNode;
|
|
54
|
+
className?: string;
|
|
55
|
+
}
|
|
56
|
+
declare function TaskPanelProperties({ children, className }: TaskPanelPropertiesProps): import("react/jsx-runtime").JSX.Element;
|
|
57
|
+
declare namespace TaskPanelProperties {
|
|
58
|
+
var displayName: string;
|
|
59
|
+
}
|
|
60
|
+
interface TaskPanelPropertyProps {
|
|
61
|
+
/** Icon element rendered at the start of the label area */
|
|
62
|
+
icon: React.ReactNode;
|
|
63
|
+
/** Human-readable property label */
|
|
64
|
+
label: string;
|
|
65
|
+
/** Property value / control */
|
|
66
|
+
children: React.ReactNode;
|
|
67
|
+
className?: string;
|
|
68
|
+
}
|
|
69
|
+
declare function TaskPanelProperty({ icon, label, children, className }: TaskPanelPropertyProps): import("react/jsx-runtime").JSX.Element;
|
|
70
|
+
declare namespace TaskPanelProperty {
|
|
71
|
+
var displayName: string;
|
|
72
|
+
}
|
|
73
|
+
interface TaskPanelTabsProps {
|
|
74
|
+
/** Default active tab id */
|
|
75
|
+
defaultTab: string;
|
|
76
|
+
/** Called when the active tab changes */
|
|
77
|
+
onTabChange?: (tab: string) => void;
|
|
78
|
+
/** Must contain TaskPanel.Tab children */
|
|
79
|
+
children: React.ReactNode;
|
|
80
|
+
className?: string;
|
|
81
|
+
}
|
|
82
|
+
declare function TaskPanelTabs({ defaultTab, onTabChange, children, className, }: TaskPanelTabsProps): import("react/jsx-runtime").JSX.Element;
|
|
83
|
+
declare namespace TaskPanelTabs {
|
|
84
|
+
var displayName: string;
|
|
85
|
+
}
|
|
86
|
+
interface TaskPanelLoadingProps {
|
|
87
|
+
className?: string;
|
|
88
|
+
}
|
|
89
|
+
declare function TaskPanelLoading({ className }: TaskPanelLoadingProps): import("react/jsx-runtime").JSX.Element;
|
|
90
|
+
declare namespace TaskPanelLoading {
|
|
91
|
+
var displayName: string;
|
|
92
|
+
}
|
|
93
|
+
declare const TaskPanel: typeof TaskPanelRoot & {
|
|
94
|
+
Header: typeof TaskPanelHeader;
|
|
95
|
+
Title: typeof TaskPanelTitle;
|
|
96
|
+
Properties: typeof TaskPanelProperties;
|
|
97
|
+
Property: typeof TaskPanelProperty;
|
|
98
|
+
Tabs: typeof TaskPanelTabs;
|
|
99
|
+
Tab: typeof TaskPanelTab;
|
|
100
|
+
Loading: typeof TaskPanelLoading;
|
|
101
|
+
};
|
|
102
|
+
export { TaskPanel };
|
|
103
|
+
export type { TaskPanelRootProps, TaskPanelHeaderProps, TaskPanelTitleProps, TaskPanelPropertiesProps, TaskPanelPropertyProps, TaskPanelTabsProps, TaskPanelTabProps, TaskPanelLoadingProps, };
|
|
104
|
+
//# sourceMappingURL=task-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-panel.d.ts","sourceRoot":"","sources":["../../src/tasks/task-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,UAAU,iBAAiB;IACzB,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,gDAAgD;IAChD,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,wBAAwB;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;;GAGG;AACH,iBAAS,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAE1E;kBAFQ,YAAY;;;AAarB,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,iBAAS,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CAMjE;kBANQ,aAAa;;;AActB,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,iBAAS,eAAe,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAWrE;kBAXQ,eAAe;;;AAmBxB,UAAU,mBAAmB;IAC3B,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,iBAAS,cAAc,CAAC,EACtB,KAAK,EACL,QAAgB,EAChB,QAAQ,EACR,OAAe,EACf,SAAS,GACV,EAAE,mBAAmB,2CA2ErB;kBAjFQ,cAAc;;;AAyFvB,UAAU,wBAAwB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,iBAAS,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,wBAAwB,2CAW7E;kBAXQ,mBAAmB;;;AAmB5B,UAAU,sBAAsB;IAC9B,2DAA2D;IAC3D,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;IACrB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,iBAAS,iBAAiB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAUtF;kBAVQ,iBAAiB;;;AAkB1B,UAAU,kBAAkB;IAC1B,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,yCAAyC;IACzC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,0CAA0C;IAC1C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,iBAAS,aAAa,CAAC,EACrB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,GACV,EAAE,kBAAkB,2CAmDpB;kBAxDQ,aAAa;;;AAgEtB,UAAU,qBAAqB;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,EAAE,qBAAqB,2CAwB7D;kBAxBQ,gBAAgB;;;AAgCzB,QAAA,MAAM,SAAS;;;;;;;;CAQb,CAAA;AAEF,OAAO,EAAE,SAAS,EAAE,CAAA;AACpB,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GACtB,CAAA"}
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { Member, Column } from './task-types';
|
|
2
3
|
import * as React from 'react';
|
|
3
|
-
export
|
|
4
|
-
id: string;
|
|
5
|
-
name: string;
|
|
6
|
-
email?: string;
|
|
7
|
-
image?: string | null;
|
|
8
|
-
}
|
|
9
|
-
export interface Column {
|
|
10
|
-
id: string;
|
|
11
|
-
name: string;
|
|
12
|
-
isDefault?: boolean;
|
|
13
|
-
isTerminal?: boolean;
|
|
14
|
-
}
|
|
4
|
+
export type { Member, Column };
|
|
15
5
|
interface TaskData {
|
|
16
6
|
id: string;
|
|
17
7
|
columnId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-properties.d.ts","sourceRoot":"","sources":["../../src/tasks/task-properties.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"task-properties.d.ts","sourceRoot":"","sources":["../../src/tasks/task-properties.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA6B9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAClD,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AAM9B,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC7B,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAA;IAC9C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,UAAU,GAAG,UAAU,CAAA;CACpC;AAED,UAAU,mBAAoB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACxE,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACjD,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,uEAAuE;IACvE,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAA;IAC1E,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE;QACzB,KAAK,EAAE,IAAI,GAAG,IAAI,CAAA;QAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAA;QACrC,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,KAAK,KAAK,CAAC,SAAS,CAAA;IACrB,gGAAgG;IAChG,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAA;CACvC;AA0DD,QAAA,MAAM,cAAc,4FAoXnB,CAAA;AAID,OAAO,EAAE,cAAc,EAAE,CAAA;AACzB,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAA"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
export type Priority = 'LOW' | 'MEDIUM' | 'HIGH' | 'URGENT';
|
|
3
|
+
export type Visibility = 'INTERNAL' | 'EVERYONE';
|
|
4
|
+
export type CommentAuthorType = 'INTERNAL' | 'CLIENT';
|
|
5
|
+
export interface LabelOption {
|
|
6
|
+
name: string;
|
|
7
|
+
color?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Member {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
email?: string;
|
|
13
|
+
image?: string | null;
|
|
14
|
+
}
|
|
15
|
+
export interface Column {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
isDefault?: boolean;
|
|
19
|
+
isTerminal?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface Subtask {
|
|
22
|
+
id: string;
|
|
23
|
+
title: string;
|
|
24
|
+
priority: Priority;
|
|
25
|
+
columnId: string;
|
|
26
|
+
column?: {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
isTerminal?: boolean;
|
|
30
|
+
};
|
|
31
|
+
assignees: {
|
|
32
|
+
user: {
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
image?: string | null;
|
|
36
|
+
};
|
|
37
|
+
}[];
|
|
38
|
+
}
|
|
39
|
+
export interface ReviewUser {
|
|
40
|
+
id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
image: string | null;
|
|
43
|
+
}
|
|
44
|
+
export interface ReviewRequest {
|
|
45
|
+
id: string;
|
|
46
|
+
taskId: string;
|
|
47
|
+
status: 'PENDING' | 'APPROVED' | 'CHANGES_REQUESTED' | 'REJECTED';
|
|
48
|
+
feedback: string | null;
|
|
49
|
+
requestedBy: ReviewUser;
|
|
50
|
+
reviewer: ReviewUser;
|
|
51
|
+
createdAt: string;
|
|
52
|
+
updatedAt: string;
|
|
53
|
+
}
|
|
54
|
+
export interface CommentAuthor {
|
|
55
|
+
id: string;
|
|
56
|
+
name: string;
|
|
57
|
+
email?: string;
|
|
58
|
+
image?: string | null;
|
|
59
|
+
}
|
|
60
|
+
export interface Comment {
|
|
61
|
+
id: string;
|
|
62
|
+
taskId: string;
|
|
63
|
+
authorType: CommentAuthorType;
|
|
64
|
+
authorId: string;
|
|
65
|
+
content: string;
|
|
66
|
+
createdAt: string;
|
|
67
|
+
updatedAt: string;
|
|
68
|
+
internalAuthor?: CommentAuthor | null;
|
|
69
|
+
clientAuthor?: {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
email: string;
|
|
73
|
+
} | null;
|
|
74
|
+
}
|
|
75
|
+
export interface TaskFile {
|
|
76
|
+
id: string;
|
|
77
|
+
taskId: string;
|
|
78
|
+
title: string;
|
|
79
|
+
fileUrl: string;
|
|
80
|
+
downloadUrl?: string;
|
|
81
|
+
fileType: string | null;
|
|
82
|
+
uploadedBy: {
|
|
83
|
+
id: string;
|
|
84
|
+
name: string;
|
|
85
|
+
image: string | null;
|
|
86
|
+
};
|
|
87
|
+
createdAt: string;
|
|
88
|
+
/** External link (e.g. Google Drive) displayed alongside the download button */
|
|
89
|
+
externalUrl?: string;
|
|
90
|
+
/** Label for the external link tooltip (default: "Open externally") */
|
|
91
|
+
externalLabel?: string;
|
|
92
|
+
}
|
|
93
|
+
export interface AuditLogEntry {
|
|
94
|
+
id: string;
|
|
95
|
+
timestamp: string;
|
|
96
|
+
actorType: 'USER' | 'CLIENT' | 'SYSTEM' | 'AGENT';
|
|
97
|
+
actorId: string | null;
|
|
98
|
+
action: string;
|
|
99
|
+
entityType: string;
|
|
100
|
+
entityId: string;
|
|
101
|
+
projectId: string | null;
|
|
102
|
+
metadata: Record<string, unknown> | null;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=task-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-types.d.ts","sourceRoot":"","sources":["../../src/tasks/task-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# AdminDashboard
|
|
2
|
+
|
|
3
|
+
- Import: @devalok/shilp-sutra-karm/admin
|
|
4
|
+
- Server-safe: No
|
|
5
|
+
- Category: admin
|
|
6
|
+
|
|
7
|
+
Compound component for the admin attendance dashboard. Uses React Context internally.
|
|
8
|
+
All sub-components must be rendered inside `<AdminDashboard.Root>`.
|
|
9
|
+
|
|
10
|
+
Exports: AdminDashboard (compound), AdminDashboard.Content, AdminDashboardSkeleton, Calendar, BreakRequestCard, LeaveRequests, DashboardHeader, AttendanceOverview, AssociateDetail, CorrectionList, RenderDate
|
|
11
|
+
|
|
12
|
+
## Props
|
|
13
|
+
|
|
14
|
+
### AdminDashboard.Root (AdminDashboardRootProps)
|
|
15
|
+
currentUserId: string (REQUIRED)
|
|
16
|
+
currentUserRole: UserRole (REQUIRED)
|
|
17
|
+
currentUser?: AdminUser
|
|
18
|
+
assetsBaseUrl: string (default: "")
|
|
19
|
+
userImages: Record<string, string> (default: {})
|
|
20
|
+
isLoading: boolean (default: false)
|
|
21
|
+
onAssociateChange: (user: AdminUser | null) => void
|
|
22
|
+
children: ReactNode (REQUIRED)
|
|
23
|
+
...HTMLDivElement attributes (className, etc.)
|
|
24
|
+
|
|
25
|
+
### AdminDashboard.Calendar (AdminDashboardCalendarProps)
|
|
26
|
+
dateAttendanceMap: Map<string, DateAttendanceInfo> | null (default: null)
|
|
27
|
+
onDateChange: (date: string) => void
|
|
28
|
+
onTimeFrameChange: (timeFrame: string) => void
|
|
29
|
+
users: AdminUser[] (default: [])
|
|
30
|
+
selectedUserAttendance: AttendanceRecord | null (default: null)
|
|
31
|
+
...HTMLDivElement attributes
|
|
32
|
+
|
|
33
|
+
### AdminDashboard.AttendanceOverview (AdminDashboardAttendanceOverviewProps)
|
|
34
|
+
groupedAttendance?: GroupedAttendance | null (default: null)
|
|
35
|
+
users?: AdminUser[] (default: [])
|
|
36
|
+
...HTMLDivElement attributes
|
|
37
|
+
|
|
38
|
+
### AdminDashboard.AssociateDetail (AdminDashboardAssociateDetailProps)
|
|
39
|
+
attendance: AttendanceRecord | null (default: null)
|
|
40
|
+
tasks: TaskItem[] (default: [])
|
|
41
|
+
breakRequest: BreakRequest | null (default: null)
|
|
42
|
+
onUpdateAttendanceStatus: (params: { userId: string; date: string; isPresent: boolean }) => void | Promise<void>
|
|
43
|
+
onToggleTaskStatus: (taskId: string, newStatus: string) => void | Promise<void>
|
|
44
|
+
onAddTask: (title: string, assigneeId: string) => void | Promise<void>
|
|
45
|
+
onReorderTasks: (draggedTaskId: string, targetTaskId: string) => void | Promise<void>
|
|
46
|
+
onCancelBreak: (params: { requestId: string; deleteSingleDay: boolean; dateToCancel: string | Date; userId: string }) => void | Promise<void>
|
|
47
|
+
onRefreshSelectedUserAttendance: () => void | Promise<void>
|
|
48
|
+
onRefreshAttendanceData: () => void | Promise<void>
|
|
49
|
+
...HTMLDivElement attributes
|
|
50
|
+
|
|
51
|
+
### AdminDashboard.LeaveRequests (AdminDashboardLeaveRequestsProps)
|
|
52
|
+
requests?: BreakRequest[] (default: [])
|
|
53
|
+
corrections?: AttendanceCorrection[] (default: [])
|
|
54
|
+
onApproveBreak: (params: { requestId: string; adminComment: string; userId: string }) => void | Promise<void>
|
|
55
|
+
onRejectBreak: (params: { requestId: string; adminComment: string; userId: string }) => void | Promise<void>
|
|
56
|
+
onApproveCorrection: (correctionId: string) => void | Promise<void>
|
|
57
|
+
onRejectCorrection: (correctionId: string) => void | Promise<void>
|
|
58
|
+
...HTMLDivElement attributes
|
|
59
|
+
|
|
60
|
+
### AdminDashboard.Content (AdminDashboardContentProps)
|
|
61
|
+
children: ReactNode (REQUIRED)
|
|
62
|
+
...HTMLDivElement attributes
|
|
63
|
+
|
|
64
|
+
### Calendar (CalendarProps) — standalone
|
|
65
|
+
onDateSelect: (date: Date) => void (REQUIRED)
|
|
66
|
+
hasCorrection: (date: Date) => boolean
|
|
67
|
+
...HTMLDivElement attributes
|
|
68
|
+
|
|
69
|
+
### BreakRequestCard (BreakRequestProps) — standalone
|
|
70
|
+
selectedDate: string | Date (REQUIRED)
|
|
71
|
+
userId: string (REQUIRED)
|
|
72
|
+
breakRequest: BreakRequest | null
|
|
73
|
+
assetsBaseUrl: string
|
|
74
|
+
onCancelBreak: (params: { requestId: string; deleteSingleDay: boolean; dateToCancel: string | Date; userId: string }) => void | Promise<void>
|
|
75
|
+
onRefreshAttendance: () => void | Promise<void>
|
|
76
|
+
onRefreshGroupedAttendance: () => void | Promise<void>
|
|
77
|
+
...HTMLDivElement attributes
|
|
78
|
+
|
|
79
|
+
### LeaveRequests (LeaveRequestsProps) — standalone
|
|
80
|
+
requests: BreakRequest[] (REQUIRED)
|
|
81
|
+
currentUserId: string (REQUIRED)
|
|
82
|
+
userImages: Record<string, string>
|
|
83
|
+
activeTimeFrame: string
|
|
84
|
+
onApproveBreak: (params: { requestId: string; adminComment: string; userId: string }) => void | Promise<void>
|
|
85
|
+
onRejectBreak: (params: { requestId: string; adminComment: string; userId: string }) => void | Promise<void>
|
|
86
|
+
...HTMLDivElement attributes
|
|
87
|
+
|
|
88
|
+
### DashboardHeader (DashboardHeaderProps) — standalone
|
|
89
|
+
selectedMonth: string (REQUIRED)
|
|
90
|
+
yearsList: string[] (REQUIRED)
|
|
91
|
+
isTodaySelected: boolean (REQUIRED)
|
|
92
|
+
selectedAssociate: AdminUser | null (REQUIRED)
|
|
93
|
+
users: AdminUser[] (REQUIRED)
|
|
94
|
+
userImages: Record<string, string> (REQUIRED)
|
|
95
|
+
activeTimeFrame: string (REQUIRED)
|
|
96
|
+
onMonthSelection: (monthYear: string) => void (REQUIRED)
|
|
97
|
+
onTodayClick: () => void (REQUIRED)
|
|
98
|
+
onSelectAssociate: (user: AdminUser | null) => void (REQUIRED)
|
|
99
|
+
onTimeFrameChange: (id: string) => void (REQUIRED)
|
|
100
|
+
onDateChange: (direction: "prev" | "next") => void (REQUIRED)
|
|
101
|
+
...HTMLDivElement attributes
|
|
102
|
+
|
|
103
|
+
### AttendanceOverview (AttendanceOverviewProps) — standalone
|
|
104
|
+
isFutureDate: boolean (REQUIRED)
|
|
105
|
+
users: AdminUser[] (REQUIRED)
|
|
106
|
+
groupedAttendance: GroupedAttendance | null (REQUIRED)
|
|
107
|
+
userImages: Record<string, string> (REQUIRED)
|
|
108
|
+
selectedDate: string (REQUIRED)
|
|
109
|
+
...HTMLDivElement attributes
|
|
110
|
+
|
|
111
|
+
### AssociateDetail (AssociateDetailProps) — standalone
|
|
112
|
+
selectedAssociate: AdminUser (REQUIRED)
|
|
113
|
+
selectedDate: string (REQUIRED)
|
|
114
|
+
selectedUserAttendance: AttendanceRecord | null (REQUIRED)
|
|
115
|
+
userTasks: TaskItem[] (REQUIRED)
|
|
116
|
+
selectedBreakRequest: BreakRequest | null (REQUIRED)
|
|
117
|
+
isFutureDate: boolean (REQUIRED)
|
|
118
|
+
assetsBaseUrl: string (REQUIRED)
|
|
119
|
+
onUpdateAttendanceStatus: (params: { userId: string; date: string; isPresent: boolean }) => void | Promise<void>
|
|
120
|
+
onToggleTaskStatus: (taskId: string, newStatus: string) => void | Promise<void>
|
|
121
|
+
onAddTask: (title: string, assigneeId: string) => void | Promise<void>
|
|
122
|
+
onReorderTasks: (draggedTaskId: string, targetTaskId: string) => void | Promise<void>
|
|
123
|
+
onCancelBreak: (params: { requestId: string; deleteSingleDay: boolean; dateToCancel: string | Date; userId: string }) => void | Promise<void>
|
|
124
|
+
onRefreshSelectedUserAttendance: () => void | Promise<void>
|
|
125
|
+
onRefreshAttendanceData: () => void | Promise<void>
|
|
126
|
+
...HTMLDivElement attributes
|
|
127
|
+
|
|
128
|
+
### CorrectionList (CorrectionListProps) — standalone
|
|
129
|
+
corrections: AttendanceCorrection[] (REQUIRED)
|
|
130
|
+
currentUserId: string (REQUIRED)
|
|
131
|
+
userImages: Record<string, string> (REQUIRED)
|
|
132
|
+
assetsBaseUrl: string (REQUIRED)
|
|
133
|
+
activeTimeFrame: string (REQUIRED)
|
|
134
|
+
onApproveCorrection: (correctionId: string) => void | Promise<void>
|
|
135
|
+
onRejectCorrection: (correctionId: string) => void | Promise<void>
|
|
136
|
+
...HTMLDivElement attributes
|
|
137
|
+
|
|
138
|
+
### RenderDate (RenderDateProps) — standalone
|
|
139
|
+
day: DayInfo (REQUIRED)
|
|
140
|
+
isAdmin: boolean (REQUIRED)
|
|
141
|
+
selectedDate: string | Date (REQUIRED)
|
|
142
|
+
dateAttendanceMap: Map<string, DateAttendanceInfo> | null (REQUIRED)
|
|
143
|
+
activeTimeFrame: string (REQUIRED)
|
|
144
|
+
...HTMLDivElement attributes
|
|
145
|
+
|
|
146
|
+
### AdminDashboardSkeleton (DashboardSkeleton)
|
|
147
|
+
...HTMLDivElement attributes (className, etc.)
|
|
148
|
+
|
|
149
|
+
## Supporting Types
|
|
150
|
+
TaskItem: { id: string; title: string; status: string; assigneeIds?: string; priority?: string }
|
|
151
|
+
AttendanceCorrection: { id: string; date: string; reason?: string; requestedDate?: string; correctionStatus: CorrectionStatus; user?: AdminUser }
|
|
152
|
+
DateAttendanceInfo: { status: AttendanceStatus | null; hasCorrectionOrApproval?: boolean; isBreakApproved?: boolean }
|
|
153
|
+
|
|
154
|
+
## Defaults
|
|
155
|
+
assetsBaseUrl="", userImages={}, isLoading=false
|
|
156
|
+
|
|
157
|
+
## Example
|
|
158
|
+
```jsx
|
|
159
|
+
<AdminDashboard.Root
|
|
160
|
+
currentUserId="user-1"
|
|
161
|
+
currentUserRole="Admin"
|
|
162
|
+
currentUser={currentUser}
|
|
163
|
+
assetsBaseUrl="/assets"
|
|
164
|
+
userImages={userImageMap}
|
|
165
|
+
isLoading={isLoading}
|
|
166
|
+
onAssociateChange={(user) => setSelected(user)}
|
|
167
|
+
>
|
|
168
|
+
<AdminDashboard.Calendar
|
|
169
|
+
dateAttendanceMap={dateMap}
|
|
170
|
+
onDateChange={handleDateChange}
|
|
171
|
+
onTimeFrameChange={handleTimeFrameChange}
|
|
172
|
+
users={allUsers}
|
|
173
|
+
selectedUserAttendance={attendance}
|
|
174
|
+
/>
|
|
175
|
+
<AdminDashboard.Content>
|
|
176
|
+
<AdminDashboard.AttendanceOverview
|
|
177
|
+
groupedAttendance={grouped}
|
|
178
|
+
users={allUsers}
|
|
179
|
+
/>
|
|
180
|
+
<AdminDashboard.AssociateDetail
|
|
181
|
+
attendance={selectedAttendance}
|
|
182
|
+
tasks={tasks}
|
|
183
|
+
breakRequest={breakReq}
|
|
184
|
+
onUpdateAttendanceStatus={handleUpdateStatus}
|
|
185
|
+
onToggleTaskStatus={handleToggleTask}
|
|
186
|
+
onAddTask={handleAddTask}
|
|
187
|
+
/>
|
|
188
|
+
<AdminDashboard.LeaveRequests
|
|
189
|
+
requests={pendingRequests}
|
|
190
|
+
corrections={corrections}
|
|
191
|
+
onApproveBreak={handleApproveBreak}
|
|
192
|
+
onRejectBreak={handleRejectBreak}
|
|
193
|
+
onApproveCorrection={handleApproveCorrection}
|
|
194
|
+
onRejectCorrection={handleRejectCorrection}
|
|
195
|
+
/>
|
|
196
|
+
</AdminDashboard.Content>
|
|
197
|
+
</AdminDashboard.Root>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Gotchas
|
|
201
|
+
- All sub-components must be inside `<AdminDashboard.Root>` or they throw a context error
|
|
202
|
+
- `AdminDashboard.AttendanceOverview` only renders when NO associate is selected
|
|
203
|
+
- `AdminDashboard.AssociateDetail` only renders when an associate IS selected
|
|
204
|
+
- `AdminDashboard.LeaveRequests` auto-hides when there are zero requests AND zero pending corrections
|
|
205
|
+
- `AdminDashboard.LeaveRequests` auto-switches tabs when new requests arrive
|
|
206
|
+
- The `Calendar` standalone export is a simpler calendar without the compound context — use it for non-admin pages
|
|
207
|
+
- `BreakRequestCard` standalone export displays a single break with cancel dialog — used inside AssociateDetail internally
|
|
208
|
+
- Date callbacks fire ISO-formatted strings via `format(date, "yyyy-MM-dd'T'HH:mm:ssxxx")`
|
|
209
|
+
- `isLoading=true` on Root renders `DashboardSkeleton` instead of children
|
|
210
|
+
|
|
211
|
+
## Changes
|
|
212
|
+
### v0.9.0
|
|
213
|
+
- **Added** Compound component API replacing 29-prop monolith (BREAKING)
|
|
214
|
+
- **Added** AdminDashboard.Content wrapper for rounded-corner management
|
|
215
|
+
- **Added** Standalone exports for Calendar, BreakRequestCard, LeaveRequests, DashboardHeader, AttendanceOverview, AssociateDetail, CorrectionList, RenderDate
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Admin Types
|
|
2
|
+
|
|
3
|
+
- Import: @devalok/shilp-sutra-karm/admin
|
|
4
|
+
- Server-safe: Yes
|
|
5
|
+
- Category: admin
|
|
6
|
+
|
|
7
|
+
Type-only exports for the admin module. No runtime code.
|
|
8
|
+
|
|
9
|
+
## Types
|
|
10
|
+
|
|
11
|
+
### UserRole
|
|
12
|
+
```ts
|
|
13
|
+
type UserRole = 'Apprentice' | 'Associate' | 'Admin' | 'SuperAdmin'
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### AttendanceStatus
|
|
17
|
+
```ts
|
|
18
|
+
type AttendanceStatus = 'PRESENT' | 'ABSENT' | 'BREAK' | 'Not_Marked' | 'HOLIDAY' | 'WEEKEND'
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### CorrectionStatus
|
|
22
|
+
```ts
|
|
23
|
+
type CorrectionStatus = 'PENDING' | 'APPROVED' | 'REJECTED'
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### BreakRequestStatus
|
|
27
|
+
```ts
|
|
28
|
+
type BreakRequestStatus = 'PENDING' | 'APPROVED' | 'REJECTED' | 'CANCELLED'
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### AdminUser
|
|
32
|
+
```ts
|
|
33
|
+
interface AdminUser {
|
|
34
|
+
id: string
|
|
35
|
+
name: string
|
|
36
|
+
firstName?: string
|
|
37
|
+
lastName?: string
|
|
38
|
+
email: string
|
|
39
|
+
devalokEmail?: string
|
|
40
|
+
designation: string | null
|
|
41
|
+
image: string | null
|
|
42
|
+
role: UserRole
|
|
43
|
+
isActive: boolean
|
|
44
|
+
createdAt: string | Date
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### AttendanceRecord
|
|
49
|
+
```ts
|
|
50
|
+
interface AttendanceRecord {
|
|
51
|
+
id: string
|
|
52
|
+
userId: string
|
|
53
|
+
date: string
|
|
54
|
+
timeIn: string | null
|
|
55
|
+
timeOut: string | null
|
|
56
|
+
status: AttendanceStatus
|
|
57
|
+
correctionStatus?: CorrectionStatus | null
|
|
58
|
+
reason?: string | null
|
|
59
|
+
adminComment?: string | null
|
|
60
|
+
requestedDate?: string | null
|
|
61
|
+
newTimeIn?: string | null
|
|
62
|
+
newTimeOut?: string | null
|
|
63
|
+
oldTimeIn?: string | null
|
|
64
|
+
oldTimeOut?: string | null
|
|
65
|
+
user?: AdminUser
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### BreakRequest
|
|
70
|
+
```ts
|
|
71
|
+
interface BreakRequest {
|
|
72
|
+
id: string
|
|
73
|
+
userId: string
|
|
74
|
+
startDate: string
|
|
75
|
+
endDate: string
|
|
76
|
+
numberOfDays: number
|
|
77
|
+
reason: string
|
|
78
|
+
status: BreakRequestStatus
|
|
79
|
+
adminComment?: string | null
|
|
80
|
+
correction?: boolean
|
|
81
|
+
user?: Pick<AdminUser, 'id' | 'name' | 'firstName' | 'image'>
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### BreakBalanceData
|
|
86
|
+
```ts
|
|
87
|
+
interface BreakBalanceData {
|
|
88
|
+
id: string
|
|
89
|
+
userId: string
|
|
90
|
+
totalDays: number
|
|
91
|
+
usedDays?: number
|
|
92
|
+
carryForward: number
|
|
93
|
+
cashout: number
|
|
94
|
+
yearlyBalance?: number
|
|
95
|
+
other?: number
|
|
96
|
+
user?: Pick<AdminUser, 'id' | 'name' | 'firstName' | 'image'>
|
|
97
|
+
createdAt: string
|
|
98
|
+
updatedAt: string
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Adjustment
|
|
103
|
+
```ts
|
|
104
|
+
interface Adjustment {
|
|
105
|
+
id: string
|
|
106
|
+
userId: string
|
|
107
|
+
numberOfDays: number
|
|
108
|
+
type: string
|
|
109
|
+
reason: string
|
|
110
|
+
status: string
|
|
111
|
+
comment: string | null
|
|
112
|
+
approvedBy: string | null
|
|
113
|
+
createdAt: string
|
|
114
|
+
updatedAt: string
|
|
115
|
+
user?: Pick<AdminUser, 'name' | 'email'>
|
|
116
|
+
approver?: Pick<AdminUser, 'name' | 'email'>
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### GroupedAttendance
|
|
121
|
+
```ts
|
|
122
|
+
interface GroupedAttendance {
|
|
123
|
+
present: Array<{ user: AdminUser; attendance: AttendanceRecord }>
|
|
124
|
+
absent: Array<{ user: AdminUser; attendance?: AttendanceRecord }>
|
|
125
|
+
onBreak: Array<{ user: AdminUser; attendance: AttendanceRecord; breakRequest?: BreakRequest }>
|
|
126
|
+
yetToMark: Array<{ user: AdminUser }>
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### DayInfo
|
|
131
|
+
```ts
|
|
132
|
+
interface DayInfo {
|
|
133
|
+
day: string
|
|
134
|
+
date: number
|
|
135
|
+
fullDate: Date
|
|
136
|
+
isToday: boolean
|
|
137
|
+
isActive: boolean
|
|
138
|
+
isPadding?: boolean
|
|
139
|
+
hasBreak?: boolean
|
|
140
|
+
isAbsent?: boolean
|
|
141
|
+
isDisabled?: boolean
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### RealtimeCallbacks
|
|
146
|
+
```ts
|
|
147
|
+
interface RealtimeCallbacks {
|
|
148
|
+
onBreakRequestCreated?: (data: BreakRequest) => void
|
|
149
|
+
onBreakRequestApproved?: (data: BreakRequest) => void
|
|
150
|
+
onBreakRequestRejected?: (data: BreakRequest) => void
|
|
151
|
+
onBreakRequestCancelled?: (data: BreakRequest) => void
|
|
152
|
+
onAttendanceCorrectionCreated?: (data: AttendanceRecord) => void
|
|
153
|
+
onAttendanceCorrectionProcessed?: (data: AttendanceRecord) => void
|
|
154
|
+
onTaskUpdated?: (data: unknown) => void
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Gotchas
|
|
159
|
+
- `AttendanceStatus` includes `'Not_Marked'` (mixed case with underscore) — not `'NOT_MARKED'`
|
|
160
|
+
- `BreakRequest.correction` is a boolean flag that indicates the request is an attendance correction, not a break
|
|
161
|
+
- `AdminUser.designation` and `AdminUser.image` are nullable (`string | null`)
|
|
162
|
+
- `AdminUser.createdAt` accepts both `string` and `Date`
|
|
163
|
+
- `DayInfo` is used by the calendar components — `isPadding` marks days from adjacent months
|
|
164
|
+
|
|
165
|
+
## Changes
|
|
166
|
+
### v0.9.0
|
|
167
|
+
- **Added** Initial release with all admin domain types
|