@papernote/ui 1.0.0 → 1.2.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 (84) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +455 -445
  3. package/dist/components/CurrencyInput.d.ts +52 -0
  4. package/dist/components/CurrencyInput.d.ts.map +1 -0
  5. package/dist/components/DataTable.d.ts +3 -1
  6. package/dist/components/DataTable.d.ts.map +1 -1
  7. package/dist/components/Modal.d.ts.map +1 -1
  8. package/dist/components/Page.d.ts +2 -0
  9. package/dist/components/Page.d.ts.map +1 -1
  10. package/dist/components/PageLayout.d.ts +5 -1
  11. package/dist/components/PageLayout.d.ts.map +1 -1
  12. package/dist/components/Spreadsheet.d.ts +129 -0
  13. package/dist/components/Spreadsheet.d.ts.map +1 -0
  14. package/dist/components/Tabs.d.ts +5 -1
  15. package/dist/components/Tabs.d.ts.map +1 -1
  16. package/dist/components/index.d.ts +6 -0
  17. package/dist/components/index.d.ts.map +1 -1
  18. package/dist/index.d.ts +336 -5
  19. package/dist/index.esm.js +51152 -174
  20. package/dist/index.esm.js.map +1 -1
  21. package/dist/index.js +51145 -143
  22. package/dist/index.js.map +1 -1
  23. package/dist/styles.css +1187 -11
  24. package/dist/utils/excelExport.d.ts +143 -0
  25. package/dist/utils/excelExport.d.ts.map +1 -0
  26. package/dist/utils/index.d.ts +2 -0
  27. package/dist/utils/index.d.ts.map +1 -1
  28. package/package.json +13 -3
  29. package/src/components/AdminModal.css +49 -49
  30. package/src/components/CurrencyInput.stories.tsx +290 -0
  31. package/src/components/CurrencyInput.tsx +193 -0
  32. package/src/components/DataTable.stories.tsx +87 -0
  33. package/src/components/DataTable.tsx +149 -37
  34. package/src/components/Modal.stories.tsx +64 -0
  35. package/src/components/Modal.tsx +15 -2
  36. package/src/components/Page.stories.tsx +76 -0
  37. package/src/components/Page.tsx +35 -3
  38. package/src/components/PageLayout.stories.tsx +75 -0
  39. package/src/components/PageLayout.tsx +28 -9
  40. package/src/components/RoleManager.css +10 -10
  41. package/src/components/Spreadsheet.css +216 -0
  42. package/src/components/Spreadsheet.stories.tsx +362 -0
  43. package/src/components/Spreadsheet.tsx +351 -0
  44. package/src/components/SpreadsheetSimple.stories.tsx +27 -0
  45. package/src/components/Tabs.stories.tsx +31 -0
  46. package/src/components/Tabs.tsx +28 -4
  47. package/src/components/TimePicker.tsx +1 -1
  48. package/src/components/Toast.tsx +9 -9
  49. package/src/components/__tests__/Input.test.tsx +22 -26
  50. package/src/components/index.ts +11 -2
  51. package/src/styles/index.css +44 -6
  52. package/src/utils/excelExport.stories.tsx +535 -0
  53. package/src/utils/excelExport.ts +225 -0
  54. package/src/utils/index.ts +3 -0
  55. package/src/utils/sqlToNaturalLanguage.ts +1 -1
  56. package/tailwind.config.js +253 -253
  57. package/dist/components/Button.stories.d.ts +0 -51
  58. package/dist/components/Button.stories.d.ts.map +0 -1
  59. package/dist/components/ChartVisualizationUI.d.ts +0 -21
  60. package/dist/components/ChartVisualizationUI.d.ts.map +0 -1
  61. package/dist/components/ChatUI.d.ts +0 -23
  62. package/dist/components/ChatUI.d.ts.map +0 -1
  63. package/dist/components/CommissionDashboardUI.d.ts +0 -25
  64. package/dist/components/CommissionDashboardUI.d.ts.map +0 -1
  65. package/dist/components/DataTable.stories.d.ts +0 -23
  66. package/dist/components/DataTable.stories.d.ts.map +0 -1
  67. package/dist/components/FormField.d.ts +0 -35
  68. package/dist/components/FormField.d.ts.map +0 -1
  69. package/dist/components/Input.stories.d.ts +0 -366
  70. package/dist/components/Input.stories.d.ts.map +0 -1
  71. package/dist/components/InsightsPanelUI.d.ts +0 -21
  72. package/dist/components/InsightsPanelUI.d.ts.map +0 -1
  73. package/dist/components/PaymentHistoryTimeline.d.ts +0 -34
  74. package/dist/components/PaymentHistoryTimeline.d.ts.map +0 -1
  75. package/dist/components/RelationshipManagerUI.d.ts +0 -60
  76. package/dist/components/RelationshipManagerUI.d.ts.map +0 -1
  77. package/dist/components/RoleManager.d.ts +0 -19
  78. package/dist/components/RoleManager.d.ts.map +0 -1
  79. package/dist/components/SplitCommissionBadge.d.ts +0 -18
  80. package/dist/components/SplitCommissionBadge.d.ts.map +0 -1
  81. package/dist/components/__tests__/Button.test.d.ts +0 -2
  82. package/dist/components/__tests__/Button.test.d.ts.map +0 -1
  83. package/dist/components/__tests__/Input.test.d.ts +0 -2
  84. package/dist/components/__tests__/Input.test.d.ts.map +0 -1
