@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.
- package/dist/api.d.ts +83 -0
- package/dist/api.js +170 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.js +136 -0
- package/dist/auth.js.map +1 -0
- package/dist/data.d.ts +25 -0
- package/dist/data.js +73 -0
- package/dist/data.js.map +1 -0
- package/dist/examples.d.ts +6 -0
- package/dist/examples.js +47 -0
- package/dist/examples.js.map +1 -0
- package/dist/hooks.d.ts +58 -0
- package/dist/hooks.js +109 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/layouts.d.ts +6 -0
- package/dist/layouts.js +34 -0
- package/dist/layouts.js.map +1 -0
- package/dist/line-flow/bus.d.ts +13 -0
- package/dist/line-flow/bus.js +52 -0
- package/dist/line-flow/bus.js.map +1 -0
- package/dist/line-flow/derived-line.d.ts +21 -0
- package/dist/line-flow/derived-line.js +122 -0
- package/dist/line-flow/derived-line.js.map +1 -0
- package/dist/line-flow/errors.d.ts +62 -0
- package/dist/line-flow/errors.js +91 -0
- package/dist/line-flow/errors.js.map +1 -0
- package/dist/line-flow/event-line.d.ts +16 -0
- package/dist/line-flow/event-line.js +81 -0
- package/dist/line-flow/event-line.js.map +1 -0
- package/dist/line-flow/index.d.ts +11 -0
- package/dist/line-flow/index.js +11 -0
- package/dist/line-flow/index.js.map +1 -0
- package/dist/line-flow/interchange.d.ts +17 -0
- package/dist/line-flow/interchange.js +86 -0
- package/dist/line-flow/interchange.js.map +1 -0
- package/dist/line-flow/lineflow.d.ts +12 -0
- package/dist/line-flow/lineflow.js +15 -0
- package/dist/line-flow/lineflow.js.map +1 -0
- package/dist/line-flow/network.d.ts +28 -0
- package/dist/line-flow/network.js +165 -0
- package/dist/line-flow/network.js.map +1 -0
- package/dist/line-flow/react/bridge.d.ts +23 -0
- package/dist/line-flow/react/bridge.js +40 -0
- package/dist/line-flow/react/bridge.js.map +1 -0
- package/dist/line-flow/react/hooks.d.ts +29 -0
- package/dist/line-flow/react/hooks.js +117 -0
- package/dist/line-flow/react/hooks.js.map +1 -0
- package/dist/line-flow/react/index.d.ts +3 -0
- package/dist/line-flow/react/index.js +4 -0
- package/dist/line-flow/react/index.js.map +1 -0
- package/dist/line-flow/react/provider.d.ts +15 -0
- package/dist/line-flow/react/provider.js +25 -0
- package/dist/line-flow/react/provider.js.map +1 -0
- package/dist/line-flow/scope.d.ts +21 -0
- package/dist/line-flow/scope.js +157 -0
- package/dist/line-flow/scope.js.map +1 -0
- package/dist/line-flow/state-line.d.ts +21 -0
- package/dist/line-flow/state-line.js +106 -0
- package/dist/line-flow/state-line.js.map +1 -0
- package/dist/line-flow/taxi.d.ts +15 -0
- package/dist/line-flow/taxi.js +81 -0
- package/dist/line-flow/taxi.js.map +1 -0
- package/dist/line-flow/types.d.ts +222 -0
- package/dist/line-flow/types.js +2 -0
- package/dist/line-flow/types.js.map +1 -0
- package/dist/line-flow/utils.d.ts +24 -0
- package/dist/line-flow/utils.js +53 -0
- package/dist/line-flow/utils.js.map +1 -0
- package/dist/paramsSerializer.d.ts +87 -0
- package/dist/paramsSerializer.js +138 -0
- package/dist/paramsSerializer.js.map +1 -0
- package/dist/registry.d.ts +10 -0
- package/dist/registry.js +115 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtime.d.ts +80 -0
- package/dist/runtime.js +442 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schemas.d.ts +88 -0
- package/dist/schemas.js +146 -0
- package/dist/schemas.js.map +1 -0
- package/dist/services.d.ts +35 -0
- package/dist/services.js +65 -0
- package/dist/services.js.map +1 -0
- package/dist/shared-types/file.types.d.ts +12 -0
- package/dist/shared-types/file.types.js +2 -0
- package/dist/shared-types/file.types.js.map +1 -0
- package/dist/shared-types/gallery.types.d.ts +22 -0
- package/dist/shared-types/gallery.types.js +2 -0
- package/dist/shared-types/gallery.types.js.map +1 -0
- package/dist/shared-types/governorates.types.d.ts +12 -0
- package/dist/shared-types/governorates.types.js +2 -0
- package/dist/shared-types/governorates.types.js.map +1 -0
- package/dist/shared-types/grade.types.d.ts +7 -0
- package/dist/shared-types/grade.types.js +2 -0
- package/dist/shared-types/grade.types.js.map +1 -0
- package/dist/shared-types/index.d.ts +13 -0
- package/dist/shared-types/index.js +14 -0
- package/dist/shared-types/index.js.map +1 -0
- package/dist/shared-types/metadata.types.d.ts +61 -0
- package/dist/shared-types/metadata.types.js +3 -0
- package/dist/shared-types/metadata.types.js.map +1 -0
- package/dist/shared-types/table.types.d.ts +33 -0
- package/dist/shared-types/table.types.js +2 -0
- package/dist/shared-types/table.types.js.map +1 -0
- package/dist/shared-types/viewCard.types.d.ts +78 -0
- package/dist/shared-types/viewCard.types.js +3 -0
- package/dist/shared-types/viewCard.types.js.map +1 -0
- package/dist/styles.css +347 -0
- package/dist/types.d.ts +126 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/conditionCompiler.d.ts +11 -0
- package/dist/utils/conditionCompiler.js +18 -0
- package/dist/utils/conditionCompiler.js.map +1 -0
- package/dist/utils/fileUtils.d.ts +50 -0
- package/dist/utils/fileUtils.js +266 -0
- package/dist/utils/fileUtils.js.map +1 -0
- package/dist/utils/metadataUtils.d.ts +35 -0
- package/dist/utils/metadataUtils.js +176 -0
- package/dist/utils/metadataUtils.js.map +1 -0
- package/dist/utils/normalizeTime.d.ts +1 -0
- package/dist/utils/normalizeTime.js +25 -0
- package/dist/utils/normalizeTime.js.map +1 -0
- package/dist/utils/tableUtils.d.ts +9 -0
- package/dist/utils/tableUtils.js +92 -0
- package/dist/utils/tableUtils.js.map +1 -0
- package/dist/utils/toFormData.d.ts +152 -0
- package/dist/utils/toFormData.js +250 -0
- package/dist/utils/toFormData.js.map +1 -0
- package/dist/utils/wizard.utils.d.ts +420 -0
- package/dist/utils/wizard.utils.js +596 -0
- package/dist/utils/wizard.utils.js.map +1 -0
- package/package.json +49 -3
- 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, "&")
|
|
172
|
+
.replace(/</g, "<")
|
|
173
|
+
.replace(/>/g, ">")
|
|
174
|
+
.replace(/"/g, """)
|
|
175
|
+
.replace(/'/g, "'");
|
|
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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"}
|