@gostack-framework/react 0.0.0-stage → 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 (138) hide show
  1. package/dist/api.d.ts +83 -0
  2. package/dist/api.js +170 -0
  3. package/dist/api.js.map +1 -0
  4. package/dist/auth.d.ts +60 -0
  5. package/dist/auth.js +136 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/data.d.ts +25 -0
  8. package/dist/data.js +73 -0
  9. package/dist/data.js.map +1 -0
  10. package/dist/examples.d.ts +6 -0
  11. package/dist/examples.js +47 -0
  12. package/dist/examples.js.map +1 -0
  13. package/dist/hooks.d.ts +58 -0
  14. package/dist/hooks.js +109 -0
  15. package/dist/hooks.js.map +1 -0
  16. package/dist/index.d.ts +20 -0
  17. package/dist/index.js +21 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/layouts.d.ts +6 -0
  20. package/dist/layouts.js +34 -0
  21. package/dist/layouts.js.map +1 -0
  22. package/dist/line-flow/bus.d.ts +13 -0
  23. package/dist/line-flow/bus.js +52 -0
  24. package/dist/line-flow/bus.js.map +1 -0
  25. package/dist/line-flow/derived-line.d.ts +21 -0
  26. package/dist/line-flow/derived-line.js +122 -0
  27. package/dist/line-flow/derived-line.js.map +1 -0
  28. package/dist/line-flow/errors.d.ts +62 -0
  29. package/dist/line-flow/errors.js +91 -0
  30. package/dist/line-flow/errors.js.map +1 -0
  31. package/dist/line-flow/event-line.d.ts +16 -0
  32. package/dist/line-flow/event-line.js +81 -0
  33. package/dist/line-flow/event-line.js.map +1 -0
  34. package/dist/line-flow/index.d.ts +11 -0
  35. package/dist/line-flow/index.js +11 -0
  36. package/dist/line-flow/index.js.map +1 -0
  37. package/dist/line-flow/interchange.d.ts +17 -0
  38. package/dist/line-flow/interchange.js +86 -0
  39. package/dist/line-flow/interchange.js.map +1 -0
  40. package/dist/line-flow/lineflow.d.ts +12 -0
  41. package/dist/line-flow/lineflow.js +15 -0
  42. package/dist/line-flow/lineflow.js.map +1 -0
  43. package/dist/line-flow/network.d.ts +28 -0
  44. package/dist/line-flow/network.js +165 -0
  45. package/dist/line-flow/network.js.map +1 -0
  46. package/dist/line-flow/react/bridge.d.ts +23 -0
  47. package/dist/line-flow/react/bridge.js +40 -0
  48. package/dist/line-flow/react/bridge.js.map +1 -0
  49. package/dist/line-flow/react/hooks.d.ts +29 -0
  50. package/dist/line-flow/react/hooks.js +117 -0
  51. package/dist/line-flow/react/hooks.js.map +1 -0
  52. package/dist/line-flow/react/index.d.ts +3 -0
  53. package/dist/line-flow/react/index.js +4 -0
  54. package/dist/line-flow/react/index.js.map +1 -0
  55. package/dist/line-flow/react/provider.d.ts +15 -0
  56. package/dist/line-flow/react/provider.js +25 -0
  57. package/dist/line-flow/react/provider.js.map +1 -0
  58. package/dist/line-flow/scope.d.ts +21 -0
  59. package/dist/line-flow/scope.js +157 -0
  60. package/dist/line-flow/scope.js.map +1 -0
  61. package/dist/line-flow/state-line.d.ts +21 -0
  62. package/dist/line-flow/state-line.js +106 -0
  63. package/dist/line-flow/state-line.js.map +1 -0
  64. package/dist/line-flow/taxi.d.ts +15 -0
  65. package/dist/line-flow/taxi.js +81 -0
  66. package/dist/line-flow/taxi.js.map +1 -0
  67. package/dist/line-flow/types.d.ts +222 -0
  68. package/dist/line-flow/types.js +2 -0
  69. package/dist/line-flow/types.js.map +1 -0
  70. package/dist/line-flow/utils.d.ts +24 -0
  71. package/dist/line-flow/utils.js +53 -0
  72. package/dist/line-flow/utils.js.map +1 -0
  73. package/dist/paramsSerializer.d.ts +87 -0
  74. package/dist/paramsSerializer.js +138 -0
  75. package/dist/paramsSerializer.js.map +1 -0
  76. package/dist/registry.d.ts +10 -0
  77. package/dist/registry.js +115 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/runtime.d.ts +80 -0
  80. package/dist/runtime.js +442 -0
  81. package/dist/runtime.js.map +1 -0
  82. package/dist/schemas.d.ts +88 -0
  83. package/dist/schemas.js +146 -0
  84. package/dist/schemas.js.map +1 -0
  85. package/dist/services.d.ts +35 -0
  86. package/dist/services.js +65 -0
  87. package/dist/services.js.map +1 -0
  88. package/dist/shared-types/file.types.d.ts +12 -0
  89. package/dist/shared-types/file.types.js +2 -0
  90. package/dist/shared-types/file.types.js.map +1 -0
  91. package/dist/shared-types/gallery.types.d.ts +22 -0
  92. package/dist/shared-types/gallery.types.js +2 -0
  93. package/dist/shared-types/gallery.types.js.map +1 -0
  94. package/dist/shared-types/governorates.types.d.ts +12 -0
  95. package/dist/shared-types/governorates.types.js +2 -0
  96. package/dist/shared-types/governorates.types.js.map +1 -0
  97. package/dist/shared-types/grade.types.d.ts +7 -0
  98. package/dist/shared-types/grade.types.js +2 -0
  99. package/dist/shared-types/grade.types.js.map +1 -0
  100. package/dist/shared-types/index.d.ts +13 -0
  101. package/dist/shared-types/index.js +14 -0
  102. package/dist/shared-types/index.js.map +1 -0
  103. package/dist/shared-types/metadata.types.d.ts +61 -0
  104. package/dist/shared-types/metadata.types.js +3 -0
  105. package/dist/shared-types/metadata.types.js.map +1 -0
  106. package/dist/shared-types/table.types.d.ts +33 -0
  107. package/dist/shared-types/table.types.js +2 -0
  108. package/dist/shared-types/table.types.js.map +1 -0
  109. package/dist/shared-types/viewCard.types.d.ts +78 -0
  110. package/dist/shared-types/viewCard.types.js +3 -0
  111. package/dist/shared-types/viewCard.types.js.map +1 -0
  112. package/dist/styles.css +347 -0
  113. package/dist/types.d.ts +126 -0
  114. package/dist/types.js +19 -0
  115. package/dist/types.js.map +1 -0
  116. package/dist/utils/conditionCompiler.d.ts +11 -0
  117. package/dist/utils/conditionCompiler.js +18 -0
  118. package/dist/utils/conditionCompiler.js.map +1 -0
  119. package/dist/utils/fileUtils.d.ts +50 -0
  120. package/dist/utils/fileUtils.js +266 -0
  121. package/dist/utils/fileUtils.js.map +1 -0
  122. package/dist/utils/metadataUtils.d.ts +35 -0
  123. package/dist/utils/metadataUtils.js +176 -0
  124. package/dist/utils/metadataUtils.js.map +1 -0
  125. package/dist/utils/normalizeTime.d.ts +1 -0
  126. package/dist/utils/normalizeTime.js +25 -0
  127. package/dist/utils/normalizeTime.js.map +1 -0
  128. package/dist/utils/tableUtils.d.ts +9 -0
  129. package/dist/utils/tableUtils.js +92 -0
  130. package/dist/utils/tableUtils.js.map +1 -0
  131. package/dist/utils/toFormData.d.ts +152 -0
  132. package/dist/utils/toFormData.js +250 -0
  133. package/dist/utils/toFormData.js.map +1 -0
  134. package/dist/utils/wizard.utils.d.ts +420 -0
  135. package/dist/utils/wizard.utils.js +596 -0
  136. package/dist/utils/wizard.utils.js.map +1 -0
  137. package/package.json +49 -3
  138. package/README.md +0 -3
