@questpie/admin 0.0.1
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/.turbo/turbo-build.log +108 -0
- package/CHANGELOG.md +10 -0
- package/README.md +556 -0
- package/STATUS.md +917 -0
- package/VALIDATION.md +602 -0
- package/components.json +24 -0
- package/dist/__tests__/setup.mjs +38 -0
- package/dist/__tests__/test-utils.mjs +45 -0
- package/dist/__tests__/vitest.d.mjs +3 -0
- package/dist/components/admin-app.mjs +69 -0
- package/dist/components/fields/array-field.mjs +190 -0
- package/dist/components/fields/checkbox-field.mjs +34 -0
- package/dist/components/fields/custom-field.mjs +32 -0
- package/dist/components/fields/date-field.mjs +41 -0
- package/dist/components/fields/datetime-field.mjs +42 -0
- package/dist/components/fields/email-field.mjs +37 -0
- package/dist/components/fields/embedded-collection.mjs +253 -0
- package/dist/components/fields/field-types.mjs +1 -0
- package/dist/components/fields/field-utils.mjs +10 -0
- package/dist/components/fields/field-wrapper.mjs +34 -0
- package/dist/components/fields/index.mjs +23 -0
- package/dist/components/fields/json-field.mjs +243 -0
- package/dist/components/fields/locale-badge.mjs +16 -0
- package/dist/components/fields/number-field.mjs +39 -0
- package/dist/components/fields/password-field.mjs +37 -0
- package/dist/components/fields/relation-field.mjs +104 -0
- package/dist/components/fields/relation-picker.mjs +229 -0
- package/dist/components/fields/relation-select.mjs +188 -0
- package/dist/components/fields/rich-text-editor/index.mjs +897 -0
- package/dist/components/fields/select-field.mjs +41 -0
- package/dist/components/fields/switch-field.mjs +34 -0
- package/dist/components/fields/text-field.mjs +38 -0
- package/dist/components/fields/textarea-field.mjs +38 -0
- package/dist/components/index.mjs +59 -0
- package/dist/components/primitives/checkbox-input.mjs +127 -0
- package/dist/components/primitives/date-input.mjs +303 -0
- package/dist/components/primitives/index.mjs +12 -0
- package/dist/components/primitives/number-input.mjs +104 -0
- package/dist/components/primitives/select-input.mjs +177 -0
- package/dist/components/primitives/tag-input.mjs +135 -0
- package/dist/components/primitives/text-input.mjs +39 -0
- package/dist/components/primitives/textarea-input.mjs +37 -0
- package/dist/components/primitives/toggle-input.mjs +31 -0
- package/dist/components/primitives/types.mjs +12 -0
- package/dist/components/ui/accordion.mjs +55 -0
- package/dist/components/ui/avatar.mjs +54 -0
- package/dist/components/ui/badge.mjs +34 -0
- package/dist/components/ui/button.mjs +48 -0
- package/dist/components/ui/card.mjs +58 -0
- package/dist/components/ui/checkbox.mjs +21 -0
- package/dist/components/ui/combobox.mjs +163 -0
- package/dist/components/ui/dialog.mjs +95 -0
- package/dist/components/ui/dropdown-menu.mjs +138 -0
- package/dist/components/ui/field.mjs +113 -0
- package/dist/components/ui/input-group.mjs +82 -0
- package/dist/components/ui/input.mjs +17 -0
- package/dist/components/ui/label.mjs +15 -0
- package/dist/components/ui/popover.mjs +56 -0
- package/dist/components/ui/scroll-area.mjs +38 -0
- package/dist/components/ui/select.mjs +100 -0
- package/dist/components/ui/separator.mjs +16 -0
- package/dist/components/ui/sheet.mjs +90 -0
- package/dist/components/ui/sidebar.mjs +387 -0
- package/dist/components/ui/skeleton.mjs +14 -0
- package/dist/components/ui/spinner.mjs +16 -0
- package/dist/components/ui/switch.mjs +22 -0
- package/dist/components/ui/table.mjs +68 -0
- package/dist/components/ui/tabs.mjs +48 -0
- package/dist/components/ui/textarea.mjs +15 -0
- package/dist/components/ui/tooltip.mjs +44 -0
- package/dist/config/component-registry.mjs +38 -0
- package/dist/config/index.mjs +129 -0
- package/dist/hooks/admin-provider.mjs +70 -0
- package/dist/hooks/index.mjs +7 -0
- package/dist/hooks/store.mjs +178 -0
- package/dist/hooks/use-auth.mjs +76 -0
- package/dist/hooks/use-collection-db.mjs +146 -0
- package/dist/hooks/use-collection.mjs +112 -0
- package/dist/hooks/use-global.mjs +46 -0
- package/dist/hooks/use-mobile.mjs +20 -0
- package/dist/lib/utils.mjs +10 -0
- package/dist/styles/index.css +336 -0
- package/dist/styles/index.mjs +1 -0
- package/dist/utils/index.mjs +9 -0
- package/dist/views/auth/auth-layout.mjs +52 -0
- package/dist/views/auth/forgot-password-form.mjs +148 -0
- package/dist/views/auth/index.mjs +6 -0
- package/dist/views/auth/login-form.mjs +156 -0
- package/dist/views/auth/reset-password-form.mjs +184 -0
- package/dist/views/collection/auto-form-fields.mjs +525 -0
- package/dist/views/collection/collection-form.mjs +91 -0
- package/dist/views/collection/collection-list.mjs +76 -0
- package/dist/views/collection/form-field.mjs +42 -0
- package/dist/views/collection/index.mjs +6 -0
- package/dist/views/common/index.mjs +4 -0
- package/dist/views/common/locale-switcher.mjs +39 -0
- package/dist/views/common/version-history.mjs +272 -0
- package/dist/views/index.mjs +9 -0
- package/dist/views/layout/admin-layout.mjs +40 -0
- package/dist/views/layout/admin-router.mjs +95 -0
- package/dist/views/layout/admin-sidebar.mjs +63 -0
- package/dist/views/layout/index.mjs +5 -0
- package/package.json +276 -0
- package/src/__tests__/setup.ts +44 -0
- package/src/__tests__/test-utils.tsx +49 -0
- package/src/__tests__/vitest.d.ts +9 -0
- package/src/components/admin-app.tsx +221 -0
- package/src/components/fields/array-field.tsx +237 -0
- package/src/components/fields/checkbox-field.tsx +47 -0
- package/src/components/fields/custom-field.tsx +50 -0
- package/src/components/fields/date-field.tsx +65 -0
- package/src/components/fields/datetime-field.tsx +67 -0
- package/src/components/fields/email-field.tsx +51 -0
- package/src/components/fields/embedded-collection.tsx +315 -0
- package/src/components/fields/field-types.ts +162 -0
- package/src/components/fields/field-utils.ts +6 -0
- package/src/components/fields/field-wrapper.tsx +52 -0
- package/src/components/fields/index.ts +66 -0
- package/src/components/fields/json-field.tsx +440 -0
- package/src/components/fields/locale-badge.tsx +15 -0
- package/src/components/fields/number-field.tsx +57 -0
- package/src/components/fields/password-field.tsx +51 -0
- package/src/components/fields/relation-field.tsx +243 -0
- package/src/components/fields/relation-picker.tsx +402 -0
- package/src/components/fields/relation-select.tsx +327 -0
- package/src/components/fields/rich-text-editor/index.tsx +1337 -0
- package/src/components/fields/select-field.tsx +61 -0
- package/src/components/fields/switch-field.tsx +47 -0
- package/src/components/fields/text-field.tsx +55 -0
- package/src/components/fields/textarea-field.tsx +55 -0
- package/src/components/index.ts +40 -0
- package/src/components/primitives/checkbox-input.tsx +193 -0
- package/src/components/primitives/date-input.tsx +401 -0
- package/src/components/primitives/index.ts +24 -0
- package/src/components/primitives/number-input.tsx +132 -0
- package/src/components/primitives/select-input.tsx +296 -0
- package/src/components/primitives/tag-input.tsx +200 -0
- package/src/components/primitives/text-input.tsx +49 -0
- package/src/components/primitives/textarea-input.tsx +46 -0
- package/src/components/primitives/toggle-input.tsx +36 -0
- package/src/components/primitives/types.ts +235 -0
- package/src/components/ui/accordion.tsx +72 -0
- package/src/components/ui/avatar.tsx +106 -0
- package/src/components/ui/badge.tsx +48 -0
- package/src/components/ui/button.tsx +53 -0
- package/src/components/ui/card.tsx +94 -0
- package/src/components/ui/checkbox.tsx +27 -0
- package/src/components/ui/combobox.tsx +290 -0
- package/src/components/ui/dialog.tsx +151 -0
- package/src/components/ui/dropdown-menu.tsx +254 -0
- package/src/components/ui/field.tsx +227 -0
- package/src/components/ui/input-group.tsx +149 -0
- package/src/components/ui/input.tsx +20 -0
- package/src/components/ui/label.tsx +18 -0
- package/src/components/ui/popover.tsx +88 -0
- package/src/components/ui/scroll-area.tsx +53 -0
- package/src/components/ui/select.tsx +192 -0
- package/src/components/ui/separator.tsx +23 -0
- package/src/components/ui/sheet.tsx +127 -0
- package/src/components/ui/sidebar.tsx +723 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/spinner.tsx +10 -0
- package/src/components/ui/switch.tsx +32 -0
- package/src/components/ui/table.tsx +99 -0
- package/src/components/ui/tabs.tsx +82 -0
- package/src/components/ui/textarea.tsx +18 -0
- package/src/components/ui/tooltip.tsx +70 -0
- package/src/config/component-registry.ts +190 -0
- package/src/config/index.ts +1099 -0
- package/src/hooks/README.md +269 -0
- package/src/hooks/admin-provider.tsx +110 -0
- package/src/hooks/index.ts +41 -0
- package/src/hooks/store.ts +248 -0
- package/src/hooks/use-auth.ts +168 -0
- package/src/hooks/use-collection-db.ts +209 -0
- package/src/hooks/use-collection.ts +156 -0
- package/src/hooks/use-global.ts +69 -0
- package/src/hooks/use-mobile.ts +21 -0
- package/src/lib/utils.ts +6 -0
- package/src/styles/index.css +340 -0
- package/src/utils/index.ts +6 -0
- package/src/views/auth/auth-layout.tsx +77 -0
- package/src/views/auth/forgot-password-form.tsx +192 -0
- package/src/views/auth/index.ts +21 -0
- package/src/views/auth/login-form.tsx +229 -0
- package/src/views/auth/reset-password-form.tsx +232 -0
- package/src/views/collection/auto-form-fields.tsx +982 -0
- package/src/views/collection/collection-form.tsx +186 -0
- package/src/views/collection/collection-list.tsx +223 -0
- package/src/views/collection/form-field.tsx +52 -0
- package/src/views/collection/index.ts +15 -0
- package/src/views/common/index.ts +8 -0
- package/src/views/common/locale-switcher.tsx +45 -0
- package/src/views/common/version-history.tsx +406 -0
- package/src/views/index.ts +25 -0
- package/src/views/layout/admin-layout.tsx +117 -0
- package/src/views/layout/admin-router.tsx +206 -0
- package/src/views/layout/admin-sidebar.tsx +185 -0
- package/src/views/layout/index.ts +12 -0
- package/tsconfig.json +13 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/tsdown.config.ts +13 -0
- package/vitest.config.ts +29 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RelationSelect Component
|
|
3
|
+
*
|
|
4
|
+
* Single relation field (one-to-one) with:
|
|
5
|
+
* - Select dropdown to choose existing item
|
|
6
|
+
* - Plus button to create new related item (opens side sheet)
|
|
7
|
+
* - Edit button to modify selected item (opens side sheet)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import * as React from "react";
|
|
11
|
+
import { useQuery } from "@tanstack/react-query";
|
|
12
|
+
import { Plus, Pencil, X } from "@phosphor-icons/react";
|
|
13
|
+
import { Button } from "../ui/button";
|
|
14
|
+
import { Select, SelectContent, SelectItem, SelectTrigger } from "../ui/select";
|
|
15
|
+
import {
|
|
16
|
+
Sheet,
|
|
17
|
+
SheetContent,
|
|
18
|
+
SheetDescription,
|
|
19
|
+
SheetHeader,
|
|
20
|
+
SheetTitle,
|
|
21
|
+
} from "../ui/sheet";
|
|
22
|
+
import { Spinner } from "../ui/spinner";
|
|
23
|
+
import { LocaleBadge } from "./locale-badge";
|
|
24
|
+
import { useAdminContext } from "../../hooks/admin-provider";
|
|
25
|
+
import type { Questpie } from "questpie";
|
|
26
|
+
|
|
27
|
+
export interface RelationSelectProps<T extends Questpie<any>> {
|
|
28
|
+
/**
|
|
29
|
+
* Field name
|
|
30
|
+
*/
|
|
31
|
+
name: string;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Current value (ID of related item)
|
|
35
|
+
*/
|
|
36
|
+
value?: string | null;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Change handler
|
|
40
|
+
*/
|
|
41
|
+
onChange: (value: string | null) => void;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Target collection name
|
|
45
|
+
*/
|
|
46
|
+
targetCollection: string;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Label for the field
|
|
50
|
+
*/
|
|
51
|
+
label?: string;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Localized field
|
|
55
|
+
*/
|
|
56
|
+
localized?: boolean;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Active locale
|
|
60
|
+
*/
|
|
61
|
+
locale?: string;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Filter options based on form values
|
|
65
|
+
*/
|
|
66
|
+
filter?: (formValues: any) => any;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Is the field required
|
|
70
|
+
*/
|
|
71
|
+
required?: boolean;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Is the field disabled
|
|
75
|
+
*/
|
|
76
|
+
disabled?: boolean;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Is the field readonly
|
|
80
|
+
*/
|
|
81
|
+
readOnly?: boolean;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Placeholder text
|
|
85
|
+
*/
|
|
86
|
+
placeholder?: string;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Error message
|
|
90
|
+
*/
|
|
91
|
+
error?: string;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Custom render function for dropdown options
|
|
95
|
+
*/
|
|
96
|
+
renderOption?: (item: any) => React.ReactNode;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Custom render function for selected value
|
|
100
|
+
*/
|
|
101
|
+
renderValue?: (item: any) => React.ReactNode;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Form fields to render in create/edit sheet
|
|
105
|
+
*/
|
|
106
|
+
renderFormFields?: (collection: string, itemId?: string) => React.ReactNode;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function RelationSelect<T extends Questpie<any>>({
|
|
110
|
+
name,
|
|
111
|
+
value,
|
|
112
|
+
onChange,
|
|
113
|
+
targetCollection,
|
|
114
|
+
label,
|
|
115
|
+
filter,
|
|
116
|
+
required,
|
|
117
|
+
disabled,
|
|
118
|
+
readOnly,
|
|
119
|
+
placeholder,
|
|
120
|
+
error,
|
|
121
|
+
localized,
|
|
122
|
+
locale: localeProp,
|
|
123
|
+
renderOption,
|
|
124
|
+
renderValue,
|
|
125
|
+
renderFormFields,
|
|
126
|
+
}: RelationSelectProps<T>) {
|
|
127
|
+
const { client, locale: contextLocale } = useAdminContext<T>();
|
|
128
|
+
const locale = localeProp ?? contextLocale;
|
|
129
|
+
const localeKey = locale ?? "default";
|
|
130
|
+
const [isSheetOpen, setIsSheetOpen] = React.useState(false);
|
|
131
|
+
const [sheetMode, setSheetMode] = React.useState<"create" | "edit">("create");
|
|
132
|
+
|
|
133
|
+
// Fetch options for dropdown
|
|
134
|
+
const { data: options, isLoading } = useQuery({
|
|
135
|
+
queryKey: ["relation", targetCollection, localeKey, filter],
|
|
136
|
+
queryFn: async () => {
|
|
137
|
+
const api = (client as any).collections?.[targetCollection];
|
|
138
|
+
if (!api?.list) return [];
|
|
139
|
+
const result = await api.list({
|
|
140
|
+
...(filter ? filter({}) : {}),
|
|
141
|
+
});
|
|
142
|
+
return result.data || [];
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Fetch selected item details
|
|
147
|
+
const { data: selectedItem } = useQuery({
|
|
148
|
+
queryKey: ["relation", targetCollection, localeKey, value],
|
|
149
|
+
queryFn: async () => {
|
|
150
|
+
if (!value) return null;
|
|
151
|
+
const api = (client as any).collections?.[targetCollection];
|
|
152
|
+
if (!api?.get) return null;
|
|
153
|
+
return await api.get(value);
|
|
154
|
+
},
|
|
155
|
+
enabled: !!value,
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
const handleOpenCreate = () => {
|
|
159
|
+
setSheetMode("create");
|
|
160
|
+
setIsSheetOpen(true);
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const handleOpenEdit = () => {
|
|
164
|
+
if (!value) return;
|
|
165
|
+
setSheetMode("edit");
|
|
166
|
+
setIsSheetOpen(true);
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const handleClear = () => {
|
|
170
|
+
onChange(null);
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const handleValueChange = (newValue: string | null) => {
|
|
174
|
+
if (newValue) {
|
|
175
|
+
onChange(newValue);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const getDisplayValue = (item: any) => {
|
|
180
|
+
if (renderValue) return renderValue(item);
|
|
181
|
+
return item?._title || item?.id || "";
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
const getOptionDisplay = (item: any) => {
|
|
185
|
+
if (renderOption) return renderOption(item);
|
|
186
|
+
return item?._title || item?.id || "";
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
return (
|
|
190
|
+
<div className="space-y-2">
|
|
191
|
+
{label && (
|
|
192
|
+
<div className="flex items-center gap-2">
|
|
193
|
+
<label htmlFor={name} className="text-sm font-medium">
|
|
194
|
+
{label}
|
|
195
|
+
{required && <span className="text-destructive">*</span>}
|
|
196
|
+
</label>
|
|
197
|
+
{localized && <LocaleBadge locale={locale || "i18n"} />}
|
|
198
|
+
</div>
|
|
199
|
+
)}
|
|
200
|
+
|
|
201
|
+
<div className="flex gap-2">
|
|
202
|
+
{/* Select Dropdown */}
|
|
203
|
+
<div className="flex-1">
|
|
204
|
+
<Select
|
|
205
|
+
value={value || undefined}
|
|
206
|
+
onValueChange={handleValueChange}
|
|
207
|
+
disabled={disabled || readOnly || isLoading}
|
|
208
|
+
>
|
|
209
|
+
<SelectTrigger
|
|
210
|
+
id={name}
|
|
211
|
+
className={error ? "border-destructive" : ""}
|
|
212
|
+
>
|
|
213
|
+
<span className="truncate">
|
|
214
|
+
{selectedItem
|
|
215
|
+
? getDisplayValue(selectedItem)
|
|
216
|
+
: placeholder || `Select ${label || targetCollection}...`}
|
|
217
|
+
</span>
|
|
218
|
+
</SelectTrigger>
|
|
219
|
+
<SelectContent>
|
|
220
|
+
{isLoading ? (
|
|
221
|
+
<div className="flex items-center justify-center p-4">
|
|
222
|
+
<Spinner className="h-4 w-4" />
|
|
223
|
+
</div>
|
|
224
|
+
) : options && options.length > 0 ? (
|
|
225
|
+
options.map((option: any) => (
|
|
226
|
+
<SelectItem key={option.id} value={option.id}>
|
|
227
|
+
{getOptionDisplay(option)}
|
|
228
|
+
</SelectItem>
|
|
229
|
+
))
|
|
230
|
+
) : (
|
|
231
|
+
<div className="p-4 text-center text-sm text-muted-foreground">
|
|
232
|
+
No options available
|
|
233
|
+
</div>
|
|
234
|
+
)}
|
|
235
|
+
</SelectContent>
|
|
236
|
+
</Select>
|
|
237
|
+
</div>
|
|
238
|
+
|
|
239
|
+
{/* Action Buttons */}
|
|
240
|
+
{!readOnly && (
|
|
241
|
+
<>
|
|
242
|
+
{/* Clear button (only if value is set and not required) */}
|
|
243
|
+
{value && !required && (
|
|
244
|
+
<Button
|
|
245
|
+
type="button"
|
|
246
|
+
variant="outline"
|
|
247
|
+
size="icon"
|
|
248
|
+
onClick={handleClear}
|
|
249
|
+
disabled={disabled}
|
|
250
|
+
title="Clear selection"
|
|
251
|
+
>
|
|
252
|
+
<X className="h-4 w-4" />
|
|
253
|
+
</Button>
|
|
254
|
+
)}
|
|
255
|
+
|
|
256
|
+
{/* Edit button (only if value is set) */}
|
|
257
|
+
{value && (
|
|
258
|
+
<Button
|
|
259
|
+
type="button"
|
|
260
|
+
variant="outline"
|
|
261
|
+
size="icon"
|
|
262
|
+
onClick={handleOpenEdit}
|
|
263
|
+
disabled={disabled}
|
|
264
|
+
title={`Edit ${label || targetCollection}`}
|
|
265
|
+
>
|
|
266
|
+
<Pencil className="h-4 w-4" />
|
|
267
|
+
</Button>
|
|
268
|
+
)}
|
|
269
|
+
|
|
270
|
+
{/* Create button */}
|
|
271
|
+
<Button
|
|
272
|
+
type="button"
|
|
273
|
+
variant="outline"
|
|
274
|
+
size="icon"
|
|
275
|
+
onClick={handleOpenCreate}
|
|
276
|
+
disabled={disabled}
|
|
277
|
+
title={`Create new ${label || targetCollection}`}
|
|
278
|
+
>
|
|
279
|
+
<Plus className="h-4 w-4" />
|
|
280
|
+
</Button>
|
|
281
|
+
</>
|
|
282
|
+
)}
|
|
283
|
+
</div>
|
|
284
|
+
|
|
285
|
+
{/* Error message */}
|
|
286
|
+
{error && <p className="text-sm text-destructive">{error}</p>}
|
|
287
|
+
|
|
288
|
+
{/* Side Sheet for Create/Edit */}
|
|
289
|
+
<Sheet open={isSheetOpen} onOpenChange={setIsSheetOpen}>
|
|
290
|
+
<SheetContent
|
|
291
|
+
side="right"
|
|
292
|
+
className="w-full sm:max-w-lg overflow-y-auto"
|
|
293
|
+
>
|
|
294
|
+
<SheetHeader>
|
|
295
|
+
<SheetTitle>
|
|
296
|
+
{sheetMode === "create" ? "Create" : "Edit"}{" "}
|
|
297
|
+
{label || targetCollection}
|
|
298
|
+
</SheetTitle>
|
|
299
|
+
<SheetDescription>
|
|
300
|
+
{sheetMode === "create"
|
|
301
|
+
? `Fill in the details to create a new ${label || targetCollection}`
|
|
302
|
+
: `Update the details of this ${label || targetCollection}`}
|
|
303
|
+
</SheetDescription>
|
|
304
|
+
</SheetHeader>
|
|
305
|
+
|
|
306
|
+
<div className="mt-6">
|
|
307
|
+
{renderFormFields ? (
|
|
308
|
+
renderFormFields(
|
|
309
|
+
targetCollection,
|
|
310
|
+
sheetMode === "edit" ? value || undefined : undefined,
|
|
311
|
+
)
|
|
312
|
+
) : (
|
|
313
|
+
<div className="rounded-lg border border-dashed p-8 text-center">
|
|
314
|
+
<p className="text-sm text-muted-foreground">
|
|
315
|
+
Form fields not configured.
|
|
316
|
+
<br />
|
|
317
|
+
Pass <code className="text-xs">renderFormFields</code> prop to
|
|
318
|
+
enable create/edit.
|
|
319
|
+
</p>
|
|
320
|
+
</div>
|
|
321
|
+
)}
|
|
322
|
+
</div>
|
|
323
|
+
</SheetContent>
|
|
324
|
+
</Sheet>
|
|
325
|
+
</div>
|
|
326
|
+
);
|
|
327
|
+
}
|