@nccirtu/tablefy 0.8.4 → 0.9.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/README.md +224 -200
- package/dist/columns/forms/builders/actions-builder.d.ts +14 -0
- package/dist/columns/forms/builders/form-schema.d.ts +35 -0
- package/dist/columns/forms/builders/index.d.ts +5 -0
- package/dist/columns/forms/builders/section-builder.d.ts +16 -0
- package/dist/columns/forms/builders/tab-builder.d.ts +16 -0
- package/dist/columns/forms/builders/wizard-builder.d.ts +17 -0
- package/dist/columns/forms/components/field-renderer.d.ts +12 -0
- package/dist/columns/forms/components/form-actions.d.ts +9 -0
- package/dist/columns/forms/components/form-renderer.d.ts +14 -0
- package/dist/columns/forms/components/grid-layout.d.ts +7 -0
- package/dist/columns/forms/components/index.d.ts +9 -0
- package/dist/columns/forms/components/section-renderer.d.ts +14 -0
- package/dist/columns/forms/components/tab-renderer.d.ts +15 -0
- package/dist/columns/forms/components/wizard-renderer.d.ts +17 -0
- package/dist/columns/forms/fields/base-field.d.ts +24 -0
- package/dist/columns/forms/fields/checkbox-group.d.ts +12 -0
- package/dist/columns/forms/fields/checkbox.d.ts +9 -0
- package/dist/columns/forms/fields/date-picker.d.ts +15 -0
- package/dist/columns/forms/fields/file-upload.d.ts +17 -0
- package/dist/columns/forms/fields/hidden.d.ts +9 -0
- package/dist/columns/forms/fields/index.d.ts +12 -0
- package/dist/columns/forms/fields/radio-group.d.ts +14 -0
- package/dist/columns/forms/fields/repeater.d.ts +21 -0
- package/dist/columns/forms/fields/select.d.ts +16 -0
- package/dist/columns/forms/fields/text-input.d.ts +20 -0
- package/dist/columns/forms/fields/textarea.d.ts +14 -0
- package/dist/columns/forms/fields/toggle.d.ts +11 -0
- package/dist/columns/forms/index.d.ts +26 -0
- package/dist/columns/forms/types/actions.d.ts +11 -0
- package/dist/columns/forms/types/field.d.ts +98 -0
- package/dist/columns/forms/types/form.d.ts +37 -0
- package/dist/columns/forms/types/index.d.ts +4 -0
- package/dist/columns/forms/types/layout.d.ts +31 -0
- package/dist/columns/index.d.ts +2 -0
- package/dist/columns/inertia/index.d.ts +4 -0
- package/dist/columns/inertia/precognition.d.ts +6 -0
- package/dist/columns/inertia/types.d.ts +63 -0
- package/dist/columns/inertia/use-inertia-form.d.ts +2 -0
- package/dist/columns/inertia/use-server-table.d.ts +2 -0
- package/dist/forms/builders/actions-builder.d.ts +14 -0
- package/dist/forms/builders/empty-state.d.ts +46 -0
- package/dist/forms/builders/form-schema.d.ts +35 -0
- package/dist/forms/builders/index.d.ts +2 -0
- package/dist/forms/builders/section-builder.d.ts +16 -0
- package/dist/forms/builders/tab-builder.d.ts +16 -0
- package/dist/forms/builders/table-schema.d.ts +45 -0
- package/dist/forms/builders/wizard-builder.d.ts +17 -0
- package/dist/forms/columns/actions-column.d.ts +26 -0
- package/dist/forms/columns/avatar-group-column.d.ts +38 -0
- package/dist/forms/columns/badge-column.d.ts +29 -0
- package/dist/forms/columns/base-column.d.ts +21 -0
- package/dist/forms/columns/button-column.d.ts +14 -0
- package/dist/forms/columns/checkbox-column.d.ts +5 -0
- package/dist/forms/columns/date-column.d.ts +24 -0
- package/dist/forms/columns/dropdown-column.d.ts +17 -0
- package/dist/forms/columns/enum-column.d.ts +52 -0
- package/dist/forms/columns/icon-column.d.ts +58 -0
- package/dist/forms/columns/image-column.d.ts +21 -0
- package/dist/forms/columns/index.d.ts +18 -0
- package/dist/forms/columns/input-column.d.ts +27 -0
- package/dist/forms/columns/link-column.d.ts +27 -0
- package/dist/forms/columns/number-column.d.ts +23 -0
- package/dist/forms/columns/progress-column.d.ts +30 -0
- package/dist/forms/columns/select-column.d.ts +24 -0
- package/dist/forms/columns/text-column.d.ts +14 -0
- package/dist/forms/columns/types.d.ts +46 -0
- package/dist/forms/components/field-renderer.d.ts +12 -0
- package/dist/forms/components/form-actions.d.ts +9 -0
- package/dist/forms/components/form-renderer.d.ts +14 -0
- package/dist/forms/components/grid-layout.d.ts +7 -0
- package/dist/forms/components/index.d.ts +9 -0
- package/dist/forms/components/section-renderer.d.ts +14 -0
- package/dist/forms/components/tab-renderer.d.ts +15 -0
- package/dist/forms/components/wizard-renderer.d.ts +17 -0
- package/dist/forms/confirm/ConfirmProvider.d.ts +6 -0
- package/dist/forms/confirm/confirm.d.ts +3 -0
- package/dist/forms/confirm/index.d.ts +3 -0
- package/dist/forms/confirm/types.d.ts +10 -0
- package/dist/forms/fields/base-field.d.ts +24 -0
- package/dist/forms/fields/checkbox-group.d.ts +12 -0
- package/dist/forms/fields/checkbox.d.ts +9 -0
- package/dist/forms/fields/date-picker.d.ts +15 -0
- package/dist/forms/fields/file-upload.d.ts +17 -0
- package/dist/forms/fields/hidden.d.ts +9 -0
- package/dist/forms/fields/index.d.ts +12 -0
- package/dist/forms/fields/radio-group.d.ts +14 -0
- package/dist/forms/fields/repeater.d.ts +21 -0
- package/dist/forms/fields/select.d.ts +16 -0
- package/dist/forms/fields/text-input.d.ts +20 -0
- package/dist/forms/fields/textarea.d.ts +14 -0
- package/dist/forms/fields/toggle.d.ts +11 -0
- package/dist/forms/forms/builders/actions-builder.d.ts +14 -0
- package/dist/forms/forms/builders/form-schema.d.ts +35 -0
- package/dist/forms/forms/builders/index.d.ts +5 -0
- package/dist/forms/forms/builders/section-builder.d.ts +16 -0
- package/dist/forms/forms/builders/tab-builder.d.ts +16 -0
- package/dist/forms/forms/builders/wizard-builder.d.ts +17 -0
- package/dist/forms/forms/components/field-renderer.d.ts +12 -0
- package/dist/forms/forms/components/form-actions.d.ts +9 -0
- package/dist/forms/forms/components/form-renderer.d.ts +14 -0
- package/dist/forms/forms/components/grid-layout.d.ts +7 -0
- package/dist/forms/forms/components/index.d.ts +9 -0
- package/dist/forms/forms/components/section-renderer.d.ts +14 -0
- package/dist/forms/forms/components/tab-renderer.d.ts +15 -0
- package/dist/forms/forms/components/wizard-renderer.d.ts +17 -0
- package/dist/forms/forms/fields/base-field.d.ts +24 -0
- package/dist/forms/forms/fields/checkbox-group.d.ts +12 -0
- package/dist/forms/forms/fields/checkbox.d.ts +9 -0
- package/dist/forms/forms/fields/date-picker.d.ts +15 -0
- package/dist/forms/forms/fields/file-upload.d.ts +17 -0
- package/dist/forms/forms/fields/hidden.d.ts +9 -0
- package/dist/forms/forms/fields/index.d.ts +12 -0
- package/dist/forms/forms/fields/radio-group.d.ts +14 -0
- package/dist/forms/forms/fields/repeater.d.ts +21 -0
- package/dist/forms/forms/fields/select.d.ts +16 -0
- package/dist/forms/forms/fields/text-input.d.ts +20 -0
- package/dist/forms/forms/fields/textarea.d.ts +14 -0
- package/dist/forms/forms/fields/toggle.d.ts +11 -0
- package/dist/forms/forms/index.d.ts +26 -0
- package/dist/forms/forms/types/actions.d.ts +11 -0
- package/dist/forms/forms/types/field.d.ts +98 -0
- package/dist/forms/forms/types/form.d.ts +37 -0
- package/dist/forms/forms/types/index.d.ts +4 -0
- package/dist/forms/forms/types/layout.d.ts +31 -0
- package/dist/forms/index.d.ts +25 -0
- package/dist/forms/index.esm.js +1052 -0
- package/dist/forms/index.esm.js.map +1 -0
- package/dist/forms/index.js +1077 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/inertia/index.d.ts +4 -0
- package/dist/forms/inertia/precognition.d.ts +6 -0
- package/dist/forms/inertia/types.d.ts +63 -0
- package/dist/forms/inertia/use-inertia-form.d.ts +2 -0
- package/dist/forms/inertia/use-server-table.d.ts +2 -0
- package/dist/forms/tablefy/avatar-list.d.ts +15 -0
- package/dist/forms/tablefy/data-table-empty.d.ts +8 -0
- package/dist/forms/tablefy/data-table-header.d.ts +17 -0
- package/dist/forms/tablefy/data-table-pagination.d.ts +9 -0
- package/dist/forms/tablefy/data-table-schema.d.ts +1 -0
- package/dist/forms/tablefy/data-table.d.ts +13 -0
- package/dist/forms/tablefy/index.d.ts +6 -0
- package/dist/forms/types/actions.d.ts +21 -0
- package/dist/forms/types/empty-state.d.ts +18 -0
- package/dist/forms/types/field.d.ts +98 -0
- package/dist/forms/types/filters.d.ts +25 -0
- package/dist/forms/types/form.d.ts +37 -0
- package/dist/forms/types/index.d.ts +4 -0
- package/dist/forms/types/layout.d.ts +31 -0
- package/dist/forms/types/table.d.ts +42 -0
- package/dist/forms/utils.d.ts +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +1050 -9
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1058 -0
- package/dist/index.js.map +1 -1
- package/dist/inertia/builders/empty-state.d.ts +46 -0
- package/dist/inertia/builders/index.d.ts +2 -0
- package/dist/inertia/builders/table-schema.d.ts +45 -0
- package/dist/inertia/columns/actions-column.d.ts +26 -0
- package/dist/inertia/columns/avatar-group-column.d.ts +38 -0
- package/dist/inertia/columns/badge-column.d.ts +29 -0
- package/dist/inertia/columns/base-column.d.ts +21 -0
- package/dist/inertia/columns/button-column.d.ts +14 -0
- package/dist/inertia/columns/checkbox-column.d.ts +5 -0
- package/dist/inertia/columns/date-column.d.ts +24 -0
- package/dist/inertia/columns/dropdown-column.d.ts +17 -0
- package/dist/inertia/columns/enum-column.d.ts +52 -0
- package/dist/inertia/columns/icon-column.d.ts +58 -0
- package/dist/inertia/columns/image-column.d.ts +21 -0
- package/dist/inertia/columns/index.d.ts +18 -0
- package/dist/inertia/columns/input-column.d.ts +27 -0
- package/dist/inertia/columns/link-column.d.ts +27 -0
- package/dist/inertia/columns/number-column.d.ts +23 -0
- package/dist/inertia/columns/progress-column.d.ts +30 -0
- package/dist/inertia/columns/select-column.d.ts +24 -0
- package/dist/inertia/columns/text-column.d.ts +14 -0
- package/dist/inertia/columns/types.d.ts +46 -0
- package/dist/inertia/confirm/ConfirmProvider.d.ts +6 -0
- package/dist/inertia/confirm/confirm.d.ts +3 -0
- package/dist/inertia/confirm/index.d.ts +3 -0
- package/dist/inertia/confirm/types.d.ts +10 -0
- package/dist/inertia/forms/builders/actions-builder.d.ts +14 -0
- package/dist/inertia/forms/builders/form-schema.d.ts +35 -0
- package/dist/inertia/forms/builders/index.d.ts +5 -0
- package/dist/inertia/forms/builders/section-builder.d.ts +16 -0
- package/dist/inertia/forms/builders/tab-builder.d.ts +16 -0
- package/dist/inertia/forms/builders/wizard-builder.d.ts +17 -0
- package/dist/inertia/forms/components/field-renderer.d.ts +12 -0
- package/dist/inertia/forms/components/form-actions.d.ts +9 -0
- package/dist/inertia/forms/components/form-renderer.d.ts +14 -0
- package/dist/inertia/forms/components/grid-layout.d.ts +7 -0
- package/dist/inertia/forms/components/index.d.ts +9 -0
- package/dist/inertia/forms/components/section-renderer.d.ts +14 -0
- package/dist/inertia/forms/components/tab-renderer.d.ts +15 -0
- package/dist/inertia/forms/components/wizard-renderer.d.ts +17 -0
- package/dist/inertia/forms/fields/base-field.d.ts +24 -0
- package/dist/inertia/forms/fields/checkbox-group.d.ts +12 -0
- package/dist/inertia/forms/fields/checkbox.d.ts +9 -0
- package/dist/inertia/forms/fields/date-picker.d.ts +15 -0
- package/dist/inertia/forms/fields/file-upload.d.ts +17 -0
- package/dist/inertia/forms/fields/hidden.d.ts +9 -0
- package/dist/inertia/forms/fields/index.d.ts +12 -0
- package/dist/inertia/forms/fields/radio-group.d.ts +14 -0
- package/dist/inertia/forms/fields/repeater.d.ts +21 -0
- package/dist/inertia/forms/fields/select.d.ts +16 -0
- package/dist/inertia/forms/fields/text-input.d.ts +20 -0
- package/dist/inertia/forms/fields/textarea.d.ts +14 -0
- package/dist/inertia/forms/fields/toggle.d.ts +11 -0
- package/dist/inertia/forms/index.d.ts +26 -0
- package/dist/inertia/forms/types/actions.d.ts +11 -0
- package/dist/inertia/forms/types/field.d.ts +98 -0
- package/dist/inertia/forms/types/form.d.ts +37 -0
- package/dist/inertia/forms/types/index.d.ts +4 -0
- package/dist/inertia/forms/types/layout.d.ts +31 -0
- package/dist/inertia/index.d.ts +25 -0
- package/dist/inertia/index.esm.js +149 -0
- package/dist/inertia/index.esm.js.map +1 -0
- package/dist/inertia/index.js +153 -0
- package/dist/inertia/index.js.map +1 -0
- package/dist/inertia/inertia/index.d.ts +4 -0
- package/dist/inertia/inertia/precognition.d.ts +6 -0
- package/dist/inertia/inertia/types.d.ts +63 -0
- package/dist/inertia/inertia/use-inertia-form.d.ts +2 -0
- package/dist/inertia/inertia/use-server-table.d.ts +2 -0
- package/dist/inertia/precognition.d.ts +6 -0
- package/dist/inertia/tablefy/avatar-list.d.ts +15 -0
- package/dist/inertia/tablefy/data-table-empty.d.ts +8 -0
- package/dist/inertia/tablefy/data-table-header.d.ts +17 -0
- package/dist/inertia/tablefy/data-table-pagination.d.ts +9 -0
- package/dist/inertia/tablefy/data-table-schema.d.ts +1 -0
- package/dist/inertia/tablefy/data-table.d.ts +13 -0
- package/dist/inertia/tablefy/index.d.ts +6 -0
- package/dist/inertia/types/actions.d.ts +21 -0
- package/dist/inertia/types/empty-state.d.ts +18 -0
- package/dist/inertia/types/filters.d.ts +25 -0
- package/dist/inertia/types/index.d.ts +4 -0
- package/dist/inertia/types/table.d.ts +42 -0
- package/dist/inertia/types.d.ts +63 -0
- package/dist/inertia/use-inertia-form.d.ts +2 -0
- package/dist/inertia/use-server-table.d.ts +2 -0
- package/dist/inertia/utils.d.ts +1 -0
- package/package.json +39 -13
package/README.md
CHANGED
|
@@ -1,20 +1,34 @@
|
|
|
1
1
|
# Tablefy
|
|
2
2
|
|
|
3
|
-
A powerful, type-safe React
|
|
3
|
+
A powerful, type-safe React toolkit for building schema-driven **Data Tables** and **Forms**. Built on [shadcn/ui](https://ui.shadcn.com/) and designed for [Laravel](https://laravel.com/) + [Inertia.js v2](https://inertiajs.com/) + [Wayfinder](https://github.com/laravel/wayfinder).
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
+
### Data Tables
|
|
7
8
|
- **Beautiful UI** - Built on shadcn/ui components with Tailwind CSS
|
|
8
9
|
- **Search & Filter** - Built-in search and advanced filtering
|
|
9
|
-
- **Sorting & Pagination** - Full sorting and pagination support
|
|
10
|
-
- **
|
|
11
|
-
- **Fluent API** - Chainable builder pattern for easy configuration
|
|
12
|
-
- **Responsive** - Mobile-friendly responsive design
|
|
13
|
-
- **Rich Columns** - 12+ specialized column types with custom builders
|
|
14
|
-
- **Custom Actions** - Render complex UI in actions with custom render functions
|
|
10
|
+
- **Sorting & Pagination** - Full sorting and pagination support (client & server-side)
|
|
11
|
+
- **14+ Column Types** - Text, Badge, Date, Link, Progress, Avatar, Icon, Image, Actions, and more
|
|
15
12
|
- **Confirm Dialogs** - Built-in confirmation system for destructive actions
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
|
|
14
|
+
### Forms
|
|
15
|
+
- **Schema-Driven** - Define forms with a fluent builder API
|
|
16
|
+
- **11 Field Types** - TextInput, Textarea, Select, Checkbox, CheckboxGroup, Toggle, RadioGroup, DatePicker, FileUpload, Repeater, Hidden
|
|
17
|
+
- **Layout Builders** - Sections (collapsible cards), Tabs, Wizard (multi-step)
|
|
18
|
+
- **Field Dependencies** - Show/hide/enable/disable fields based on other field values
|
|
19
|
+
- **Grid Layout** - Responsive multi-column grids with columnSpan support
|
|
20
|
+
|
|
21
|
+
### Inertia.js Integration
|
|
22
|
+
- **useInertiaForm** - Bridge FormSchema with Inertia's `useForm` for seamless state management
|
|
23
|
+
- **useServerTable** - Server-side pagination, sorting, and filtering with `router.visit()`
|
|
24
|
+
- **Precognition** - Live server-side validation on field blur
|
|
25
|
+
- **Wayfinder** - Type-safe route helpers as form action URLs
|
|
26
|
+
|
|
27
|
+
### Core
|
|
28
|
+
- **Type-Safe** - Complete TypeScript support with generics and type inference
|
|
29
|
+
- **Fluent API** - Chainable builder pattern for easy, readable configuration
|
|
30
|
+
- **Tree-Shakeable** - Sub-path exports (`/forms`, `/inertia`, `/columns`) for optimal bundle size
|
|
31
|
+
- **Zero Breaking Changes** - Forms and Inertia are purely additive to the existing table API
|
|
18
32
|
|
|
19
33
|
## Installation
|
|
20
34
|
|
|
@@ -22,79 +36,54 @@ A powerful, type-safe React table package built with TanStack Table and shadcn/u
|
|
|
22
36
|
npm install @nccirtu/tablefy
|
|
23
37
|
```
|
|
24
38
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
### Two Ways to Use Tablefy
|
|
28
|
-
|
|
29
|
-
Tablefy offers **two approaches** to fit your workflow:
|
|
30
|
-
|
|
31
|
-
#### 🚀 **Quick Start (Direct Import)**
|
|
32
|
-
|
|
33
|
-
Import components directly from the package - perfect for getting started quickly:
|
|
34
|
-
|
|
35
|
-
```tsx
|
|
36
|
-
import { DataTable, TableSchema, TextColumn } from "@nccirtu/tablefy";
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
✅ **Pros:** Zero setup, works immediately after installation
|
|
40
|
-
❌ **Cons:** Limited customization of internal components
|
|
41
|
-
|
|
42
|
-
#### 🛠️ **Full Control (CLI Installation)**
|
|
43
|
-
|
|
44
|
-
Copy components to your project for complete customization:
|
|
39
|
+
**Quick setup with CLI:**
|
|
45
40
|
|
|
46
41
|
```bash
|
|
47
42
|
npx tablefy init
|
|
48
43
|
```
|
|
49
44
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
- Customize styles and behavior
|
|
53
|
-
- Modify internal components
|
|
54
|
-
- Full control over the code
|
|
55
|
-
|
|
56
|
-
✅ **Pros:** Complete customization freedom
|
|
57
|
-
❌ **Cons:** Requires CLI setup step
|
|
45
|
+
### Peer Dependencies
|
|
58
46
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
47
|
+
```bash
|
|
48
|
+
# Core (required)
|
|
49
|
+
npm install @tanstack/react-table lucide-react class-variance-authority clsx tailwind-merge
|
|
62
50
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
3. **Tailwind configuration** (for styling)
|
|
51
|
+
# shadcn/ui components (install what you need)
|
|
52
|
+
npx shadcn@latest add button table checkbox dropdown-menu input select badge progress tooltip label card tabs textarea switch radio-group calendar popover separator
|
|
66
53
|
|
|
67
|
-
|
|
54
|
+
# Optional: Inertia.js integration
|
|
55
|
+
npm install @inertiajs/react
|
|
68
56
|
|
|
69
|
-
|
|
57
|
+
# Optional: Zod validation
|
|
58
|
+
npm install zod
|
|
59
|
+
```
|
|
70
60
|
|
|
71
|
-
|
|
72
|
-
# 1. Install dependencies
|
|
73
|
-
npm install @tanstack/react-table lucide-react class-variance-authority clsx tailwind-merge
|
|
61
|
+
### Configure Tailwind
|
|
74
62
|
|
|
75
|
-
|
|
76
|
-
npx shadcn@latest add button table checkbox dropdown-menu input select badge progress tooltip
|
|
63
|
+
**Tailwind v4 (Laravel 12):**
|
|
77
64
|
|
|
78
|
-
|
|
65
|
+
```css
|
|
66
|
+
@import "tailwindcss";
|
|
67
|
+
@source '../../node_modules/@nccirtu/tablefy/dist';
|
|
68
|
+
```
|
|
79
69
|
|
|
80
|
-
|
|
81
|
-
# See INSTALLATION.md Step 6 for details
|
|
70
|
+
**Tailwind v3:**
|
|
82
71
|
|
|
83
|
-
|
|
72
|
+
```js
|
|
73
|
+
module.exports = {
|
|
74
|
+
content: [
|
|
75
|
+
"./src/**/*.{js,ts,jsx,tsx}",
|
|
76
|
+
"./node_modules/@nccirtu/tablefy/dist/**/*.{js,mjs}",
|
|
77
|
+
],
|
|
78
|
+
};
|
|
84
79
|
```
|
|
85
80
|
|
|
86
|
-
|
|
81
|
+
See the [full installation guide](./docs/INSTALLATION.md) for framework-specific instructions.
|
|
87
82
|
|
|
88
|
-
## Quick Start
|
|
83
|
+
## Quick Start: Data Table
|
|
89
84
|
|
|
90
85
|
```tsx
|
|
91
|
-
import {
|
|
92
|
-
DataTable,
|
|
93
|
-
TableSchema,
|
|
94
|
-
TextColumn,
|
|
95
|
-
BadgeColumn,
|
|
96
|
-
DateColumn,
|
|
97
|
-
} from "tablefy";
|
|
86
|
+
import { DataTable, TableSchema, TextColumn, BadgeColumn, DateColumn } from "@nccirtu/tablefy";
|
|
98
87
|
|
|
99
88
|
type User = {
|
|
100
89
|
id: string;
|
|
@@ -107,14 +96,11 @@ type User = {
|
|
|
107
96
|
const columns = TableSchema.make<User>()
|
|
108
97
|
.columns(
|
|
109
98
|
TextColumn.make("name").label("Name").sortable(),
|
|
110
|
-
|
|
111
99
|
TextColumn.make("email").label("Email").limit(30),
|
|
112
|
-
|
|
113
100
|
BadgeColumn.make("status").label("Status").variants({
|
|
114
101
|
active: "success",
|
|
115
102
|
inactive: "secondary",
|
|
116
103
|
}),
|
|
117
|
-
|
|
118
104
|
DateColumn.make("createdAt").label("Created").relative(),
|
|
119
105
|
)
|
|
120
106
|
.build();
|
|
@@ -133,162 +119,198 @@ function UsersTable({ users }: { users: User[] }) {
|
|
|
133
119
|
}
|
|
134
120
|
```
|
|
135
121
|
|
|
136
|
-
##
|
|
137
|
-
|
|
138
|
-
Tablefy provides 12+ specialized column types, each with their own builder methods:
|
|
139
|
-
|
|
140
|
-
| Column Type | Description | Key Methods |
|
|
141
|
-
| ------------------- | -------------------- | ------------------------------------------------------------------------- |
|
|
142
|
-
| `TextColumn` | Simple text display | `sortable()`, `prefix()`, `suffix()`, `limit()`, `uppercase()` |
|
|
143
|
-
| `NumberColumn` | Numbers & currency | `money()`, `percent()`, `decimals()`, `locale()` |
|
|
144
|
-
| `DateColumn` | Dates & times | `short()`, `long()`, `relative()`, `datetime()`, `withIcon()` |
|
|
145
|
-
| `BadgeColumn` | Status badges | `variants()`, `boolean()`, `status()` |
|
|
146
|
-
| `LinkColumn` | Clickable links | `href()`, `external()`, `underline()`, `openInNewTab()` |
|
|
147
|
-
| `ProgressColumn` | Progress bars | `max()`, `colorByThreshold()`, `showPercentage()`, `format()` |
|
|
148
|
-
| `AvatarGroupColumn` | Avatar groups | `maxVisible()`, `size()`, `overlap()`, `fields()`, `showNames()` |
|
|
149
|
-
| `IconColumn` | Status icons | `boolean()`, `priority()`, `onlineStatus()`, `verification()`, `states()` |
|
|
150
|
-
| `ImageColumn` | Single images | `size()`, `rounded()`, `circular()`, `fallback()` |
|
|
151
|
-
| `CheckboxColumn` | Selection checkboxes | — |
|
|
152
|
-
| `ActionsColumn` | Dropdown menus | `view()`, `edit()`, `delete()`, `action()`, `link()` |
|
|
153
|
-
|
|
154
|
-
## Example: Project Management Table
|
|
122
|
+
## Quick Start: Form
|
|
155
123
|
|
|
156
124
|
```tsx
|
|
157
|
-
import {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
LinkColumn,
|
|
162
|
-
ProgressColumn,
|
|
163
|
-
AvatarGroupColumn,
|
|
164
|
-
IconColumn,
|
|
165
|
-
DateColumn,
|
|
166
|
-
ActionsColumn,
|
|
167
|
-
} from "tablefy";
|
|
168
|
-
|
|
169
|
-
type Project = {
|
|
170
|
-
id: string;
|
|
125
|
+
import { FormSchema, TextInput, Select, Textarea, FormRenderer } from "@nccirtu/tablefy/forms";
|
|
126
|
+
import { useState } from "react";
|
|
127
|
+
|
|
128
|
+
type CreateUser = {
|
|
171
129
|
name: string;
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
status: "active" | "inactive";
|
|
176
|
-
isPublic: boolean;
|
|
177
|
-
team: Array<{ name: string; avatar?: string }>;
|
|
178
|
-
deadline: Date;
|
|
130
|
+
email: string;
|
|
131
|
+
role: string;
|
|
132
|
+
bio: string;
|
|
179
133
|
};
|
|
180
134
|
|
|
181
|
-
|
|
182
|
-
.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
.
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
IconColumn.make("priority")
|
|
200
|
-
.label("Priority")
|
|
201
|
-
.sortable()
|
|
202
|
-
.priority()
|
|
203
|
-
.withBackground(),
|
|
204
|
-
|
|
205
|
-
IconColumn.make("status").label("Status").activeInactive(),
|
|
206
|
-
|
|
207
|
-
IconColumn.make("isPublic")
|
|
208
|
-
.label("Visibility")
|
|
209
|
-
.boolean({
|
|
210
|
-
trueLabel: "Public",
|
|
211
|
-
falseLabel: "Private",
|
|
212
|
-
})
|
|
213
|
-
.showLabel(),
|
|
214
|
-
|
|
215
|
-
AvatarGroupColumn.make("team")
|
|
216
|
-
.label("Team")
|
|
217
|
-
.maxVisible(3)
|
|
218
|
-
.size("sm")
|
|
219
|
-
.fields({ name: "name", src: "avatar" }),
|
|
220
|
-
|
|
221
|
-
DateColumn.make("deadline").label("Deadline").sortable().relative(),
|
|
222
|
-
|
|
223
|
-
ActionsColumn.make<Project>()
|
|
224
|
-
.view((row) => (window.location.href = `/projects/${row.id}`))
|
|
225
|
-
.edit((row) => console.log("Edit", row.id))
|
|
226
|
-
.action({
|
|
227
|
-
label: "Delete",
|
|
228
|
-
variant: "destructive",
|
|
229
|
-
onClick: async (row) => {
|
|
230
|
-
const ok = await confirm({
|
|
231
|
-
title: "Delete Project?",
|
|
232
|
-
description: `Delete "${row.name}"?`,
|
|
233
|
-
variant: "destructive",
|
|
234
|
-
});
|
|
235
|
-
if (ok) console.log("Delete", row.id);
|
|
236
|
-
},
|
|
237
|
-
}),
|
|
135
|
+
const schema = FormSchema.make<CreateUser>()
|
|
136
|
+
.title("Create User")
|
|
137
|
+
.description("Add a new team member")
|
|
138
|
+
.columns(2)
|
|
139
|
+
.bordered()
|
|
140
|
+
.fields(
|
|
141
|
+
TextInput.make<CreateUser>("name").label("Name").required(),
|
|
142
|
+
TextInput.make<CreateUser>("email").label("Email").email().required(),
|
|
143
|
+
Select.make<CreateUser>("role")
|
|
144
|
+
.label("Role")
|
|
145
|
+
.options([
|
|
146
|
+
{ value: "admin", label: "Admin" },
|
|
147
|
+
{ value: "editor", label: "Editor" },
|
|
148
|
+
{ value: "viewer", label: "Viewer" },
|
|
149
|
+
])
|
|
150
|
+
.required(),
|
|
151
|
+
Textarea.make<CreateUser>("bio").label("Biography").rows(4).columnSpan(2),
|
|
238
152
|
)
|
|
153
|
+
.actions((a) => a.submit({ label: "Create User" }).cancel({ label: "Cancel" }))
|
|
239
154
|
.build();
|
|
155
|
+
|
|
156
|
+
function CreateUserPage() {
|
|
157
|
+
const [data, setData] = useState<CreateUser>({ name: "", email: "", role: "", bio: "" });
|
|
158
|
+
const [errors, setErrors] = useState({});
|
|
159
|
+
|
|
160
|
+
return (
|
|
161
|
+
<FormRenderer
|
|
162
|
+
schema={schema}
|
|
163
|
+
data={data}
|
|
164
|
+
errors={errors}
|
|
165
|
+
onChange={(field, value) => setData((prev) => ({ ...prev, [field]: value }))}
|
|
166
|
+
onSubmit={() => console.log("Submit:", data)}
|
|
167
|
+
/>
|
|
168
|
+
);
|
|
169
|
+
}
|
|
240
170
|
```
|
|
241
171
|
|
|
242
|
-
##
|
|
172
|
+
## Quick Start: Inertia.js + Laravel
|
|
243
173
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
174
|
+
```tsx
|
|
175
|
+
import { FormSchema, TextInput, Select, FormRenderer } from "@nccirtu/tablefy/forms";
|
|
176
|
+
import { useInertiaForm } from "@nccirtu/tablefy/inertia";
|
|
177
|
+
|
|
178
|
+
type CreateUser = { name: string; email: string; role: string };
|
|
179
|
+
|
|
180
|
+
const schema = FormSchema.make<CreateUser>()
|
|
181
|
+
.title("Create User")
|
|
182
|
+
.columns(2)
|
|
183
|
+
.fields(
|
|
184
|
+
TextInput.make<CreateUser>("name").label("Name").required(),
|
|
185
|
+
TextInput.make<CreateUser>("email").label("Email").email().required(),
|
|
186
|
+
Select.make<CreateUser>("role")
|
|
187
|
+
.label("Role")
|
|
188
|
+
.options([
|
|
189
|
+
{ value: "admin", label: "Admin" },
|
|
190
|
+
{ value: "editor", label: "Editor" },
|
|
191
|
+
])
|
|
192
|
+
.columnSpan(2),
|
|
193
|
+
)
|
|
194
|
+
.actions((a) => a.submit({ label: "Create" }).cancel({ label: "Cancel", href: "/users" }))
|
|
195
|
+
.build();
|
|
196
|
+
|
|
197
|
+
export default function CreateUserPage() {
|
|
198
|
+
const { data, errors, onChange, onSubmit, processing } = useInertiaForm<CreateUser>({
|
|
199
|
+
schema,
|
|
200
|
+
url: "/users",
|
|
201
|
+
method: "post",
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
return (
|
|
205
|
+
<FormRenderer
|
|
206
|
+
schema={schema}
|
|
207
|
+
data={data}
|
|
208
|
+
errors={errors}
|
|
209
|
+
onChange={onChange}
|
|
210
|
+
onSubmit={onSubmit}
|
|
211
|
+
processing={processing}
|
|
212
|
+
/>
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Column Types
|
|
218
|
+
|
|
219
|
+
| Column Type | Description | Key Methods |
|
|
220
|
+
|---|---|---|
|
|
221
|
+
| `TextColumn` | Simple text display | `sortable()`, `prefix()`, `suffix()`, `limit()`, `uppercase()` |
|
|
222
|
+
| `NumberColumn` | Numbers & currency | `money()`, `percent()`, `decimals()`, `locale()` |
|
|
223
|
+
| `DateColumn` | Dates & times | `short()`, `long()`, `relative()`, `datetime()`, `withIcon()` |
|
|
224
|
+
| `BadgeColumn` | Status badges | `variants()`, `boolean()`, `status()` |
|
|
225
|
+
| `LinkColumn` | Clickable links | `href()`, `external()`, `underline()`, `openInNewTab()` |
|
|
226
|
+
| `ProgressColumn` | Progress bars | `max()`, `colorByThreshold()`, `showPercentage()`, `format()` |
|
|
227
|
+
| `AvatarGroupColumn` | Avatar groups | `maxVisible()`, `size()`, `overlap()`, `fields()`, `showNames()` |
|
|
228
|
+
| `IconColumn` | Status icons | `boolean()`, `priority()`, `onlineStatus()`, `verification()`, `states()` |
|
|
229
|
+
| `ImageColumn` | Single images | `size()`, `rounded()`, `circular()`, `fallback()` |
|
|
230
|
+
| `CheckboxColumn` | Selection checkboxes | -- |
|
|
231
|
+
| `ActionsColumn` | Dropdown menus | `view()`, `edit()`, `delete()`, `action()`, `link()` |
|
|
232
|
+
| `EnumColumn` | Enum display | `options()` |
|
|
233
|
+
|
|
234
|
+
## Form Field Types
|
|
235
|
+
|
|
236
|
+
| Field Type | Description | Key Methods |
|
|
237
|
+
|---|---|---|
|
|
238
|
+
| `TextInput` | Single-line text | `email()`, `password()`, `number()`, `url()`, `tel()`, `prefix()`, `suffix()`, `minLength()`, `maxLength()` |
|
|
239
|
+
| `Textarea` | Multi-line text | `rows()`, `minLength()`, `maxLength()`, `autoResize()` |
|
|
240
|
+
| `Select` | Dropdown select | `options()`, `multiple()`, `searchable()`, `clearable()`, `loadOptions()` |
|
|
241
|
+
| `Checkbox` | Boolean checkbox | (inherits base methods) |
|
|
242
|
+
| `CheckboxGroup` | Multiple checkboxes | `options()`, `columns()` |
|
|
243
|
+
| `Toggle` | On/off switch | `onLabel()`, `offLabel()` |
|
|
244
|
+
| `RadioGroup` | Radio buttons | `options()`, `horizontal()`, `vertical()` |
|
|
245
|
+
| `DatePicker` | Date calendar | `minDate()`, `maxDate()`, `format()`, `includeTime()`, `locale()` |
|
|
246
|
+
| `FileUpload` | File drag & drop | `accept()`, `maxSize()`, `multiple()`, `maxFiles()`, `image()`, `pdf()` |
|
|
247
|
+
| `Repeater` | Dynamic list | `fields()`, `minItems()`, `maxItems()`, `addLabel()`, `orderable()` |
|
|
248
|
+
| `Hidden` | Hidden input | (inherits base methods) |
|
|
249
|
+
|
|
250
|
+
## Layout Options
|
|
251
|
+
|
|
252
|
+
### Sections (Collapsible Cards)
|
|
249
253
|
|
|
250
|
-
|
|
254
|
+
```tsx
|
|
255
|
+
FormSchema.make<T>()
|
|
256
|
+
.fields(/* ... */)
|
|
257
|
+
.sections(
|
|
258
|
+
SectionBuilder.make("Personal").fields(["name", "email"]).columns(2),
|
|
259
|
+
SectionBuilder.make("Address").fields(["street", "city"]).collapsible(),
|
|
260
|
+
)
|
|
261
|
+
.build();
|
|
262
|
+
```
|
|
251
263
|
|
|
252
|
-
###
|
|
264
|
+
### Tabs
|
|
253
265
|
|
|
254
266
|
```tsx
|
|
255
|
-
|
|
267
|
+
FormSchema.make<T>()
|
|
268
|
+
.fields(/* ... */)
|
|
269
|
+
.tabs(
|
|
270
|
+
TabBuilder.make("Profile").fields(["name", "email"]).icon(<User />),
|
|
271
|
+
TabBuilder.make("Settings").fields(["language", "timezone"]),
|
|
272
|
+
)
|
|
273
|
+
.build();
|
|
274
|
+
```
|
|
256
275
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
276
|
+
### Wizard (Multi-Step)
|
|
277
|
+
|
|
278
|
+
```tsx
|
|
279
|
+
FormSchema.make<T>()
|
|
280
|
+
.fields(/* ... */)
|
|
281
|
+
.wizard(
|
|
282
|
+
WizardStep.make("Account").fields(["email", "password"])
|
|
283
|
+
.canProceed((d) => !!d.email && !!d.password),
|
|
284
|
+
WizardStep.make("Profile").fields(["name", "bio"]),
|
|
285
|
+
)
|
|
261
286
|
.build();
|
|
262
287
|
```
|
|
263
288
|
|
|
264
|
-
|
|
289
|
+
## Import Paths
|
|
265
290
|
|
|
266
291
|
```tsx
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
id: "status",
|
|
279
|
-
label: "Status",
|
|
280
|
-
type: "select",
|
|
281
|
-
column: "status",
|
|
282
|
-
options: [
|
|
283
|
-
{ label: "Active", value: "active" },
|
|
284
|
-
{ label: "Inactive", value: "inactive" },
|
|
285
|
-
],
|
|
286
|
-
},
|
|
287
|
-
],
|
|
288
|
-
}}
|
|
289
|
-
/>
|
|
292
|
+
// Everything
|
|
293
|
+
import { DataTable, TableSchema, TextColumn, FormSchema, TextInput } from "@nccirtu/tablefy";
|
|
294
|
+
|
|
295
|
+
// Columns only (tree-shakeable)
|
|
296
|
+
import { TextColumn, BadgeColumn } from "@nccirtu/tablefy/columns";
|
|
297
|
+
|
|
298
|
+
// Forms only (tree-shakeable, no TanStack Table)
|
|
299
|
+
import { FormSchema, TextInput, Select, FormRenderer } from "@nccirtu/tablefy/forms";
|
|
300
|
+
|
|
301
|
+
// Inertia integration (requires @inertiajs/react)
|
|
302
|
+
import { useInertiaForm, useServerTable } from "@nccirtu/tablefy/inertia";
|
|
290
303
|
```
|
|
291
304
|
|
|
305
|
+
## Documentation
|
|
306
|
+
|
|
307
|
+
- [Installation Guide](./docs/INSTALLATION.md) - Detailed setup instructions
|
|
308
|
+
- [Data Tables Guide](./docs/USAGE.md) - Complete table API reference and examples
|
|
309
|
+
- [Forms Guide](./docs/FORMS.md) - All form field types, layouts, and examples
|
|
310
|
+
- [Inertia Integration](./docs/INERTIA.md) - Server-side tables, useInertiaForm, Precognition
|
|
311
|
+
- [Actions Column](./docs/ACTIONS_COLUMN.md) - Custom render functions and confirm dialogs
|
|
312
|
+
- [Editable Columns](./docs/EDITABLE_COLUMNS.md) - InputColumn and SelectColumn guide
|
|
313
|
+
|
|
292
314
|
## Contributing
|
|
293
315
|
|
|
294
316
|
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
@@ -304,3 +326,5 @@ Built with:
|
|
|
304
326
|
- [TanStack Table](https://tanstack.com/table) - Headless table library
|
|
305
327
|
- [shadcn/ui](https://ui.shadcn.com/) - Beautiful UI components
|
|
306
328
|
- [Tailwind CSS](https://tailwindcss.com/) - Utility-first CSS framework
|
|
329
|
+
- [Inertia.js](https://inertiajs.com/) - The modern monolith
|
|
330
|
+
- [Laravel](https://laravel.com/) - The PHP framework
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FormActionConfig } from "../types/actions";
|
|
2
|
+
export declare class ActionsBuilder<TData extends Record<string, any>> {
|
|
3
|
+
private actionsList;
|
|
4
|
+
submit(opts?: Partial<Omit<FormActionConfig<TData>, "type">> & {
|
|
5
|
+
label?: string;
|
|
6
|
+
}): this;
|
|
7
|
+
cancel(opts?: Partial<Omit<FormActionConfig<TData>, "type">> & {
|
|
8
|
+
label?: string;
|
|
9
|
+
}): this;
|
|
10
|
+
custom(opts: Omit<FormActionConfig<TData>, "type"> & {
|
|
11
|
+
label: string;
|
|
12
|
+
}): this;
|
|
13
|
+
build(): FormActionConfig<TData>[];
|
|
14
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { FormBuildResult, BuiltField } from "../types/form";
|
|
2
|
+
import { SectionConfig, TabConfig, WizardStepConfig } from "../types/layout";
|
|
3
|
+
import { ActionsBuilder } from "./actions-builder";
|
|
4
|
+
type FieldBuilder<TData extends Record<string, any>> = {
|
|
5
|
+
build(): BuiltField<TData>;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Form Schema Builder
|
|
9
|
+
* Fluent API for building complete form configurations
|
|
10
|
+
*/
|
|
11
|
+
export declare class FormSchema<TData extends Record<string, any>> {
|
|
12
|
+
private fieldBuilders;
|
|
13
|
+
private schemaConfig;
|
|
14
|
+
static make<TData extends Record<string, any>>(): FormSchema<TData>;
|
|
15
|
+
title(title: string | ((data: TData) => string)): this;
|
|
16
|
+
description(description: string | ((data: TData) => string)): this;
|
|
17
|
+
columns(columns: number): this;
|
|
18
|
+
bordered(bordered?: boolean): this;
|
|
19
|
+
spacing(spacing: "compact" | "normal" | "relaxed"): this;
|
|
20
|
+
disabled(disabled: boolean | ((data: TData) => boolean)): this;
|
|
21
|
+
fields(...builders: FieldBuilder<TData>[]): this;
|
|
22
|
+
sections(...sections: {
|
|
23
|
+
build(): SectionConfig<TData>;
|
|
24
|
+
}[]): this;
|
|
25
|
+
tabs(...tabs: {
|
|
26
|
+
build(): TabConfig<TData>;
|
|
27
|
+
}[]): this;
|
|
28
|
+
wizard(...steps: {
|
|
29
|
+
build(): WizardStepConfig<TData>;
|
|
30
|
+
}[]): this;
|
|
31
|
+
actions(fn: (builder: ActionsBuilder<TData>) => ActionsBuilder<TData>): this;
|
|
32
|
+
actionsPosition(position: "start" | "end" | "between" | "center"): this;
|
|
33
|
+
build(): FormBuildResult<TData>;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { SectionConfig } from "../types/layout";
|
|
3
|
+
export declare class SectionBuilder<TData extends Record<string, any>> {
|
|
4
|
+
private sectionConfig;
|
|
5
|
+
constructor(title: string);
|
|
6
|
+
static make<TData extends Record<string, any>>(title: string): SectionBuilder<TData>;
|
|
7
|
+
id(id: string): this;
|
|
8
|
+
description(description: string): this;
|
|
9
|
+
fields(fields: string[]): this;
|
|
10
|
+
columns(columns: number): this;
|
|
11
|
+
collapsible(collapsible?: boolean): this;
|
|
12
|
+
collapsed(collapsed?: boolean): this;
|
|
13
|
+
icon(icon: ReactNode): this;
|
|
14
|
+
hidden(fn: (data: TData) => boolean): this;
|
|
15
|
+
build(): SectionConfig<TData>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { TabConfig, SectionConfig } from "../types/layout";
|
|
3
|
+
export declare class TabBuilder<TData extends Record<string, any>> {
|
|
4
|
+
private tabConfig;
|
|
5
|
+
constructor(label: string);
|
|
6
|
+
static make<TData extends Record<string, any>>(label: string): TabBuilder<TData>;
|
|
7
|
+
id(id: string): this;
|
|
8
|
+
icon(icon: ReactNode): this;
|
|
9
|
+
fields(fields: string[]): this;
|
|
10
|
+
sections(...sections: {
|
|
11
|
+
build(): SectionConfig<TData>;
|
|
12
|
+
}[]): this;
|
|
13
|
+
badge(badge: string | number | ((data: TData) => string | number)): this;
|
|
14
|
+
disabled(fn: (data: TData) => boolean): this;
|
|
15
|
+
build(): TabConfig<TData>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { WizardStepConfig, SectionConfig } from "../types/layout";
|
|
3
|
+
export declare class WizardStep<TData extends Record<string, any>> {
|
|
4
|
+
private stepConfig;
|
|
5
|
+
constructor(label: string);
|
|
6
|
+
static make<TData extends Record<string, any>>(label: string): WizardStep<TData>;
|
|
7
|
+
id(id: string): this;
|
|
8
|
+
description(description: string): this;
|
|
9
|
+
icon(icon: ReactNode): this;
|
|
10
|
+
fields(fields: string[]): this;
|
|
11
|
+
sections(...sections: {
|
|
12
|
+
build(): SectionConfig<TData>;
|
|
13
|
+
}[]): this;
|
|
14
|
+
canProceed(fn: (data: TData) => boolean): this;
|
|
15
|
+
beforeNext(fn: (data: TData) => Promise<boolean> | boolean): this;
|
|
16
|
+
build(): WizardStepConfig<TData>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { BuiltField } from "../types/form";
|
|
3
|
+
export interface FieldRendererProps<TData extends Record<string, any>> {
|
|
4
|
+
field: BuiltField<TData>;
|
|
5
|
+
value: any;
|
|
6
|
+
error?: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
data: TData;
|
|
9
|
+
onChange: (value: any) => void;
|
|
10
|
+
onBlur?: () => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function FieldRenderer<TData extends Record<string, any>>({ field, value, error, disabled, data, onChange, onBlur, }: FieldRendererProps<TData>): ReactNode;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { FormActionConfig } from "../types/actions";
|
|
3
|
+
export interface FormActionsProps<TData extends Record<string, any>> {
|
|
4
|
+
actions: FormActionConfig<TData>[];
|
|
5
|
+
position?: "start" | "end" | "between" | "center";
|
|
6
|
+
data: TData;
|
|
7
|
+
processing?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function FormActions<TData extends Record<string, any>>({ actions, position, data, processing, }: FormActionsProps<TData>): ReactNode;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { FormBuildResult } from "../types/form";
|
|
3
|
+
export interface FormRendererProps<TData extends Record<string, any>> {
|
|
4
|
+
schema: FormBuildResult<TData>;
|
|
5
|
+
data: TData;
|
|
6
|
+
errors: Partial<Record<keyof TData, string>>;
|
|
7
|
+
onChange: (field: keyof TData, value: any) => void;
|
|
8
|
+
onSubmit: () => void;
|
|
9
|
+
processing?: boolean;
|
|
10
|
+
className?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
onBlur?: (field: string) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function FormRenderer<TData extends Record<string, any>>({ schema, data, errors, onChange, onSubmit, processing, className, disabled, onBlur, }: FormRendererProps<TData>): ReactNode;
|