@@ -0,0 +1,266 @@
1
+ /**
2
+ * File utility functions for downloading and handling files
3
+ */
4
+ /**
5
+ * Downloads a single file from a URL
6
+ * Uses fetch to get the blob and creates a temporary anchor element
7
+ */
8
+ export async function downloadFile(file) {
9
+ try {
10
+ const response = await fetch(file.fileUrl || file.url);
11
+ if (!response.ok) {
12
+ throw new Error(`Failed to download: ${response.statusText}`);
13
+ }
14
+ const blob = await response.blob();
15
+ const url = window.URL.createObjectURL(blob);
16
+ const link = document.createElement("a");
17
+ link.href = url;
18
+ link.download = file.fileName || file.name;
19
+ document.body.appendChild(link);
20
+ link.click();
21
+ // Cleanup
22
+ document.body.removeChild(link);
23
+ window.URL.revokeObjectURL(url);
24
+ }
25
+ catch (error) {
26
+ console.error(`Error downloading file ${file.fileName}:`, error);
27
+ throw error;
28
+ }
29
+ }
30
+ /**
31
+ * Downloads multiple files sequentially with a small delay between each
32
+ * to prevent browser blocking
33
+ */
34
+ export async function downloadFiles(files, delayMs = 300) {
35
+ let success = 0;
36
+ let failed = 0;
37
+ for (const file of files) {
38
+ try {
39
+ await downloadFile(file);
40
+ success++;
41
+ // Add delay between downloads to prevent browser blocking
42
+ if (files.indexOf(file) < files.length - 1) {
43
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
44
+ }
45
+ }
46
+ catch {
47
+ failed++;
48
+ }
49
+ }
50
+ return { success, failed };
51
+ }
52
+ /**
53
+ * Formats file size to human readable format
54
+ */
55
+ export function formatFileSize(bytes) {
56
+ if (bytes === 0)
57
+ return "0 B";
58
+ const units = ["B", "KB", "MB", "GB"];
59
+ const k = 1024;
60
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
61
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${units[i]}`;
62
+ }
63
+ /**
64
+ * Gets file extension from filename
65
+ */
66
+ export function getFileExtension(fileName) {
67
+ return fileName.split(".").pop()?.toLowerCase() || "";
68
+ }
69
+ /**
70
+ * Gets icon type based on file type/extension
71
+ */
72
+ export function getFileIconType(fileType) {
73
+ if (fileType.includes("pdf"))
74
+ return "pdf";
75
+ if (fileType.includes("image"))
76
+ return "image";
77
+ if (fileType.includes("word") ||
78
+ fileType.includes("document") ||
79
+ fileType.includes("text"))
80
+ return "document";
81
+ return "other";
82
+ }
83
+ /**
84
+ * Export generic array data to a CSV file
85
+ */
86
+ export function exportToCSV(data, columns, filename = "export.csv") {
87
+ if (!data || data.length === 0) {
88
+ throw new Error("No data to export");
89
+ }
90
+ const headers = columns.map((col) => col.header).join(",");
91
+ const csvContent = [
92
+ headers,
93
+ ...data.map((row) => columns
94
+ .map((col) => {
95
+ let value = typeof col.accessor === "function"
96
+ ? col.accessor(row)
97
+ : row[col.accessor];
98
+ // Handle null/undefined
99
+ if (value === null || value === undefined) {
100
+ value = "";
101
+ }
102
+ // Escape quotes and wrap in quotes to handle commas/newlines in data
103
+ const stringValue = String(value).replace(/"/g, '""');
104
+ return `"${stringValue}"`;
105
+ })
106
+ .join(",")),
107
+ ].join("\n");
108
+ const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" });
109
+ const link = document.createElement("a");
110
+ const url = URL.createObjectURL(blob);
111
+ link.setAttribute("href", url);
112
+ link.setAttribute("download", filename);
113
+ link.style.visibility = "hidden";
114
+ document.body.appendChild(link);
115
+ link.click();
116
+ document.body.removeChild(link);
117
+ URL.revokeObjectURL(url);
118
+ }
119
+ /**
120
+ * Export generic array data to an Excel (.xlsx) file
121
+ */
122
+ export async function exportToExcel(data, columns, filename = "export.xlsx") {
123
+ const XLSX = await import("xlsx");
124
+ if (!data || data.length === 0) {
125
+ throw new Error("No data to export");
126
+ }
127
+ // Format data into an array of objects mapping header -> value
128
+ const formattedData = data.map((row) => {
129
+ const rowData = {};
130
+ columns.forEach((col) => {
131
+ let value = typeof col.accessor === "function"
132
+ ? col.accessor(row)
133
+ : row[col.accessor];
134
+ if (value === null || value === undefined) {
135
+ value = "";
136
+ }
137
+ rowData[col.header] = value;
138
+ });
139
+ return rowData;
140
+ });
141
+ // Create a new workbook and worksheet
142
+ const worksheet = XLSX.utils.json_to_sheet(formattedData);
143
+ const workbook = XLSX.utils.book_new();
144
+ XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
145
+ // Write file
146
+ XLSX.writeFile(workbook, filename.endsWith(".xlsx") ? filename : `${filename}.xlsx`);
147
+ }
148
+ /**
149
+ * Opens a native print dialog with a cleanly formatted HTML table of the data
150
+ */
151
+ export function exportToPrint(data, columns, title = "Data Export") {
152
+ if (!data || data.length === 0) {
153
+ throw new Error("No data to export");
154
+ }
155
+ // Create a hidden iframe
156
+ const iframe = document.createElement("iframe");
157
+ iframe.style.position = "fixed";
158
+ iframe.style.right = "0";
159
+ iframe.style.bottom = "0";
160
+ iframe.style.width = "0";
161
+ iframe.style.height = "0";
162
+ iframe.style.border = "none";
163
+ document.body.appendChild(iframe);
164
+ const doc = iframe.contentWindow?.document;
165
+ if (!doc) {
166
+ document.body.removeChild(iframe);
167
+ throw new Error("Failed to initialize print frame");
168
+ }
169
+ // Generate table HTML
170
+ const escapeHtml = (value) => String(value)
171
+ .replace(/&/g, "&amp;")
172
+ .replace(/</g, "&lt;")
173
+ .replace(/>/g, "&gt;")
174
+ .replace(/"/g, "&quot;")
175
+ .replace(/'/g, "&#39;");
176
+ const headersHtml = columns
177
+ .map((col) => `<th>${escapeHtml(col.header)}</th>`)
178
+ .join("");
179
+ const rowsHtml = data
180
+ .map((row) => {
181
+ const cellsHtml = columns
182
+ .map((col) => {
183
+ let value = typeof col.accessor === "function"
184
+ ? col.accessor(row)
185
+ : row[col.accessor];
186
+ if (value === null || value === undefined)
187
+ value = "";
188
+ return `<td>${escapeHtml(value)}</td>`;
189
+ })
190
+ .join("");
191
+ return `<tr>${cellsHtml}</tr>`;
192
+ })
193
+ .join("");
194
+ // Write content with basic clean styling
195
+ doc.write(`
196
+ <!DOCTYPE html>
197
+ <html>
198
+ <head>
199
+ <title>${escapeHtml(title)}</title>
200
+ <style>
201
+ body {
202
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
203
+ padding: 20px;
204
+ color: #333;
205
+ }
206
+ h1 {
207
+ font-size: 24px;
208
+ margin-bottom: 20px;
209
+ border-bottom: 2px solid #eee;
210
+ padding-bottom: 10px;
211
+ }
212
+ table {
213
+ width: 100%;
214
+ border-collapse: collapse;
215
+ font-size: 12px;
216
+ }
217
+ th, td {
218
+ border: 1px solid #ddd;
219
+ padding: 8px 12px;
220
+ text-align: left;
221
+ }
222
+ th {
223
+ background-color: #f8f9fa;
224
+ font-weight: 600;
225
+ }
226
+ tr:nth-child(even) { background-color: #fcfcfc; }
227
+ @media print {
228
+ @page { margin: 1cm; }
229
+ body { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
230
+ }
231
+ </style>
232
+ </head>
233
+ <body>
234
+ <h1>${escapeHtml(title.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()))}</h1>
235
+ <table>
236
+ <thead>
237
+ <tr>${headersHtml}</tr>
238
+ </thead>
239
+ <tbody>
240
+ ${rowsHtml}
241
+ </tbody>
242
+ </table>
243
+ </body>
244
+ </html>
245
+ `);
246
+ doc.close();
247
+ // Focus and print after content is loaded
248
+ iframe.onload = () => {
249
+ try {
250
+ iframe.contentWindow?.focus();
251
+ iframe.contentWindow?.print();
252
+ }
253
+ catch (e) {
254
+ console.error("Print failed:", e);
255
+ }
256
+ finally {
257
+ // Cleanup after printing dialog is closed/done
258
+ setTimeout(() => {
259
+ if (document.body.contains(iframe)) {
260
+ document.body.removeChild(iframe);
261
+ }
262
+ }, 1000);
263
+ }
264
+ };
265
+ }
266
+ //# sourceMappingURL=fileUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../../src/utils/fileUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { ActiveFilter, SearchQuery, SortState, TableMetadata } from "../shared-types";
2
+ /**
3
+ * Builds query parameters object for API requests based on metadata-driven filters
4
+ */
5
+ export declare const buildQueryParams: (params: {
6
+ page?: number;
7
+ perPage?: number;
8
+ search?: SearchQuery;
9
+ filters?: ActiveFilter[];
10
+ sort?: SortState;
11
+ }) => Record<string, any>;
12
+ /**
13
+ * Backend metadata field structure
14
+ */
15
+ interface BackendMetadataField {
16
+ column: string;
17
+ label: string;
18
+ type: string;
19
+ operators: string[];
20
+ searchable: boolean;
21
+ options?: any[];
22
+ }
23
+ interface BackendMetadata {
24
+ model: string;
25
+ table: string;
26
+ fields: BackendMetadataField[];
27
+ searchable?: boolean;
28
+ sortable?: boolean;
29
+ filterable?: boolean;
30
+ }
31
+ /**
32
+ * Transforms backend metadata format to frontend TableMetadata format
33
+ */
34
+ export declare const transformBackendMetadata: (backendData: BackendMetadata) => TableMetadata;
35
+ export {};
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Builds query parameters object for API requests based on metadata-driven filters
3
+ */
4
+ export const buildQueryParams = (params) => {
5
+ const queryParams = {};
6
+ // Pagination
7
+ if (params.page !== undefined) {
8
+ queryParams.page = params.page;
9
+ }
10
+ if (params.perPage !== undefined) {
11
+ queryParams.perPage = params.perPage;
12
+ }
13
+ // Search
14
+ if (params.search?.term) {
15
+ queryParams.search = params.search.term;
16
+ if (params.search.columns && params.search.columns.length > 0) {
17
+ queryParams.searchColumns = params.search.columns.join(",");
18
+ }
19
+ }
20
+ // Filters - convert to API format: filter[column][operator] and filter[column][value][]
21
+ // Each filter sends operator and value as a pair
22
+ if (params.filters && params.filters.length > 0) {
23
+ const filtersByColumn = {};
24
+ params.filters.forEach((filter) => {
25
+ const column = filter.column;
26
+ if (!filtersByColumn[column]) {
27
+ filtersByColumn[column] = {
28
+ operator: filter.operator,
29
+ values: [],
30
+ };
31
+ }
32
+ // Collect values
33
+ if (Array.isArray(filter.value)) {
34
+ filtersByColumn[column].values.push(...filter.value);
35
+ }
36
+ else {
37
+ filtersByColumn[column].values.push(filter.value);
38
+ }
39
+ });
40
+ // Build query params - one operator and one value array per column
41
+ Object.entries(filtersByColumn).forEach(([column, { operator, values }]) => {
42
+ // Deduplicate values
43
+ const uniqueValues = Array.from(new Set(values));
44
+ queryParams[`filter[${column}][operator]`] = operator;
45
+ queryParams[`filter[${column}][value][]`] = uniqueValues;
46
+ });
47
+ }
48
+ // Sort - match backend format: sort[column] and sort[direction]
49
+ if (params.sort) {
50
+ queryParams[`sort[column]`] = params.sort.column;
51
+ queryParams[`sort[direction]`] = params.sort.direction;
52
+ }
53
+ return queryParams;
54
+ };
55
+ /**
56
+ * Transforms backend metadata format to frontend TableMetadata format
57
+ */
58
+ export const transformBackendMetadata = (backendData) => {
59
+ // Map backend field types to frontend field types
60
+ const typeMap = {
61
+ text: "text",
62
+ string: "text",
63
+ uuid: "text",
64
+ select: "select",
65
+ date: "date",
66
+ datetime: "date",
67
+ number: "number",
68
+ integer: "number",
69
+ float: "number",
70
+ decimal: "number",
71
+ boolean: "boolean",
72
+ };
73
+ // Convert fields to filters
74
+ const filters = backendData.fields
75
+ .filter(() => backendData.filterable !== false) // Include all if filterable is not explicitly false
76
+ .map((field) => {
77
+ const mappedType = typeMap[field.type] || "text";
78
+ // Warn if select field has no options
79
+ if (mappedType === "select" &&
80
+ (!field.options || field.options.length === 0)) {
81
+ console.warn(`[Metadata] Select field "${field.column}" (${field.label}) has no options. ` +
82
+ `Users won't be able to filter by this field. Backend should provide options array.`);
83
+ }
84
+ return {
85
+ column: field.column,
86
+ label: field.label,
87
+ type: mappedType,
88
+ operators: field.operators,
89
+ searchable: field.searchable,
90
+ options: field.options,
91
+ };
92
+ });
93
+ // Convert searchable fields to searches
94
+ const searches = backendData.fields
95
+ .filter((field) => field.searchable && backendData.searchable !== false)
96
+ .map((field, index) => ({
97
+ column: field.column,
98
+ label: field.label,
99
+ type: typeMap[field.type] || "text",
100
+ weight: 10 - index, // Higher weight for earlier fields
101
+ }));
102
+ // Convert fields to sorts (typically timestamp and text fields)
103
+ const sorts = backendData.fields
104
+ .filter((field) => backendData.sortable !== false &&
105
+ [
106
+ "text",
107
+ "string",
108
+ "date",
109
+ "datetime",
110
+ "number",
111
+ "integer",
112
+ "created_at",
113
+ "updated_at",
114
+ ].includes(field.type))
115
+ .map((field) => ({
116
+ column: field.column,
117
+ label: field.label,
118
+ defaultDirection: field.column.includes("created") || field.column.includes("updated")
119
+ ? "desc"
120
+ : "asc",
121
+ }));
122
+ // Standard operators with labels
123
+ const operators = {
124
+ "=": "Equals",
125
+ "!=": "Not Equals",
126
+ "<>": "Not Equals",
127
+ ">": "Greater Than",
128
+ "<": "Less Than",
129
+ ">=": "Greater or Equal",
130
+ "<=": "Less or Equal",
131
+ like: "Contains",
132
+ notLike: "Does Not Contain",
133
+ in: "In List",
134
+ notIn: "Not In List",
135
+ between: "Between",
136
+ notBetween: "Not Between",
137
+ isNull: "Is Empty",
138
+ isNotNull: "Is Not Empty",
139
+ };
140
+ // Standard field types
141
+ const fieldTypes = {
142
+ text: {
143
+ label: "Text",
144
+ component: "TextInput",
145
+ validation: "string|max:255",
146
+ },
147
+ select: {
148
+ label: "Select",
149
+ component: "SelectInput",
150
+ validation: "string",
151
+ },
152
+ date: {
153
+ label: "Date",
154
+ component: "DateInput",
155
+ validation: "date",
156
+ },
157
+ number: {
158
+ label: "Number",
159
+ component: "NumberInput",
160
+ validation: "numeric",
161
+ },
162
+ boolean: {
163
+ label: "Boolean",
164
+ component: "BooleanInput",
165
+ validation: "boolean",
166
+ },
167
+ };
168
+ return {
169
+ filters,
170
+ searches,
171
+ sorts,
172
+ operators,
173
+ fieldTypes,
174
+ };
175
+ };
176
+ //# sourceMappingURL=metadataUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadataUtils.js","sourceRoot":"","sources":["../../src/utils/metadataUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const normalizeTimeToHHmm: (value: string) => string;
@@ -0,0 +1,25 @@
1
+ // Normalize time format to HH:mm (24-hour format)
2
+ export const normalizeTimeToHHmm = (value) => {
3
+ // If already in HH:mm format, return as is
4
+ if (/^\d{2}:\d{2}$/.test(value)) {
5
+ return value;
6
+ }
7
+ // Handle 12-hour format with AM/PM
8
+ const time12hMatch = value.match(/^(\d{1,2}):(\d{2})\s*(AM|PM)$/i);
9
+ if (time12hMatch) {
10
+ const [, hours, minutes, period] = time12hMatch;
11
+ const hour24 = period.toUpperCase() === "PM" && hours !== "12"
12
+ ? parseInt(hours) + 12
13
+ : period.toUpperCase() === "AM" && hours === "12"
14
+ ? 0
15
+ : parseInt(hours);
16
+ return `${hour24.toString().padStart(2, "0")}:${minutes}`;
17
+ }
18
+ // Default: try to parse and format
19
+ const [hours, minutes] = value.split(":");
20
+ if (hours && minutes) {
21
+ return `${hours.padStart(2, "0")}:${minutes.padStart(2, "0")}`;
22
+ }
23
+ return value; // fallback
24
+ };
25
+ //# sourceMappingURL=normalizeTime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeTime.js","sourceRoot":"","sources":["../../src/utils/normalizeTime.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAE,EAAE;IACnD,2CAA2C;IAC3C,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mCAAmC;IACnC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACnE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC;QAChD,MAAM,MAAM,GACV,MAAM,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;YAC7C,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE;YACtB,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;gBAC/C,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxB,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;IAC5D,CAAC;IAED,mCAAmC;IACnC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;QACrB,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACjE,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,WAAW;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { TableData, FilterConfig, SortConfig } from "../shared-types";
2
+ export declare const getInitials: (name: string) => string;
3
+ export declare const filterData: (data: TableData[], searchQuery: string, activeFilters?: FilterConfig[]) => TableData[];
4
+ export declare const sortData: (data: TableData[], sortConfig: SortConfig | null) => TableData[];
5
+ export declare const paginateData: (data: TableData[], page: number, itemsPerPage: number) => TableData[];
6
+ export declare const toggleSelectRow: (data: TableData[], id: string) => TableData[];
7
+ export declare const toggleSelectAll: (data: TableData[], selected: boolean, currentPageIds?: string[]) => TableData[];
8
+ export declare const getSelectedCount: (data: TableData[]) => number;
9
+ export declare const toggleSort: (currentColumn: string, currentSortConfig: SortConfig | null) => SortConfig | null;
@@ -0,0 +1,92 @@
1
+ export const getInitials = (name) => {
2
+ return name
3
+ .split(" ")
4
+ .map((part) => part[0])
5
+ .join("")
6
+ .toUpperCase()
7
+ .substring(0, 2);
8
+ };
9
+ export const filterData = (data, searchQuery, activeFilters = []) => {
10
+ // First apply search query filter
11
+ let filteredData = data;
12
+ if (searchQuery) {
13
+ const lowerQuery = searchQuery.toLowerCase();
14
+ filteredData = filteredData.filter((item) => {
15
+ return Object.values(item.columns).some((value) => String(value).toLowerCase().includes(lowerQuery));
16
+ });
17
+ }
18
+ // Then apply advanced filters if any
19
+ if (activeFilters.length > 0) {
20
+ filteredData = filteredData.filter((item) => {
21
+ return activeFilters.every((filter) => {
22
+ const value = String(item.columns[filter.column] || "").toLowerCase();
23
+ const filterValue = filter.value.toLowerCase();
24
+ switch (filter.operator) {
25
+ case "equals":
26
+ return value === filterValue;
27
+ case "contains":
28
+ return value.includes(filterValue);
29
+ case "startsWith":
30
+ return value.startsWith(filterValue);
31
+ case "endsWith":
32
+ return value.endsWith(filterValue);
33
+ case "greaterThan":
34
+ return Number(value) > Number(filterValue);
35
+ case "lessThan":
36
+ return Number(value) < Number(filterValue);
37
+ default:
38
+ return true;
39
+ }
40
+ });
41
+ });
42
+ }
43
+ return filteredData;
44
+ };
45
+ export const sortData = (data, sortConfig) => {
46
+ if (!sortConfig || !sortConfig.column || !sortConfig.direction) {
47
+ return data;
48
+ }
49
+ return [...data].sort((a, b) => {
50
+ const aValue = a.columns[sortConfig.column];
51
+ const bValue = b.columns[sortConfig.column];
52
+ if (typeof aValue === "number" && typeof bValue === "number") {
53
+ return sortConfig.direction === "asc" ? aValue - bValue : bValue - aValue;
54
+ }
55
+ const aString = String(aValue || "").toLowerCase();
56
+ const bString = String(bValue || "").toLowerCase();
57
+ if (sortConfig.direction === "asc") {
58
+ return aString.localeCompare(bString);
59
+ }
60
+ else {
61
+ return bString.localeCompare(aString);
62
+ }
63
+ });
64
+ };
65
+ export const paginateData = (data, page, itemsPerPage) => {
66
+ const startIndex = (page - 1) * itemsPerPage;
67
+ return data.slice(startIndex, startIndex + itemsPerPage);
68
+ };
69
+ export const toggleSelectRow = (data, id) => {
70
+ return data.map((item) => item.id === id ? { ...item, selected: !item.selected } : item);
71
+ };
72
+ export const toggleSelectAll = (data, selected, currentPageIds) => {
73
+ if (!currentPageIds) {
74
+ // Original behavior - select all items
75
+ return data.map((item) => ({ ...item, selected }));
76
+ }
77
+ // New behavior - only select items on the current page
78
+ return data.map((item) => currentPageIds.includes(item.id) ? { ...item, selected } : item);
79
+ };
80
+ export const getSelectedCount = (data) => {
81
+ return data.filter((item) => item.selected).length;
82
+ };
83
+ export const toggleSort = (currentColumn, currentSortConfig) => {
84
+ if (!currentSortConfig || currentSortConfig.column !== currentColumn) {
85
+ return { column: currentColumn, direction: "asc" };
86
+ }
87
+ if (currentSortConfig.direction === "asc") {
88
+ return { column: currentColumn, direction: "desc" };
89
+ }
90
+ return null;
91
+ };
92
+ //# sourceMappingURL=tableUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableUtils.js","sourceRoot":"","sources":["../../src/utils/tableUtils.ts"],"names":[],"mappings":"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"}