@appcorp/shadcn 1.0.10

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 (78) hide show
  1. package/README.md +138 -0
  2. package/app/layout.d.ts +7 -0
  3. package/app/layout.js +18 -0
  4. package/app/page.d.ts +2 -0
  5. package/app/page.js +16 -0
  6. package/components/badge.d.ts +9 -0
  7. package/components/badge.js +82 -0
  8. package/components/button.d.ts +10 -0
  9. package/components/button.js +91 -0
  10. package/components/card.d.ts +9 -0
  11. package/components/card.js +94 -0
  12. package/components/carousel.d.ts +19 -0
  13. package/components/carousel.js +168 -0
  14. package/components/checkbox.d.ts +9 -0
  15. package/components/checkbox.js +87 -0
  16. package/components/combobox.d.ts +70 -0
  17. package/components/combobox.js +315 -0
  18. package/components/command.d.ts +18 -0
  19. package/components/command.js +115 -0
  20. package/components/context-menu.d.ts +25 -0
  21. package/components/context-menu.js +148 -0
  22. package/components/dialog.d.ts +15 -0
  23. package/components/dialog.js +118 -0
  24. package/components/drawer.d.ts +13 -0
  25. package/components/drawer.js +115 -0
  26. package/components/dropdown-menu.d.ts +25 -0
  27. package/components/dropdown-menu.js +148 -0
  28. package/components/enhanced-dropzone.d.ts +21 -0
  29. package/components/enhanced-dropzone.js +187 -0
  30. package/components/enhanced-table-footer-action.d.ts +35 -0
  31. package/components/enhanced-table-footer-action.js +110 -0
  32. package/components/enhanced-table-footer-page.d.ts +34 -0
  33. package/components/enhanced-table-footer-page.js +132 -0
  34. package/components/enhanced-table-footer-pagination.d.ts +38 -0
  35. package/components/enhanced-table-footer-pagination.js +116 -0
  36. package/components/enhanced-table-header-action.d.ts +7 -0
  37. package/components/enhanced-table-header-action.js +21 -0
  38. package/components/enhanced-table-header-search.d.ts +12 -0
  39. package/components/enhanced-table-header-search.js +17 -0
  40. package/components/enhanced-table.d.ts +87 -0
  41. package/components/enhanced-table.js +221 -0
  42. package/components/form.d.ts +24 -0
  43. package/components/form.js +125 -0
  44. package/components/input.d.ts +8 -0
  45. package/components/input.js +86 -0
  46. package/components/label.d.ts +7 -0
  47. package/components/label.js +68 -0
  48. package/components/popover.d.ts +7 -0
  49. package/components/popover.js +82 -0
  50. package/components/select.d.ts +15 -0
  51. package/components/select.js +127 -0
  52. package/components/separator.d.ts +4 -0
  53. package/components/separator.js +66 -0
  54. package/components/shadcn-io/color-picker/index.d.ts +43 -0
  55. package/components/shadcn-io/color-picker/index.js +304 -0
  56. package/components/shadcn-io/copy-button/index.d.ts +16 -0
  57. package/components/shadcn-io/copy-button/index.js +121 -0
  58. package/components/shadcn-io/dropzone/index.d.ts +19 -0
  59. package/components/shadcn-io/dropzone/index.js +131 -0
  60. package/components/shadcn-io/gantt/index.d.ts +145 -0
  61. package/components/shadcn-io/gantt/index.js +767 -0
  62. package/components/shadcn-io/table/index.d.ts +60 -0
  63. package/components/shadcn-io/table/index.js +138 -0
  64. package/components/sonner.d.ts +4 -0
  65. package/components/sonner.js +54 -0
  66. package/components/switch.d.ts +9 -0
  67. package/components/switch.js +89 -0
  68. package/components/table.d.ts +10 -0
  69. package/components/table.js +101 -0
  70. package/components/textarea.d.ts +8 -0
  71. package/components/textarea.js +86 -0
  72. package/lib/themes.d.ts +147 -0
  73. package/lib/themes.js +150 -0
  74. package/lib/toast-utils.d.ts +44 -0
  75. package/lib/toast-utils.js +212 -0
  76. package/lib/utils.d.ts +2 -0
  77. package/lib/utils.js +12 -0
  78. package/package.json +101 -0
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ /**
3
+ * Enhanced Table Footer Page Component
4
+ *
5
+ * Displays pagination information with internationalization and RTL/LTR support.
6
+ * Automatically adapts text direction and order based on locale.
7
+ *
8
+ * Features:
9
+ * - Full i18n support with fallback text
10
+ * - RTL/LTR layout adaptation
11
+ * - Loading state indicator
12
+ * - Accessibility attributes
13
+ * - Custom translation overrides
14
+ */
15
+ var __importDefault = (this && this.__importDefault) || function (mod) {
16
+ return (mod && mod.__esModule) ? mod : { "default": mod };
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.EnhancedTableFooterPage = void 0;
20
+ var react_1 = __importDefault(require("react"));
21
+ var EnhancedTableFooterPage = function (_a) {
22
+ var currentPage = _a.currentPage, _b = _a.isRTL, isRTL = _b === void 0 ? false : _b, loading = _a.loading, _c = _a.loadingLabel, loadingLabel = _c === void 0 ? "Loading" : _c, _d = _a.ofLabel, ofLabel = _d === void 0 ? "of" : _d, _e = _a.pageLabel, pageLabel = _e === void 0 ? "Page" : _e, totalPages = _a.totalPages, _f = _a.className, className = _f === void 0 ? "" : _f;
23
+ return (react_1.default.createElement("div", { className: "flex items-center gap-2 ".concat(isRTL ? "rtl" : "ltr", " ").concat(className), dir: isRTL ? "rtl" : "ltr", role: "status", "aria-live": "polite", "aria-label": "".concat(pageLabel, " ").concat(currentPage, " ").concat(ofLabel, " ").concat(totalPages) },
24
+ react_1.default.createElement("span", { className: "text-sm text-muted-foreground" }, isRTL ? (
25
+ // RTL layout: Numbers read right-to-left but maintain logical order
26
+ react_1.default.createElement("span", { className: "inline-flex items-center gap-1" },
27
+ react_1.default.createElement("span", null, totalPages),
28
+ react_1.default.createElement("span", null, ofLabel),
29
+ react_1.default.createElement("span", null, currentPage),
30
+ react_1.default.createElement("span", null, pageLabel))) : (
31
+ // LTR layout: "Page currentPage of totalPages"
32
+ react_1.default.createElement("span", { className: "inline-flex items-center gap-1" },
33
+ react_1.default.createElement("span", null, pageLabel),
34
+ react_1.default.createElement("span", null, currentPage),
35
+ react_1.default.createElement("span", null, ofLabel),
36
+ react_1.default.createElement("span", null, totalPages)))),
37
+ loading && (react_1.default.createElement("div", { className: "flex items-center gap-2 ".concat(isRTL ? "order-first" : "order-last"), "aria-label": loadingLabel },
38
+ react_1.default.createElement("div", { className: "w-4 h-4 border-2 border-primary border-t-transparent rounded-full animate-spin", role: "progressbar", "aria-label": loadingLabel })))));
39
+ };
40
+ exports.EnhancedTableFooterPage = EnhancedTableFooterPage;
41
+ // ============================================================================
42
+ // USAGE EXAMPLES
43
+ // ============================================================================
44
+ /*
45
+ Example 1: Basic usage with automatic i18n
46
+ <EnhancedTableFooterPage
47
+ currentPage={2}
48
+ totalPages={10}
49
+ loading={false}
50
+ />
51
+
52
+ Example 2: With custom translations
53
+ <EnhancedTableFooterPage
54
+ currentPage={1}
55
+ totalPages={5}
56
+ loading={true}
57
+ translationMap={{
58
+ pageLabel: "صفحہ", // Urdu for "Page"
59
+ ofLabel: "کا", // Urdu for "of"
60
+ loadingLabel: "لوڈ ہو رہا ہے" // Urdu for "Loading"
61
+ }}
62
+ />
63
+
64
+ Example 3: With custom styling
65
+ <EnhancedTableFooterPage
66
+ currentPage={3}
67
+ totalPages={7}
68
+ loading={false}
69
+ className="bg-gray-50 p-2 rounded-md"
70
+ />
71
+
72
+ Translation Keys (Already Added to messages files):
73
+ English (en.json):
74
+ {
75
+ "common": {
76
+ "page": "Page",
77
+ "of": "of",
78
+ "loading": "Loading"
79
+ }
80
+ }
81
+
82
+ Urdu (ur.json):
83
+ {
84
+ "common": {
85
+ "page": "صفحہ",
86
+ "of": "کا",
87
+ "loading": "لوڈ ہو رہا ہے"
88
+ }
89
+ }
90
+
91
+ RTL Layout Features:
92
+ - Automatic text direction detection and application
93
+ - Proper order of page information in RTL languages
94
+ - RTL-aware loading indicator positioning
95
+ - Accessibility attributes for screen readers
96
+ - Direction-specific CSS classes and DOM attributes
97
+ */
98
+ // ============================================================================
99
+ // COMPONENT ENHANCEMENTS SUMMARY
100
+ // ============================================================================
101
+ /*
102
+ Enhancements Applied:
103
+
104
+ 1. **Internationalization (i18n)**
105
+ - Full translation support using next-intl
106
+ - Fallback text for missing translations
107
+ - Custom translation override capability
108
+
109
+ 2. **RTL/LTR Layout Support**
110
+ - Automatic layout detection using useRTL hook
111
+ - Proper text ordering for RTL languages
112
+ - Direction-aware CSS classes and attributes
113
+ - RTL-appropriate visual element positioning
114
+
115
+ 3. **Accessibility Improvements**
116
+ - ARIA labels for screen readers
117
+ - Role attributes for semantic meaning
118
+ - Live region announcements for dynamic content
119
+ - Proper labeling of interactive elements
120
+
121
+ 4. **Developer Experience**
122
+ - Comprehensive JSDoc documentation
123
+ - Usage examples and patterns
124
+ - TypeScript interface improvements
125
+ - Flexible customization options
126
+
127
+ 5. **Code Quality**
128
+ - Clean, readable component structure
129
+ - Consistent naming conventions
130
+ - Performance-optimized rendering
131
+ - Maintainable and extensible design
132
+ */
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Enhanced Table Footer Pagination Component
3
+ *
4
+ * Displays rows per page selector with internationalization and RTL/LTR support.
5
+ * Automatically adapts text direction and layout based on locale.
6
+ *
7
+ * Features:
8
+ * - Full i18n support with fallback text
9
+ * - RTL/LTR layout adaptation
10
+ * - Loading state handling
11
+ * - Accessibility attributes
12
+ * - Custom translation overrides
13
+ * - Responsive design
14
+ */
15
+ import { FC } from "react";
16
+ import { PageLimitOption } from "./enhanced-table";
17
+ interface EnhancedTableFooterPageProps {
18
+ /** Handler for page limit selection changes */
19
+ handleOnSelect: (node: string, value: object) => void;
20
+ /** Array of page limit options to display */
21
+ listOptions: PageLimitOption[];
22
+ /** Loading state indicator */
23
+ loading: boolean;
24
+ /** Node key for the select handler */
25
+ nodeSelectKey?: string;
26
+ /** Current page limit value */
27
+ pageLimit: number;
28
+ /** Total number of pages (unused but kept for compatibility) */
29
+ totalPages: number;
30
+ /** RTL layout flag */
31
+ isRTL?: boolean;
32
+ /** Label for rows per page selector */
33
+ rowsPerPageLabel?: string;
34
+ /** Optional CSS classes for custom styling */
35
+ className?: string;
36
+ }
37
+ export declare const EnhancedTableFooterPagination: FC<EnhancedTableFooterPageProps>;
38
+ export {};
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /**
3
+ * Enhanced Table Footer Pagination Component
4
+ *
5
+ * Displays rows per page selector with internationalization and RTL/LTR support.
6
+ * Automatically adapts text direction and layout based on locale.
7
+ *
8
+ * Features:
9
+ * - Full i18n support with fallback text
10
+ * - RTL/LTR layout adaptation
11
+ * - Loading state handling
12
+ * - Accessibility attributes
13
+ * - Custom translation overrides
14
+ * - Responsive design
15
+ */
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.EnhancedTableFooterPagination = void 0;
21
+ var select_1 = require("./select");
22
+ var react_1 = __importDefault(require("react"));
23
+ var EnhancedTableFooterPagination = function (_a) {
24
+ var handleOnSelect = _a.handleOnSelect, _b = _a.isRTL, isRTL = _b === void 0 ? false : _b, listOptions = _a.listOptions, loading = _a.loading, nodeSelectKey = _a.nodeSelectKey, pageLimit = _a.pageLimit, _c = _a.rowsPerPageLabel, rowsPerPageLabel = _c === void 0 ? "Rows per page:" : _c, _d = _a.className, className = _d === void 0 ? "" : _d;
25
+ return (react_1.default.createElement("div", { className: "flex items-center gap-2 ".concat(className), dir: isRTL ? "rtl" : "ltr" },
26
+ react_1.default.createElement("label", { htmlFor: "page-limit-select-".concat(nodeSelectKey), className: "text-sm text-muted-foreground whitespace-nowrap" }, rowsPerPageLabel),
27
+ react_1.default.createElement(select_1.Select, { value: String(pageLimit), onValueChange: function (value) {
28
+ return handleOnSelect(nodeSelectKey, { option: value });
29
+ }, disabled: loading },
30
+ react_1.default.createElement(select_1.SelectTrigger, { id: "page-limit-select-".concat(nodeSelectKey), className: "w-20", "aria-label": "".concat(rowsPerPageLabel, " ").concat(pageLimit) },
31
+ react_1.default.createElement(select_1.SelectValue, null)),
32
+ react_1.default.createElement(select_1.SelectContent, null, listOptions.map(function (option) { return (react_1.default.createElement(select_1.SelectItem, { key: option.option, value: option.option, "aria-label": "".concat(option.option, " rows per page") }, option.option)); })))));
33
+ };
34
+ exports.EnhancedTableFooterPagination = EnhancedTableFooterPagination;
35
+ // ============================================================================
36
+ // USAGE EXAMPLES
37
+ // ============================================================================
38
+ /*
39
+ Example 1: Basic usage with automatic i18n
40
+ <EnhancedTableFooterPagination
41
+ handleOnSelect={(key, value) => console.log(key, value)}
42
+ listOptions={[{ option: "10" }, { option: "25" }, { option: "50" }]}
43
+ loading={false}
44
+ nodeSelectKey="pageLimit"
45
+ pageLimit={10}
46
+ totalPages={5}
47
+ />
48
+
49
+ Example 2: With custom label text
50
+ <EnhancedTableFooterPagination
51
+ handleOnSelect={handlePageLimitChange}
52
+ listOptions={pageLimitOptions}
53
+ loading={isLoading}
54
+ nodeSelectKey="pageLimit"
55
+ pageLimit={currentPageLimit}
56
+ totalPages={totalPages}
57
+ labelText="Items per page:"
58
+ />
59
+
60
+ Example 3: With custom styling and RTL support
61
+ <EnhancedTableFooterPagination
62
+ handleOnSelect={handlePageLimitChange}
63
+ listOptions={pageLimitOptions}
64
+ loading={false}
65
+ nodeSelectKey="pageLimit"
66
+ pageLimit={25}
67
+ totalPages={10}
68
+ className="bg-gray-50 p-2 rounded-md"
69
+ />
70
+
71
+ RTL Layout Features:
72
+ - Automatic text direction detection and application
73
+ - Element order reversal for RTL languages
74
+ - Proper label-select association
75
+ - Accessibility attributes for screen readers
76
+ - Direction-specific CSS classes and DOM attributes
77
+ */
78
+ // ============================================================================
79
+ // COMPONENT ENHANCEMENTS SUMMARY
80
+ // ============================================================================
81
+ /*
82
+ Enhancements Applied:
83
+
84
+ 1. **Internationalization (i18n)**
85
+ - Translation support using next-intl
86
+ - Fallback text for missing translations
87
+ - Custom label text override capability
88
+ - Translatable "Rows per page:" label
89
+
90
+ 2. **RTL/LTR Layout Support**
91
+ - Automatic layout detection using useRTL hook
92
+ - Element order reversal for RTL languages (flex-row-reverse)
93
+ - Direction-aware CSS classes and attributes
94
+ - Proper text direction handling
95
+
96
+ 3. **Accessibility Improvements**
97
+ - Proper label-select association with htmlFor/id
98
+ - ARIA labels for screen readers
99
+ - Descriptive aria-label for select options
100
+ - Semantic HTML structure with label element
101
+
102
+ 4. **Developer Experience**
103
+ - Comprehensive JSDoc documentation
104
+ - Usage examples and patterns
105
+ - TypeScript interface improvements
106
+ - Flexible customization options
107
+
108
+ 5. **Code Quality**
109
+ - Clean, readable component structure
110
+ - Consistent naming conventions
111
+ - Performance-optimized rendering
112
+ - Maintainable and extensible design
113
+
114
+ Translation Key Required:
115
+ - common.rowsPerPage: "Rows per page:" / "ہر صفحے میں قطاریں:"
116
+ */
@@ -0,0 +1,7 @@
1
+ import { FC } from "react";
2
+ import { HeaderAction } from "./enhanced-table";
3
+ interface EnhancedTableHeaderActionProps {
4
+ headerActions: HeaderAction[];
5
+ }
6
+ export declare const EnhancedTableHeaderAction: FC<EnhancedTableHeaderActionProps>;
7
+ export {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EnhancedTableHeaderAction = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var button_1 = require("./button");
9
+ var EnhancedTableHeaderAction = function (_a) {
10
+ var headerActions = _a.headerActions;
11
+ return (react_1.default.createElement(react_1.default.Fragment, null, headerActions.length > 0 && (react_1.default.createElement("div", { className: "flex gap-2" }, headerActions
12
+ .filter(function (action) { return action.enabled !== false; })
13
+ .sort(function (a, b) { return (a.order || 0) - (b.order || 0); })
14
+ .map(function (action, index) { return (react_1.default.createElement(button_1.Button, { key: action.id || action.key || index, variant: action.variant || "default", onClick: function () {
15
+ if (action.onClick)
16
+ action.onClick();
17
+ if (action.handleOnClick)
18
+ action.handleOnClick();
19
+ } }, action.label)); })))));
20
+ };
21
+ exports.EnhancedTableHeaderAction = EnhancedTableHeaderAction;
@@ -0,0 +1,12 @@
1
+ import { FC } from "react";
2
+ interface EnhancedTableHeaderSearchProps {
3
+ handleSearchInput: (key: string, value: string) => void;
4
+ loading: boolean;
5
+ searchDisabled?: boolean;
6
+ searchEnabled?: boolean;
7
+ searchId?: string;
8
+ searchPlaceholder?: string;
9
+ searchValue: string;
10
+ }
11
+ export declare const EnhancedTableHeaderSearch: FC<EnhancedTableHeaderSearchProps>;
12
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EnhancedTableHeaderSearch = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var lucide_react_1 = require("lucide-react");
9
+ var input_1 = require("./input");
10
+ var EnhancedTableHeaderSearch = function (_a) {
11
+ var handleSearchInput = _a.handleSearchInput, loading = _a.loading, _b = _a.searchDisabled, searchDisabled = _b === void 0 ? false : _b, _c = _a.searchEnabled, searchEnabled = _c === void 0 ? true : _c, _d = _a.searchId, searchId = _d === void 0 ? "table-search" : _d, _e = _a.searchPlaceholder, searchPlaceholder = _e === void 0 ? "Search..." : _e, searchValue = _a.searchValue;
12
+ return (react_1.default.createElement(react_1.default.Fragment, null, searchEnabled && (react_1.default.createElement("div", { className: "flex items-center gap-2 max-w-xl" },
13
+ react_1.default.createElement("div", { className: "relative flex-1" },
14
+ react_1.default.createElement(lucide_react_1.Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" }),
15
+ react_1.default.createElement(input_1.Input, { id: searchId, placeholder: searchPlaceholder, value: searchValue, onChange: function (e) { return handleSearchInput("search", e.target.value); }, disabled: searchDisabled || loading, className: "pl-9" }))))));
16
+ };
17
+ exports.EnhancedTableHeaderSearch = EnhancedTableHeaderSearch;
@@ -0,0 +1,87 @@
1
+ import React from "react";
2
+ export interface TableColumn {
3
+ key?: string;
4
+ label: string;
5
+ width?: string;
6
+ componentType?: COMPONENT_TYPE | string;
7
+ }
8
+ export declare enum COMPONENT_TYPE {
9
+ ID = "ID",
10
+ BOLD_TEXT = "BOLD_TEXT",
11
+ TEXT = "TEXT",
12
+ OBJECT = "OBJECT",
13
+ MULTIPLE_TEXT_LINES = "MULTIPLE_TEXT_LINES",
14
+ CREATED_UPDATED_AT = "CREATED_UPDATED_AT",
15
+ ACTIONS = "ACTIONS",
16
+ BOOLEAN = "BOOLEAN"
17
+ }
18
+ export interface TableRow extends Record<string, unknown> {
19
+ id?: string;
20
+ [key: string]: unknown;
21
+ }
22
+ export interface RowAction {
23
+ id?: string;
24
+ key?: string;
25
+ label: string;
26
+ enabled?: boolean;
27
+ order?: number;
28
+ variant?: "default" | "destructive";
29
+ onClick?: (row: TableRow) => void;
30
+ handleOnClick?: (row: TableRow) => void;
31
+ handleAction?: (id: string) => void;
32
+ }
33
+ export interface HeaderAction {
34
+ id?: string;
35
+ key?: string;
36
+ label: string;
37
+ enabled?: boolean;
38
+ order?: number;
39
+ variant?: "default" | "outline" | "secondary";
40
+ onClick?: () => void;
41
+ handleOnClick?: () => void;
42
+ }
43
+ export interface PageLimitOption {
44
+ option: string;
45
+ }
46
+ export interface EnhancedTableProps {
47
+ tableHeadItems: TableColumn[];
48
+ tableBodyRows: TableRow[];
49
+ tableBodyCols: Array<{
50
+ key?: string | string[];
51
+ componentType: COMPONENT_TYPE | string;
52
+ }>;
53
+ tableHeading: string;
54
+ tableDescription?: string;
55
+ currentPage: number;
56
+ totalPages: number;
57
+ pageLimit: number;
58
+ listOptions: PageLimitOption[];
59
+ handleNextOnClick: () => void;
60
+ handlePreviousOnClick: () => void;
61
+ handleOnSelect: (node: string, value: object) => void;
62
+ isNextDisabled: boolean;
63
+ isPreviousDisabled: boolean;
64
+ searchEnabled?: boolean;
65
+ searchValue: string;
66
+ searchPlaceholder?: string;
67
+ searchId?: string;
68
+ searchDisabled?: boolean;
69
+ handleSearchInput: (key: string, value: string) => void;
70
+ headerActions: HeaderAction[];
71
+ rowActions: RowAction[];
72
+ loading: boolean;
73
+ isRTL?: boolean;
74
+ translationLabels?: {
75
+ booleanYes?: string;
76
+ booleanNo?: string;
77
+ noResultsFound?: string;
78
+ previousPage?: string;
79
+ nextPage?: string;
80
+ page?: string;
81
+ of?: string;
82
+ loading?: string;
83
+ rowsPerPage?: string;
84
+ };
85
+ nodeSelectKey?: string;
86
+ }
87
+ export declare const EnhancedTable: React.FC<EnhancedTableProps>;
@@ -0,0 +1,221 @@
1
+ "use client";
2
+ "use strict";
3
+ var __assign = (this && this.__assign) || function () {
4
+ __assign = Object.assign || function(t) {
5
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
6
+ s = arguments[i];
7
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
8
+ t[p] = s[p];
9
+ }
10
+ return t;
11
+ };
12
+ return __assign.apply(this, arguments);
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.EnhancedTable = exports.COMPONENT_TYPE = void 0;
19
+ var react_1 = __importDefault(require("react"));
20
+ var lucide_react_1 = require("lucide-react");
21
+ var table_1 = require("./table");
22
+ var button_1 = require("./button");
23
+ var dropdown_menu_1 = require("./dropdown-menu");
24
+ var utils_1 = require("../lib/utils");
25
+ var enhanced_table_footer_action_1 = require("./enhanced-table-footer-action");
26
+ var enhanced_table_footer_page_1 = require("./enhanced-table-footer-page");
27
+ var enhanced_table_footer_pagination_1 = require("./enhanced-table-footer-pagination");
28
+ var popover_1 = require("./popover");
29
+ var enhanced_table_header_action_1 = require("./enhanced-table-header-action");
30
+ var enhanced_table_header_search_1 = require("./enhanced-table-header-search");
31
+ var badge_1 = require("./badge");
32
+ // Centralized component type values for table cell rendering
33
+ var COMPONENT_TYPE;
34
+ (function (COMPONENT_TYPE) {
35
+ COMPONENT_TYPE["ID"] = "ID";
36
+ COMPONENT_TYPE["BOLD_TEXT"] = "BOLD_TEXT";
37
+ COMPONENT_TYPE["TEXT"] = "TEXT";
38
+ COMPONENT_TYPE["OBJECT"] = "OBJECT";
39
+ COMPONENT_TYPE["MULTIPLE_TEXT_LINES"] = "MULTIPLE_TEXT_LINES";
40
+ COMPONENT_TYPE["CREATED_UPDATED_AT"] = "CREATED_UPDATED_AT";
41
+ COMPONENT_TYPE["ACTIONS"] = "ACTIONS";
42
+ COMPONENT_TYPE["BOOLEAN"] = "BOOLEAN";
43
+ })(COMPONENT_TYPE || (exports.COMPONENT_TYPE = COMPONENT_TYPE = {}));
44
+ var EnhancedTable = function (_a) {
45
+ var currentPage = _a.currentPage, handleNextOnClick = _a.handleNextOnClick, handleOnSelect = _a.handleOnSelect, handlePreviousOnClick = _a.handlePreviousOnClick, handleSearchInput = _a.handleSearchInput, headerActions = _a.headerActions, isNextDisabled = _a.isNextDisabled, isPreviousDisabled = _a.isPreviousDisabled, _b = _a.isRTL, isRTL = _b === void 0 ? false : _b, listOptions = _a.listOptions, loading = _a.loading, _c = _a.nodeSelectKey, nodeSelectKey = _c === void 0 ? "pageLimit" : _c, pageLimit = _a.pageLimit, rowActions = _a.rowActions, _d = _a.searchDisabled, searchDisabled = _d === void 0 ? false : _d, _e = _a.searchEnabled, searchEnabled = _e === void 0 ? true : _e, _f = _a.searchId, searchId = _f === void 0 ? "table-search" : _f, _g = _a.searchPlaceholder, searchPlaceholder = _g === void 0 ? "Search..." : _g, searchValue = _a.searchValue, tableBodyCols = _a.tableBodyCols, tableBodyRows = _a.tableBodyRows, tableDescription = _a.tableDescription, tableHeading = _a.tableHeading, tableHeadItems = _a.tableHeadItems, totalPages = _a.totalPages, _h = _a.translationLabels, translationLabels = _h === void 0 ? {} : _h;
46
+ // Default translation values
47
+ var defaultLabels = {
48
+ booleanYes: "Yes",
49
+ booleanNo: "No",
50
+ noResultsFound: "No results found.",
51
+ previousPage: "Previous page",
52
+ nextPage: "Next page",
53
+ page: "Page",
54
+ of: "of",
55
+ loading: "Loading",
56
+ rowsPerPage: "Rows per page:",
57
+ };
58
+ // Merge provided labels with defaults
59
+ var labels = __assign(__assign({}, defaultLabels), translationLabels);
60
+ var renderCellContent = function (row, col) {
61
+ var _a, _b;
62
+ // Helper to safely resolve nested keys (max depth 3)
63
+ var resolveValue = function (source, key) {
64
+ if (!key)
65
+ return source;
66
+ if (typeof key === "string") {
67
+ if (source && typeof source === "object")
68
+ return source[key];
69
+ return undefined;
70
+ }
71
+ // array of keys
72
+ var path = key.slice(0, 3); // enforce max depth 3
73
+ var cur = source;
74
+ for (var _i = 0, path_1 = path; _i < path_1.length; _i++) {
75
+ var k = path_1[_i];
76
+ if (cur == null)
77
+ return undefined;
78
+ if (typeof cur !== "object")
79
+ return undefined;
80
+ cur = cur[k];
81
+ }
82
+ return cur;
83
+ };
84
+ var getProp = function (obj, prop) {
85
+ if (obj &&
86
+ typeof obj === "object" &&
87
+ prop in obj)
88
+ return obj[prop];
89
+ return undefined;
90
+ };
91
+ // Resolve value (supports nested key arrays)
92
+ var value = resolveValue(row, col.key);
93
+ // Normalize componentType so external string enums (like VISTA_TABLE_CELL_TYPE)
94
+ // remain compatible with this table. Unknown/unsupported types fall back to TEXT.
95
+ var normalizeComponentType = function (c) {
96
+ var _a;
97
+ if (!c)
98
+ return undefined;
99
+ if (Object.values(COMPONENT_TYPE).includes(c))
100
+ return c;
101
+ // Map common external values to our ComponentType using object notation
102
+ var MAP = {
103
+ ID: COMPONENT_TYPE.ID,
104
+ BOLD_TEXT: COMPONENT_TYPE.BOLD_TEXT,
105
+ BOOLEAN: COMPONENT_TYPE.BOOLEAN,
106
+ ACTIONS: COMPONENT_TYPE.ACTIONS,
107
+ TEXT: COMPONENT_TYPE.TEXT,
108
+ OBJECT: COMPONENT_TYPE.OBJECT,
109
+ MULTIPLE_TEXT_LINES: COMPONENT_TYPE.MULTIPLE_TEXT_LINES,
110
+ CREATED_UPDATED_AT: COMPONENT_TYPE.CREATED_UPDATED_AT,
111
+ };
112
+ return (_a = MAP[String(c)]) !== null && _a !== void 0 ? _a : COMPONENT_TYPE.TEXT;
113
+ };
114
+ var normalizedType = normalizeComponentType(col.componentType);
115
+ if (col.key === "action") {
116
+ return (react_1.default.createElement(dropdown_menu_1.DropdownMenu, null,
117
+ react_1.default.createElement(dropdown_menu_1.DropdownMenuTrigger, { asChild: true },
118
+ react_1.default.createElement(button_1.Button, { variant: "ghost", size: "icon" },
119
+ react_1.default.createElement(lucide_react_1.MoreHorizontal, { className: "h-4 w-4" }))),
120
+ react_1.default.createElement(dropdown_menu_1.DropdownMenuContent, { align: "end" }, rowActions
121
+ .filter(function (action) { return action.enabled !== false; })
122
+ .sort(function (a, b) { return (a.order || 0) - (b.order || 0); })
123
+ .map(function (action, index) { return (react_1.default.createElement(dropdown_menu_1.DropdownMenuItem, { key: action.id || action.key || index, variant: action.variant, onClick: function () {
124
+ if (action.onClick)
125
+ action.onClick(row);
126
+ if (action.handleOnClick)
127
+ action.handleOnClick(row);
128
+ if (action.handleAction && row.id)
129
+ action.handleAction(row.id);
130
+ } }, action.label)); }))));
131
+ }
132
+ if (normalizedType === COMPONENT_TYPE.ID) {
133
+ return (react_1.default.createElement(popover_1.Popover, null,
134
+ react_1.default.createElement(popover_1.PopoverTrigger, { asChild: true },
135
+ react_1.default.createElement("span", { className: "text-xs text-muted-foreground font-mono" }, typeof value === "string"
136
+ ? "".concat(value.substring(0, 8), "...")
137
+ : String(value || ""))),
138
+ react_1.default.createElement(popover_1.PopoverContent, null,
139
+ react_1.default.createElement("span", { className: "text-xs text-muted-foreground font-mono" }, String(value)))));
140
+ }
141
+ if (normalizedType === COMPONENT_TYPE.BOLD_TEXT) {
142
+ return react_1.default.createElement("span", { className: "font-semibold" }, String(value || ""));
143
+ }
144
+ if (normalizedType === COMPONENT_TYPE.BOOLEAN) {
145
+ var isTrue = Boolean(value);
146
+ return (react_1.default.createElement(badge_1.Badge, { variant: "secondary", className: (0, utils_1.cn)("text-white font-medium", isTrue
147
+ ? "bg-green-500 hover:bg-green-600"
148
+ : "bg-red-500 hover:bg-red-600") }, isTrue ? labels.booleanYes : labels.booleanNo));
149
+ }
150
+ // OBJECT => nested property path supplied as array of strings (max length 3)
151
+ if (normalizedType === COMPONENT_TYPE.OBJECT) {
152
+ var nested = resolveValue(row, col.key);
153
+ // If nested is primitive, show it. If object, stringify first-level value.
154
+ if (nested == null)
155
+ return react_1.default.createElement("span", null, "");
156
+ if (typeof nested === "object") {
157
+ // Render primitive values inside object or JSON fallback
158
+ var primitive = typeof nested === "object"
159
+ ? // try to find a primitive child
160
+ Object.values(nested).find(function (v) {
161
+ return ["string", "number", "boolean"].includes(typeof v);
162
+ })
163
+ : nested;
164
+ return react_1.default.createElement("span", null, String(primitive !== null && primitive !== void 0 ? primitive : JSON.stringify(nested)));
165
+ }
166
+ return react_1.default.createElement("span", null, String(nested));
167
+ }
168
+ // MULTIPLE_TEXT_LINES => col.key is an array of keys, render up to 3 lines
169
+ if (normalizedType === COMPONENT_TYPE.MULTIPLE_TEXT_LINES) {
170
+ var keys = Array.isArray(col.key) ? col.key : [];
171
+ var lines = keys.slice(0, 3).map(function (k) {
172
+ var v = resolveValue(row, k);
173
+ return v == null ? "" : String(v);
174
+ });
175
+ return (react_1.default.createElement("div", { className: "flex flex-col" }, lines.map(function (line, idx) { return (react_1.default.createElement("span", { key: idx, className: "text-sm" }, line)); })));
176
+ }
177
+ // CREATED_UPDATED_AT => show createdAt and updatedAt from the object (or nested object)
178
+ if (normalizedType === COMPONENT_TYPE.CREATED_UPDATED_AT) {
179
+ var target = resolveValue(row, col.key);
180
+ var created = (_a = getProp(target, "createdAt")) !== null && _a !== void 0 ? _a : getProp(row, "createdAt");
181
+ var updated = (_b = getProp(target, "updatedAt")) !== null && _b !== void 0 ? _b : getProp(row, "updatedAt");
182
+ var fmt = function (d) {
183
+ if (d == null)
184
+ return "";
185
+ var date = d instanceof Date ? d : new Date(String(d));
186
+ if (isNaN(date.getTime()))
187
+ return String(d);
188
+ return date.toLocaleString();
189
+ };
190
+ return (react_1.default.createElement("div", { className: "flex flex-col text-sm text-muted-foreground" },
191
+ react_1.default.createElement("span", null, fmt(created)),
192
+ react_1.default.createElement("span", null, fmt(updated))));
193
+ }
194
+ return react_1.default.createElement("span", null, String(value || ""));
195
+ };
196
+ // Create loading skeleton rows
197
+ var renderLoadingRows = function () {
198
+ return Array.from({ length: pageLimit || 5 }).map(function (_, index) { return (react_1.default.createElement(table_1.TableRow, { key: "loading-".concat(index), className: "hover:bg-muted/50" }, tableHeadItems.map(function (_, colIndex) { return (react_1.default.createElement(table_1.TableCell, { key: colIndex, className: "py-4" },
199
+ react_1.default.createElement("div", { className: "h-4 bg-muted animate-pulse rounded w-full" }))); }))); });
200
+ };
201
+ return (react_1.default.createElement("div", { className: "space-y-4" },
202
+ react_1.default.createElement("div", { className: "flex items-center justify-between" },
203
+ react_1.default.createElement("div", { className: "space-y-1" },
204
+ react_1.default.createElement("h2", { className: "text-2xl font-bold tracking-tight" }, tableHeading),
205
+ tableDescription && (react_1.default.createElement("p", { className: "text-muted-foreground" }, tableDescription))),
206
+ react_1.default.createElement("div", { className: "flex flex-row items-center justify-end gap-2" },
207
+ react_1.default.createElement(enhanced_table_header_search_1.EnhancedTableHeaderSearch, { handleSearchInput: handleSearchInput, loading: loading, searchDisabled: searchDisabled, searchEnabled: searchEnabled, searchId: searchId, searchPlaceholder: searchPlaceholder, searchValue: searchValue }),
208
+ react_1.default.createElement(enhanced_table_header_action_1.EnhancedTableHeaderAction, { headerActions: headerActions }))),
209
+ react_1.default.createElement("div", { className: "border rounded-md" },
210
+ react_1.default.createElement(table_1.Table, null,
211
+ react_1.default.createElement(table_1.TableHeader, null,
212
+ react_1.default.createElement(table_1.TableRow, null, tableHeadItems.map(function (header, index) { return (react_1.default.createElement(table_1.TableHead, { key: index, style: { width: header.width }, className: (0, utils_1.cn)("font-medium", index === 0 && "rounded-tl-md", index === tableHeadItems.length - 1 && "rounded-tr-md") }, header.label)); }))),
213
+ react_1.default.createElement(table_1.TableBody, null, loading ? (renderLoadingRows()) : tableBodyRows.length === 0 ? (react_1.default.createElement(table_1.TableRow, null,
214
+ react_1.default.createElement(table_1.TableCell, { colSpan: tableHeadItems.length, className: "h-24 text-center text-muted-foreground" }, labels.noResultsFound))) : (tableBodyRows.map(function (row, rowIndex) { return (react_1.default.createElement(table_1.TableRow, { key: rowIndex, className: "hover:bg-muted/50" }, tableBodyCols.map(function (col, colIndex) { return (react_1.default.createElement(table_1.TableCell, { key: colIndex, className: "py-4" }, renderCellContent(row, col))); }))); }))))),
215
+ react_1.default.createElement("div", { className: "flex items-center justify-between" },
216
+ react_1.default.createElement(enhanced_table_footer_pagination_1.EnhancedTableFooterPagination, { handleOnSelect: handleOnSelect, isRTL: isRTL, listOptions: listOptions, loading: loading, nodeSelectKey: nodeSelectKey, pageLimit: pageLimit, rowsPerPageLabel: labels.rowsPerPage, totalPages: totalPages }),
217
+ react_1.default.createElement("div", { className: "flex items-center gap-4" },
218
+ react_1.default.createElement(enhanced_table_footer_page_1.EnhancedTableFooterPage, { currentPage: currentPage, isRTL: isRTL, loading: loading, loadingLabel: labels.loading, ofLabel: labels.of, pageLabel: labels.page, totalPages: totalPages }),
219
+ react_1.default.createElement(enhanced_table_footer_action_1.EnhancedTableFooterAction, { handleNextOnClick: handleNextOnClick, handlePreviousOnClick: handlePreviousOnClick, isNextDisabled: isNextDisabled, isPreviousDisabled: isPreviousDisabled, isRTL: isRTL, loading: loading, nextPageLabel: labels.nextPage, previousPageLabel: labels.previousPage })))));
220
+ };
221
+ exports.EnhancedTable = EnhancedTable;