@@ -0,0 +1,535 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { exportToExcel, exportDataTableToExcel, createMultiSheetExcel, ExcelColumn } from './excelExport';
3
+ import Button from '../components/Button';
4
+ import DataTable from '../components/DataTable';
5
+ import ExportButton from '../components/ExportButton';
6
+ import Card, { CardHeader, CardTitle, CardContent } from '../components/Card';
7
+ import Stack from '../components/Stack';
8
+ import Text from '../components/Text';
9
+ import { Download, FileSpreadsheet } from 'lucide-react';
10
+ import { DataTableColumn } from '../components/DataTable';
11
+
12
+ const meta: Meta = {
13
+ title: 'Utils/Excel Export',
14
+ parameters: {
15
+ docs: {
16
+ description: {
17
+ component:
18
+ 'Standalone utilities for exporting any data to Excel format without requiring the Spreadsheet component. Perfect for exporting DataTable data, API responses, or any array of objects.',
19
+ },
20
+ },
21
+ },
22
+ };
23
+
24
+ export default meta;
25
+ type Story = StoryObj;
26
+
27
+ // Sample data
28
+ const products = [
29
+ { id: 1, name: 'Widget A', category: 'Hardware', price: 29.99, stock: 100, active: true },
30
+ { id: 2, name: 'Widget B', category: 'Software', price: 49.99, stock: 50, active: true },
31
+ { id: 3, name: 'Widget C', category: 'Hardware', price: 19.99, stock: 200, active: false },
32
+ { id: 4, name: 'Gadget X', category: 'Electronics', price: 199.99, stock: 25, active: true },
33
+ { id: 5, name: 'Gadget Y', category: 'Electronics', price: 299.99, stock: 15, active: true },
34
+ ];
35
+
36
+ const orders = [
37
+ { orderId: 'ORD-001', customer: 'Acme Corp', amount: 5000, date: new Date('2025-01-15'), status: 'Completed' },
38
+ { orderId: 'ORD-002', customer: 'TechStart Inc', amount: 3500, date: new Date('2025-01-16'), status: 'Pending' },
39
+ { orderId: 'ORD-003', customer: 'Global Solutions', amount: 7200, date: new Date('2025-01-17'), status: 'Completed' },
40
+ ];
41
+
42
+ const users = [
43
+ { id: 1, name: 'John Doe', email: 'john@example.com', role: 'Admin', createdAt: new Date('2024-06-15'), isActive: true },
44
+ { id: 2, name: 'Jane Smith', email: 'jane@example.com', role: 'User', createdAt: new Date('2024-08-20'), isActive: true },
45
+ { id: 3, name: 'Bob Johnson', email: 'bob@example.com', role: 'User', createdAt: new Date('2024-12-01'), isActive: false },
46
+ ];
47
+
48
+ /**
49
+ * Simple export - uses object keys as headers
50
+ */
51
+ export const SimpleExport: Story = {
52
+ render: () => (
53
+ <Card>
54
+ <CardHeader>
55
+ <CardTitle>Simple Export Example</CardTitle>
56
+ </CardHeader>
57
+ <CardContent>
58
+ <Stack spacing="lg">
59
+ <Text>
60
+ Click the button below to export the products data to Excel. The export will automatically use
61
+ object keys as column headers.
62
+ </Text>
63
+
64
+ <div className="overflow-x-auto">
65
+ <table className="min-w-full border border-stone-200">
66
+ <thead className="bg-paper-100">
67
+ <tr>
68
+ <th className="px-4 py-2 text-left">ID</th>
69
+ <th className="px-4 py-2 text-left">Name</th>
70
+ <th className="px-4 py-2 text-left">Category</th>
71
+ <th className="px-4 py-2 text-left">Price</th>
72
+ <th className="px-4 py-2 text-left">Stock</th>
73
+ <th className="px-4 py-2 text-left">Active</th>
74
+ </tr>
75
+ </thead>
76
+ <tbody>
77
+ {products.map((product) => (
78
+ <tr key={product.id} className="border-t border-stone-200">
79
+ <td className="px-4 py-2">{product.id}</td>
80
+ <td className="px-4 py-2">{product.name}</td>
81
+ <td className="px-4 py-2">{product.category}</td>
82
+ <td className="px-4 py-2">${product.price}</td>
83
+ <td className="px-4 py-2">{product.stock}</td>
84
+ <td className="px-4 py-2">{product.active ? 'Yes' : 'No'}</td>
85
+ </tr>
86
+ ))}
87
+ </tbody>
88
+ </table>
89
+ </div>
90
+
91
+ <Button
92
+ variant="primary"
93
+ icon={<Download className="h-4 w-4" />}
94
+ onClick={() => {
95
+ exportToExcel({
96
+ data: products,
97
+ filename: 'products.xlsx',
98
+ });
99
+ }}
100
+ >
101
+ Export to Excel
102
+ </Button>
103
+
104
+ <div className="bg-paper-50 border border-stone-200 rounded p-4">
105
+ <Text size="sm" className="font-mono">
106
+ {`exportToExcel({\n data: products,\n filename: 'products.xlsx'\n});`}
107
+ </Text>
108
+ </div>
109
+ </Stack>
110
+ </CardContent>
111
+ </Card>
112
+ ),
113
+ };
114
+
115
+ /**
116
+ * Custom columns with formatting
117
+ */
118
+ export const CustomColumnsWithFormatting: Story = {
119
+ render: () => {
120
+ const columns: ExcelColumn[] = [
121
+ { key: 'id', label: 'Product ID' },
122
+ { key: 'name', label: 'Product Name' },
123
+ { key: 'category', label: 'Category' },
124
+ {
125
+ key: 'price',
126
+ label: 'Unit Price',
127
+ format: (value) => `$${value.toFixed(2)}`,
128
+ },
129
+ { key: 'stock', label: 'Quantity in Stock' },
130
+ {
131
+ key: 'active',
132
+ label: 'Status',
133
+ format: (value) => (value ? 'Active' : 'Inactive'),
134
+ },
135
+ ];
136
+
137
+ return (
138
+ <Card>
139
+ <CardHeader>
140
+ <CardTitle>Custom Columns with Formatting</CardTitle>
141
+ </CardHeader>
142
+ <CardContent>
143
+ <Stack spacing="lg">
144
+ <Text>
145
+ This example shows how to customize column headers, reorder columns, and apply formatting to
146
+ values before export.
147
+ </Text>
148
+
149
+ <div className="overflow-x-auto">
150
+ <table className="min-w-full border border-stone-200">
151
+ <thead className="bg-paper-100">
152
+ <tr>
153
+ {columns.map((col) => (
154
+ <th key={col.key} className="px-4 py-2 text-left">
155
+ {col.label}
156
+ </th>
157
+ ))}
158
+ </tr>
159
+ </thead>
160
+ <tbody>
161
+ {products.map((product) => (
162
+ <tr key={product.id} className="border-t border-stone-200">
163
+ <td className="px-4 py-2">{product.id}</td>
164
+ <td className="px-4 py-2">{product.name}</td>
165
+ <td className="px-4 py-2">{product.category}</td>
166
+ <td className="px-4 py-2">${product.price.toFixed(2)}</td>
167
+ <td className="px-4 py-2">{product.stock}</td>
168
+ <td className="px-4 py-2">{product.active ? 'Active' : 'Inactive'}</td>
169
+ </tr>
170
+ ))}
171
+ </tbody>
172
+ </table>
173
+ </div>
174
+
175
+ <Button
176
+ variant="primary"
177
+ icon={<FileSpreadsheet className="h-4 w-4" />}
178
+ onClick={() => {
179
+ exportToExcel({
180
+ data: products,
181
+ columns,
182
+ filename: 'products-formatted.xlsx',
183
+ });
184
+ }}
185
+ >
186
+ Export with Custom Formatting
187
+ </Button>
188
+
189
+ <div className="bg-paper-50 border border-stone-200 rounded p-4">
190
+ <Text size="sm" className="font-mono whitespace-pre-wrap">
191
+ {`const columns: ExcelColumn[] = [
192
+ { key: 'id', label: 'Product ID' },
193
+ { key: 'name', label: 'Product Name' },
194
+ { key: 'price', label: 'Unit Price', format: (val) => \`$\${val.toFixed(2)}\` },
195
+ { key: 'active', label: 'Status', format: (val) => val ? 'Active' : 'Inactive' }
196
+ ];
197
+
198
+ exportToExcel({ data: products, columns, filename: 'products.xlsx' });`}
199
+ </Text>
200
+ </div>
201
+ </Stack>
202
+ </CardContent>
203
+ </Card>
204
+ );
205
+ },
206
+ };
207
+
208
+ /**
209
+ * Export from DataTable
210
+ */
211
+ export const ExportFromDataTable: Story = {
212
+ render: () => {
213
+ const tableColumns: DataTableColumn<typeof users[0]>[] = [
214
+ { key: 'id', header: 'ID', sortable: true },
215
+ { key: 'name', header: 'Name', sortable: true },
216
+ { key: 'email', header: 'Email' },
217
+ { key: 'role', header: 'Role', sortable: true },
218
+ {
219
+ key: 'createdAt',
220
+ header: 'Created',
221
+ sortable: true,
222
+ render: (user) => new Date(user.createdAt).toLocaleDateString(),
223
+ },
224
+ {
225
+ key: 'isActive',
226
+ header: 'Status',
227
+ render: (user) => (user.isActive ? 'Active' : 'Inactive'),
228
+ },
229
+ ];
230
+
231
+ return (
232
+ <Card>
233
+ <CardHeader>
234
+ <CardTitle>Export DataTable Data</CardTitle>
235
+ </CardHeader>
236
+ <CardContent>
237
+ <Stack spacing="lg">
238
+ <Text>
239
+ This example shows how to export data displayed in a DataTable component using the{' '}
240
+ <code className="bg-paper-100 px-1 rounded">exportDataTableToExcel</code> helper function.
241
+ </Text>
242
+
243
+ <DataTable data={users} columns={tableColumns} />
244
+
245
+ <Button
246
+ variant="primary"
247
+ icon={<Download className="h-4 w-4" />}
248
+ onClick={() => {
249
+ exportDataTableToExcel({
250
+ data: users,
251
+ columns: tableColumns,
252
+ filename: 'users.xlsx',
253
+ });
254
+ }}
255
+ >
256
+ Export Users
257
+ </Button>
258
+
259
+ <div className="bg-paper-50 border border-stone-200 rounded p-4">
260
+ <Text size="sm" className="font-mono whitespace-pre-wrap">
261
+ {`exportDataTableToExcel({
262
+ data: users,
263
+ columns: tableColumns,
264
+ filename: 'users.xlsx'
265
+ });`}
266
+ </Text>
267
+ </div>
268
+ </Stack>
269
+ </CardContent>
270
+ </Card>
271
+ );
272
+ },
273
+ };
274
+
275
+ /**
276
+ * Multi-sheet export
277
+ */
278
+ export const MultiSheetExport: Story = {
279
+ render: () => (
280
+ <Card>
281
+ <CardHeader>
282
+ <CardTitle>Multi-Sheet Excel Export</CardTitle>
283
+ </CardHeader>
284
+ <CardContent>
285
+ <Stack spacing="lg">
286
+ <Text>
287
+ Export multiple datasets to a single Excel file with separate sheets using{' '}
288
+ <code className="bg-paper-100 px-1 rounded">createMultiSheetExcel</code>.
289
+ </Text>
290
+
291
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
292
+ <div>
293
+ <Text weight="semibold" className="mb-2">
294
+ Products ({products.length} items)
295
+ </Text>
296
+ <div className="text-sm text-ink-600">
297
+ {products.map((p) => (
298
+ <div key={p.id}>
299
+ {p.name} - ${p.price}
300
+ </div>
301
+ ))}
302
+ </div>
303
+ </div>
304
+
305
+ <div>
306
+ <Text weight="semibold" className="mb-2">
307
+ Orders ({orders.length} items)
308
+ </Text>
309
+ <div className="text-sm text-ink-600">
310
+ {orders.map((o) => (
311
+ <div key={o.orderId}>
312
+ {o.orderId} - ${o.amount}
313
+ </div>
314
+ ))}
315
+ </div>
316
+ </div>
317
+ </div>
318
+
319
+ <Button
320
+ variant="primary"
321
+ icon={<FileSpreadsheet className="h-4 w-4" />}
322
+ onClick={() => {
323
+ createMultiSheetExcel({
324
+ filename: 'business-report.xlsx',
325
+ sheets: [
326
+ {
327
+ name: 'Products',
328
+ data: products,
329
+ },
330
+ {
331
+ name: 'Orders',
332
+ data: orders,
333
+ columns: [
334
+ { key: 'orderId', label: 'Order ID' },
335
+ { key: 'customer', label: 'Customer Name' },
336
+ {
337
+ key: 'amount',
338
+ label: 'Amount',
339
+ format: (val) => `$${val.toLocaleString()}`,
340
+ },
341
+ {
342
+ key: 'date',
343
+ label: 'Order Date',
344
+ format: (val) => new Date(val).toLocaleDateString(),
345
+ },
346
+ { key: 'status', label: 'Status' },
347
+ ],
348
+ },
349
+ {
350
+ name: 'Users',
351
+ data: users,
352
+ },
353
+ ],
354
+ });
355
+ }}
356
+ >
357
+ Export Multi-Sheet Report
358
+ </Button>
359
+
360
+ <div className="bg-paper-50 border border-stone-200 rounded p-4">
361
+ <Text size="sm" className="font-mono whitespace-pre-wrap">
362
+ {`createMultiSheetExcel({
363
+ filename: 'business-report.xlsx',
364
+ sheets: [
365
+ { name: 'Products', data: products },
366
+ { name: 'Orders', data: orders, columns: orderColumns },
367
+ { name: 'Users', data: users }
368
+ ]
369
+ });`}
370
+ </Text>
371
+ </div>
372
+ </Stack>
373
+ </CardContent>
374
+ </Card>
375
+ ),
376
+ };
377
+
378
+ /**
379
+ * Integration with ExportButton
380
+ */
381
+ export const WithExportButton: Story = {
382
+ render: () => {
383
+ const handleExport = async (format: 'csv' | 'excel' | 'pdf') => {
384
+ if (format === 'excel') {
385
+ exportToExcel({
386
+ data: products,
387
+ filename: 'products.xlsx',
388
+ columns: [
389
+ { key: 'id', label: 'ID' },
390
+ { key: 'name', label: 'Product Name' },
391
+ { key: 'category', label: 'Category' },
392
+ { key: 'price', label: 'Price', format: (val) => `$${val.toFixed(2)}` },
393
+ { key: 'stock', label: 'Stock' },
394
+ { key: 'active', label: 'Status', format: (val) => (val ? 'Active' : 'Inactive') },
395
+ ],
396
+ });
397
+ } else if (format === 'csv') {
398
+ console.log('CSV export not implemented in this example');
399
+ } else if (format === 'pdf') {
400
+ console.log('PDF export not implemented in this example');
401
+ }
402
+ };
403
+
404
+ return (
405
+ <Card>
406
+ <CardHeader>
407
+ <CardTitle>ExportButton Integration</CardTitle>
408
+ </CardHeader>
409
+ <CardContent>
410
+ <Stack spacing="lg">
411
+ <Text>
412
+ Combine the <code className="bg-paper-100 px-1 rounded">exportToExcel</code> utility with the{' '}
413
+ <code className="bg-paper-100 px-1 rounded">ExportButton</code> component for a complete export
414
+ solution.
415
+ </Text>
416
+
417
+ <DataTable
418
+ data={products}
419
+ columns={[
420
+ { key: 'id', header: 'ID' },
421
+ { key: 'name', header: 'Name' },
422
+ { key: 'category', header: 'Category' },
423
+ { key: 'price', header: 'Price', render: (item) => `$${item.price}` },
424
+ { key: 'stock', header: 'Stock' },
425
+ ]}
426
+ />
427
+
428
+ <Stack direction="horizontal" spacing="md">
429
+ <ExportButton onExport={handleExport} formats={['excel']} label="Export to Excel" />
430
+ <ExportButton
431
+ onExport={handleExport}
432
+ formats={['excel', 'csv', 'pdf']}
433
+ label="Export"
434
+ showFormatMenu
435
+ />
436
+ </Stack>
437
+
438
+ <div className="bg-paper-50 border border-stone-200 rounded p-4">
439
+ <Text size="sm" className="font-mono whitespace-pre-wrap">
440
+ {`const handleExport = async (format) => {
441
+ if (format === 'excel') {
442
+ exportToExcel({ data, columns, filename: 'data.xlsx' });
443
+ }
444
+ };
445
+
446
+ <ExportButton onExport={handleExport} formats={['excel']} />`}
447
+ </Text>
448
+ </div>
449
+ </Stack>
450
+ </CardContent>
451
+ </Card>
452
+ );
453
+ },
454
+ };
455
+
456
+ /**
457
+ * Date formatting example
458
+ */
459
+ export const DateFormatting: Story = {
460
+ render: () => {
461
+ const columns: ExcelColumn[] = [
462
+ { key: 'orderId', label: 'Order ID' },
463
+ { key: 'customer', label: 'Customer' },
464
+ {
465
+ key: 'amount',
466
+ label: 'Amount',
467
+ format: (val) => `$${val.toLocaleString('en-US', { minimumFractionDigits: 2 })}`,
468
+ },
469
+ {
470
+ key: 'date',
471
+ label: 'Order Date',
472
+ format: (val) => new Date(val).toLocaleDateString('en-US', {
473
+ year: 'numeric',
474
+ month: 'long',
475
+ day: 'numeric'
476
+ }),
477
+ },
478
+ { key: 'status', label: 'Status' },
479
+ ];
480
+
481
+ return (
482
+ <Card>
483
+ <CardHeader>
484
+ <CardTitle>Date and Number Formatting</CardTitle>
485
+ </CardHeader>
486
+ <CardContent>
487
+ <Stack spacing="lg">
488
+ <Text>
489
+ This example demonstrates how to format dates, numbers, and currency values for export.
490
+ </Text>
491
+
492
+ <div className="overflow-x-auto">
493
+ <table className="min-w-full border border-stone-200">
494
+ <thead className="bg-paper-100">
495
+ <tr>
496
+ {columns.map((col) => (
497
+ <th key={col.key} className="px-4 py-2 text-left">
498
+ {col.label}
499
+ </th>
500
+ ))}
501
+ </tr>
502
+ </thead>
503
+ <tbody>
504
+ {orders.map((order, idx) => (
505
+ <tr key={idx} className="border-t border-stone-200">
506
+ <td className="px-4 py-2">{order.orderId}</td>
507
+ <td className="px-4 py-2">{order.customer}</td>
508
+ <td className="px-4 py-2">${order.amount.toLocaleString()}</td>
509
+ <td className="px-4 py-2">{order.date.toLocaleDateString()}</td>
510
+ <td className="px-4 py-2">{order.status}</td>
511
+ </tr>
512
+ ))}
513
+ </tbody>
514
+ </table>
515
+ </div>
516
+
517
+ <Button
518
+ variant="primary"
519
+ icon={<Download className="h-4 w-4" />}
520
+ onClick={() => {
521
+ exportToExcel({
522
+ data: orders,
523
+ columns,
524
+ filename: 'orders.xlsx',
525
+ });
526
+ }}
527
+ >
528
+ Export Orders
529
+ </Button>
530
+ </Stack>
531
+ </CardContent>
532
+ </Card>
533
+ );
534
+ },
535
+ };