create-nextjs-cms 0.7.0 → 0.7.2
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/LICENSE +21 -21
- package/README.md +71 -71
- package/dist/helpers/utils.js +16 -16
- package/dist/lib/section-creators.js +166 -166
- package/package.json +3 -3
- package/templates/default/.eslintrc.json +5 -5
- package/templates/default/.prettierignore +7 -7
- package/templates/default/.prettierrc.json +27 -27
- package/templates/default/CHANGELOG.md +140 -140
- package/templates/default/_gitignore +57 -57
- package/templates/default/app/(auth)/auth/login/LoginPage.tsx +192 -192
- package/templates/default/app/(auth)/auth/login/page.tsx +11 -11
- package/templates/default/app/(auth)/auth-locale-provider.tsx +34 -34
- package/templates/default/app/(auth)/layout.tsx +81 -81
- package/templates/default/app/(rootLayout)/(plugins)/[...slug]/page.tsx +40 -40
- package/templates/default/app/(rootLayout)/(plugins)/[...slug]/plugin-server-registry.ts +22 -22
- package/templates/default/app/(rootLayout)/admins/page.tsx +10 -10
- package/templates/default/app/(rootLayout)/browse/[section]/[page]/page.tsx +22 -22
- package/templates/default/app/(rootLayout)/categorized/[section]/page.tsx +15 -15
- package/templates/default/app/(rootLayout)/dashboard/page.tsx +63 -63
- package/templates/default/app/(rootLayout)/dashboard-new/page.tsx +7 -7
- package/templates/default/app/(rootLayout)/edit/[section]/[itemId]/page.tsx +17 -17
- package/templates/default/app/(rootLayout)/layout.tsx +81 -81
- package/templates/default/app/(rootLayout)/loading.tsx +10 -10
- package/templates/default/app/(rootLayout)/log/page.tsx +7 -7
- package/templates/default/app/(rootLayout)/new/[section]/page.tsx +15 -15
- package/templates/default/app/(rootLayout)/section/[section]/page.tsx +16 -16
- package/templates/default/app/(rootLayout)/settings/page.tsx +13 -13
- package/templates/default/app/_trpc/client.ts +3 -3
- package/templates/default/app/api/auth/csrf/route.ts +25 -25
- package/templates/default/app/api/auth/refresh/route.ts +10 -10
- package/templates/default/app/api/auth/session/route.ts +20 -20
- package/templates/default/app/api/editor/photo/route.ts +49 -49
- package/templates/default/app/api/photo/route.ts +27 -27
- package/templates/default/app/api/submit/section/item/[slug]/route.ts +66 -66
- package/templates/default/app/api/submit/section/item/route.ts +56 -56
- package/templates/default/app/api/submit/section/simple/route.ts +57 -57
- package/templates/default/app/api/trpc/[trpc]/route.ts +33 -33
- package/templates/default/app/api/video/route.ts +174 -174
- package/templates/default/app/globals.css +219 -219
- package/templates/default/app/providers.tsx +152 -152
- package/templates/default/cms.config.ts +49 -52
- package/templates/default/components/AdminCard.tsx +166 -166
- package/templates/default/components/AdminEditPage.tsx +124 -124
- package/templates/default/components/AdminPrivilegeCard.tsx +185 -185
- package/templates/default/components/AdminsPage.tsx +43 -43
- package/templates/default/components/AnalyticsPage.tsx +128 -128
- package/templates/default/components/BarChartBox.tsx +42 -42
- package/templates/default/components/BrowsePage.tsx +106 -106
- package/templates/default/components/CategorizedSectionPage.tsx +31 -31
- package/templates/default/components/CategoryDeleteConfirmPage.tsx +130 -130
- package/templates/default/components/CategorySectionSelectInput.tsx +140 -140
- package/templates/default/components/ConditionalFields.tsx +49 -49
- package/templates/default/components/ContainerBox.tsx +24 -24
- package/templates/default/components/DashboardNewPage.tsx +253 -253
- package/templates/default/components/DashboardPage.tsx +188 -188
- package/templates/default/components/DashboardPageAlt.tsx +45 -45
- package/templates/default/components/DefaultNavItems.tsx +3 -3
- package/templates/default/components/Dropzone.tsx +154 -154
- package/templates/default/components/EmailCard.tsx +138 -138
- package/templates/default/components/EmailPasswordForm.tsx +85 -85
- package/templates/default/components/EmailQuotaForm.tsx +73 -73
- package/templates/default/components/EmailsPage.tsx +49 -49
- package/templates/default/components/ErrorComponent.tsx +16 -16
- package/templates/default/components/GalleryPhoto.tsx +93 -93
- package/templates/default/components/InfoCard.tsx +93 -93
- package/templates/default/components/ItemEditPage.tsx +214 -214
- package/templates/default/components/Layout.tsx +84 -84
- package/templates/default/components/LoadingSpinners.tsx +67 -67
- package/templates/default/components/LogPage.tsx +107 -107
- package/templates/default/components/Modal.tsx +166 -166
- package/templates/default/components/Navbar.tsx +258 -258
- package/templates/default/components/NewAdminForm.tsx +173 -173
- package/templates/default/components/NewEmailForm.tsx +132 -132
- package/templates/default/components/NewPage.tsx +205 -205
- package/templates/default/components/NewVariantComponent.tsx +229 -229
- package/templates/default/components/PhotoGallery.tsx +35 -35
- package/templates/default/components/PieChartBox.tsx +101 -101
- package/templates/default/components/ProgressBar.tsx +48 -48
- package/templates/default/components/ProtectedDocument.tsx +78 -78
- package/templates/default/components/ProtectedImage.tsx +143 -143
- package/templates/default/components/ProtectedVideo.tsx +76 -76
- package/templates/default/components/SectionItemCard.tsx +144 -144
- package/templates/default/components/SectionItemStatusBadge.tsx +17 -17
- package/templates/default/components/SectionPage.tsx +125 -125
- package/templates/default/components/SelectBox.tsx +98 -98
- package/templates/default/components/SelectInputButtons.tsx +125 -125
- package/templates/default/components/SettingsPage.tsx +232 -232
- package/templates/default/components/Sidebar.tsx +201 -201
- package/templates/default/components/SidebarDropdownItem.tsx +80 -80
- package/templates/default/components/SidebarItem.tsx +20 -20
- package/templates/default/components/ThemeProvider.tsx +8 -8
- package/templates/default/components/TooltipComponent.tsx +27 -27
- package/templates/default/components/VariantCard.tsx +124 -124
- package/templates/default/components/VariantEditPage.tsx +230 -230
- package/templates/default/components/analytics/BounceRate.tsx +70 -70
- package/templates/default/components/analytics/LivePageViews.tsx +55 -55
- package/templates/default/components/analytics/LiveUsersCount.tsx +33 -33
- package/templates/default/components/analytics/MonthlyPageViews.tsx +42 -42
- package/templates/default/components/analytics/TopCountries.tsx +52 -52
- package/templates/default/components/analytics/TopDevices.tsx +46 -46
- package/templates/default/components/analytics/TopMediums.tsx +58 -58
- package/templates/default/components/analytics/TopSources.tsx +45 -45
- package/templates/default/components/analytics/TotalPageViews.tsx +41 -41
- package/templates/default/components/analytics/TotalSessions.tsx +41 -41
- package/templates/default/components/analytics/TotalUniqueUsers.tsx +41 -41
- package/templates/default/components/custom/RightHomeRoomVariantCard.tsx +138 -138
- package/templates/default/components/dndKit/Draggable.tsx +21 -21
- package/templates/default/components/dndKit/Droppable.tsx +20 -20
- package/templates/default/components/dndKit/SortableItem.tsx +18 -18
- package/templates/default/components/form/DateRangeFormInput.tsx +57 -57
- package/templates/default/components/form/Form.tsx +317 -317
- package/templates/default/components/form/FormInputElement.tsx +70 -70
- package/templates/default/components/form/FormInputs.tsx +112 -112
- package/templates/default/components/form/helpers/_section-hot-reload.js +1 -1
- package/templates/default/components/form/helpers/util.ts +17 -17
- package/templates/default/components/form/inputs/CheckboxFormInput.tsx +33 -33
- package/templates/default/components/form/inputs/ColorFormInput.tsx +44 -44
- package/templates/default/components/form/inputs/DateFormInput.tsx +156 -156
- package/templates/default/components/form/inputs/DocumentFormInput.tsx +222 -222
- package/templates/default/components/form/inputs/MapFormInput.tsx +140 -140
- package/templates/default/components/form/inputs/MultipleSelectFormInput.tsx +83 -83
- package/templates/default/components/form/inputs/NumberFormInput.tsx +42 -42
- package/templates/default/components/form/inputs/PasswordFormInput.tsx +47 -47
- package/templates/default/components/form/inputs/PhotoFormInput.tsx +219 -219
- package/templates/default/components/form/inputs/RichTextFormInput.tsx +135 -135
- package/templates/default/components/form/inputs/SelectFormInput.tsx +175 -175
- package/templates/default/components/form/inputs/SlugFormInput.tsx +129 -129
- package/templates/default/components/form/inputs/TagsFormInput.tsx +154 -154
- package/templates/default/components/form/inputs/TextFormInput.tsx +48 -48
- package/templates/default/components/form/inputs/TextareaFormInput.tsx +47 -47
- package/templates/default/components/form/inputs/VideoFormInput.tsx +118 -118
- package/templates/default/components/locale-dropdown.tsx +74 -74
- package/templates/default/components/locale-picker.tsx +85 -85
- package/templates/default/components/login-locale-dropdown.tsx +46 -46
- package/templates/default/components/multi-select.tsx +1144 -1144
- package/templates/default/components/pagination/Pagination.tsx +36 -36
- package/templates/default/components/pagination/PaginationButtons.tsx +147 -147
- package/templates/default/components/theme-toggle.tsx +37 -37
- package/templates/default/components/ui/accordion.tsx +53 -53
- package/templates/default/components/ui/alert-dialog.tsx +157 -157
- package/templates/default/components/ui/alert.tsx +46 -46
- package/templates/default/components/ui/badge.tsx +38 -38
- package/templates/default/components/ui/button.tsx +62 -62
- package/templates/default/components/ui/calendar.tsx +166 -166
- package/templates/default/components/ui/card.tsx +43 -43
- package/templates/default/components/ui/checkbox.tsx +29 -29
- package/templates/default/components/ui/command.tsx +137 -137
- package/templates/default/components/ui/custom-alert-dialog.tsx +113 -113
- package/templates/default/components/ui/custom-dialog.tsx +123 -123
- package/templates/default/components/ui/dialog.tsx +123 -123
- package/templates/default/components/ui/dropdown-menu.tsx +182 -182
- package/templates/default/components/ui/input-group.tsx +54 -54
- package/templates/default/components/ui/input.tsx +22 -22
- package/templates/default/components/ui/label.tsx +19 -19
- package/templates/default/components/ui/popover.tsx +42 -42
- package/templates/default/components/ui/progress.tsx +31 -31
- package/templates/default/components/ui/scroll-area.tsx +42 -42
- package/templates/default/components/ui/select.tsx +165 -165
- package/templates/default/components/ui/separator.tsx +28 -28
- package/templates/default/components/ui/sheet.tsx +103 -103
- package/templates/default/components/ui/switch.tsx +29 -29
- package/templates/default/components/ui/table.tsx +83 -83
- package/templates/default/components/ui/tabs.tsx +55 -55
- package/templates/default/components/ui/toast.tsx +113 -113
- package/templates/default/components/ui/toaster.tsx +35 -35
- package/templates/default/components/ui/tooltip.tsx +30 -30
- package/templates/default/components/ui/use-toast.ts +188 -188
- package/templates/default/components.json +21 -21
- package/templates/default/context/ModalProvider.tsx +53 -53
- package/templates/default/drizzle.config.ts +4 -4
- package/templates/default/dynamic-schemas/schema.ts +10 -0
- package/templates/default/env/env.js +130 -130
- package/templates/default/envConfig.ts +4 -4
- package/templates/default/hooks/useModal.ts +8 -8
- package/templates/default/lib/apiHelpers.ts +92 -92
- package/templates/default/lib/postinstall.js +14 -14
- package/templates/default/lib/utils.ts +6 -6
- package/templates/default/next-env.d.ts +6 -6
- package/templates/default/next.config.ts +23 -23
- package/templates/default/package.json +2 -4
- package/templates/default/postcss.config.mjs +6 -6
- package/templates/default/proxy.ts +32 -32
- package/templates/default/tsconfig.json +48 -48
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import classNames from 'classnames'
|
|
3
|
-
import { Badge } from '@/components/ui/badge'
|
|
4
|
-
import { FieldError } from 'react-hook-form'
|
|
5
|
-
import { useI18n } from 'nextjs-cms/translations/client'
|
|
6
|
-
|
|
7
|
-
export default function FormInputElement({
|
|
8
|
-
label,
|
|
9
|
-
required = false,
|
|
10
|
-
readonly = false,
|
|
11
|
-
classes = '',
|
|
12
|
-
direction = 'row',
|
|
13
|
-
value,
|
|
14
|
-
children,
|
|
15
|
-
validationError,
|
|
16
|
-
}: {
|
|
17
|
-
label: string
|
|
18
|
-
required: boolean | string
|
|
19
|
-
readonly?: boolean
|
|
20
|
-
classes?: string
|
|
21
|
-
direction?: 'row' | 'col'
|
|
22
|
-
value?: any
|
|
23
|
-
children: React.ReactNode
|
|
24
|
-
validationError: FieldError | undefined
|
|
25
|
-
}) {
|
|
26
|
-
const t = useI18n()
|
|
27
|
-
return (
|
|
28
|
-
<div
|
|
29
|
-
className={classNames({
|
|
30
|
-
'items-center py-2': true,
|
|
31
|
-
'flex flex-col': direction === 'col',
|
|
32
|
-
'items-center px-3 md-sidebar:grid md-sidebar:grid-cols-10': direction === 'row',
|
|
33
|
-
classes: classes,
|
|
34
|
-
})}
|
|
35
|
-
>
|
|
36
|
-
<label
|
|
37
|
-
className={classNames({
|
|
38
|
-
'block pe-3 font-bold text-foreground': true,
|
|
39
|
-
'w-full text-start': direction === 'col',
|
|
40
|
-
'col-span-10 pb-1 md-sidebar:col-span-2 md-sidebar:pb-0 md-sidebar:text-end': direction === 'row',
|
|
41
|
-
})}
|
|
42
|
-
>
|
|
43
|
-
{label} {['true', 1, true].includes(required) ? '*' : null}
|
|
44
|
-
{readonly ? (
|
|
45
|
-
<>
|
|
46
|
-
{' '}
|
|
47
|
-
<Badge variant={'primary'}>{t('readonly')}</Badge>
|
|
48
|
-
</>
|
|
49
|
-
) : null}
|
|
50
|
-
</label>
|
|
51
|
-
<div
|
|
52
|
-
className={classNames({
|
|
53
|
-
'col-span-8': direction === 'row',
|
|
54
|
-
'w-full': direction === 'col',
|
|
55
|
-
})}
|
|
56
|
-
>
|
|
57
|
-
{readonly ? (
|
|
58
|
-
<div className='w-full rounded bg-input p-3 text-foreground shadow-xs outline-0'>{value}</div>
|
|
59
|
-
) : (
|
|
60
|
-
<>
|
|
61
|
-
{children}
|
|
62
|
-
{validationError ? (
|
|
63
|
-
<div className='mt-1 text-sm text-red-500'>{validationError.message}</div>
|
|
64
|
-
) : null}
|
|
65
|
-
</>
|
|
66
|
-
)}
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
)
|
|
70
|
-
}
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import classNames from 'classnames'
|
|
3
|
+
import { Badge } from '@/components/ui/badge'
|
|
4
|
+
import { FieldError } from 'react-hook-form'
|
|
5
|
+
import { useI18n } from 'nextjs-cms/translations/client'
|
|
6
|
+
|
|
7
|
+
export default function FormInputElement({
|
|
8
|
+
label,
|
|
9
|
+
required = false,
|
|
10
|
+
readonly = false,
|
|
11
|
+
classes = '',
|
|
12
|
+
direction = 'row',
|
|
13
|
+
value,
|
|
14
|
+
children,
|
|
15
|
+
validationError,
|
|
16
|
+
}: {
|
|
17
|
+
label: string
|
|
18
|
+
required: boolean | string
|
|
19
|
+
readonly?: boolean
|
|
20
|
+
classes?: string
|
|
21
|
+
direction?: 'row' | 'col'
|
|
22
|
+
value?: any
|
|
23
|
+
children: React.ReactNode
|
|
24
|
+
validationError: FieldError | undefined
|
|
25
|
+
}) {
|
|
26
|
+
const t = useI18n()
|
|
27
|
+
return (
|
|
28
|
+
<div
|
|
29
|
+
className={classNames({
|
|
30
|
+
'items-center py-2': true,
|
|
31
|
+
'flex flex-col': direction === 'col',
|
|
32
|
+
'items-center px-3 md-sidebar:grid md-sidebar:grid-cols-10': direction === 'row',
|
|
33
|
+
classes: classes,
|
|
34
|
+
})}
|
|
35
|
+
>
|
|
36
|
+
<label
|
|
37
|
+
className={classNames({
|
|
38
|
+
'block pe-3 font-bold text-foreground': true,
|
|
39
|
+
'w-full text-start': direction === 'col',
|
|
40
|
+
'col-span-10 pb-1 md-sidebar:col-span-2 md-sidebar:pb-0 md-sidebar:text-end': direction === 'row',
|
|
41
|
+
})}
|
|
42
|
+
>
|
|
43
|
+
{label} {['true', 1, true].includes(required) ? '*' : null}
|
|
44
|
+
{readonly ? (
|
|
45
|
+
<>
|
|
46
|
+
{' '}
|
|
47
|
+
<Badge variant={'primary'}>{t('readonly')}</Badge>
|
|
48
|
+
</>
|
|
49
|
+
) : null}
|
|
50
|
+
</label>
|
|
51
|
+
<div
|
|
52
|
+
className={classNames({
|
|
53
|
+
'col-span-8': direction === 'row',
|
|
54
|
+
'w-full': direction === 'col',
|
|
55
|
+
})}
|
|
56
|
+
>
|
|
57
|
+
{readonly ? (
|
|
58
|
+
<div className='w-full rounded bg-input p-3 text-foreground shadow-xs outline-0'>{value}</div>
|
|
59
|
+
) : (
|
|
60
|
+
<>
|
|
61
|
+
{children}
|
|
62
|
+
{validationError ? (
|
|
63
|
+
<div className='mt-1 text-sm text-red-500'>{validationError.message}</div>
|
|
64
|
+
) : null}
|
|
65
|
+
</>
|
|
66
|
+
)}
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
)
|
|
70
|
+
}
|
|
@@ -1,112 +1,112 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import ColorFormInput from '@/components/form/inputs/ColorFormInput'
|
|
3
|
-
import NumberFormInput from '@/components/form/inputs/NumberFormInput'
|
|
4
|
-
import TextFormInput from '@/components/form/inputs/TextFormInput'
|
|
5
|
-
import DateFormInput from '@/components/form/inputs/DateFormInput'
|
|
6
|
-
import RichTextFormInput from '@/components/form/inputs/RichTextFormInput'
|
|
7
|
-
import SelectFormInput from '@/components/form/inputs/SelectFormInput'
|
|
8
|
-
import MultipleSelectFormInput from '@/components/form/inputs/MultipleSelectFormInput'
|
|
9
|
-
import PhotoFormInput from '@/components/form/inputs/PhotoFormInput'
|
|
10
|
-
import DocumentFormInput from '@/components/form/inputs/DocumentFormInput'
|
|
11
|
-
import TagsFormInput from '@/components/form/inputs/TagsFormInput'
|
|
12
|
-
import CheckboxFormInput from '@/components/form/inputs/CheckboxFormInput'
|
|
13
|
-
import MapFormInput from '@/components/form/inputs/MapFormInput'
|
|
14
|
-
import PasswordFormInput from '@/components/form/inputs/PasswordFormInput'
|
|
15
|
-
import TextareaFormInput from '@/components/form/inputs/TextareaFormInput'
|
|
16
|
-
import VideoFormInput from '@/components/form/inputs/VideoFormInput'
|
|
17
|
-
import SlugFormInput from '@/components/form/inputs/SlugFormInput'
|
|
18
|
-
import type { FieldClientConfig } from 'nextjs-cms/core/fields'
|
|
19
|
-
import {
|
|
20
|
-
CheckboxFieldClientConfig,
|
|
21
|
-
ColorFieldClientConfig,
|
|
22
|
-
DateFieldClientConfig,
|
|
23
|
-
DocumentFieldClientConfig,
|
|
24
|
-
MapFieldClientConfig,
|
|
25
|
-
NumberFieldClientConfig,
|
|
26
|
-
PasswordFieldClientConfig,
|
|
27
|
-
PhotoFieldClientConfig,
|
|
28
|
-
RichTextFieldClientConfig,
|
|
29
|
-
SelectFieldClientConfig,
|
|
30
|
-
SelectMultipleFieldClientConfig,
|
|
31
|
-
TagsFieldClientConfig,
|
|
32
|
-
TextAreaFieldClientConfig,
|
|
33
|
-
TextFieldClientConfig,
|
|
34
|
-
VideoFieldClientConfig,
|
|
35
|
-
SlugFieldClientConfig,
|
|
36
|
-
} from 'nextjs-cms/core/fields'
|
|
37
|
-
|
|
38
|
-
export default function FormInputs({ inputs, sectionName }: { inputs: FieldClientConfig[]; sectionName: string }) {
|
|
39
|
-
return (
|
|
40
|
-
<>
|
|
41
|
-
{inputs?.length > 0 &&
|
|
42
|
-
inputs?.map((input) => {
|
|
43
|
-
switch (input.type) {
|
|
44
|
-
case 'color':
|
|
45
|
-
return <ColorFormInput input={input as ColorFieldClientConfig} key={input.name} />
|
|
46
|
-
case 'number':
|
|
47
|
-
return <NumberFormInput input={input as NumberFieldClientConfig} key={input.name} />
|
|
48
|
-
case 'text':
|
|
49
|
-
return <TextFormInput input={input as TextFieldClientConfig} key={input.name} />
|
|
50
|
-
case 'date':
|
|
51
|
-
return <DateFormInput input={input as DateFieldClientConfig} key={input.name} />
|
|
52
|
-
case 'rich_text':
|
|
53
|
-
return <RichTextFormInput input={input as RichTextFieldClientConfig} key={input.name} />
|
|
54
|
-
case 'textarea':
|
|
55
|
-
return <TextareaFormInput input={input as TextAreaFieldClientConfig} key={input.name} />
|
|
56
|
-
case 'select':
|
|
57
|
-
return (
|
|
58
|
-
<SelectFormInput
|
|
59
|
-
sectionName={sectionName}
|
|
60
|
-
input={input as SelectFieldClientConfig}
|
|
61
|
-
key={input.name}
|
|
62
|
-
/>
|
|
63
|
-
)
|
|
64
|
-
case 'select_multiple':
|
|
65
|
-
return (
|
|
66
|
-
<MultipleSelectFormInput
|
|
67
|
-
input={input as SelectMultipleFieldClientConfig}
|
|
68
|
-
key={input.name}
|
|
69
|
-
/>
|
|
70
|
-
)
|
|
71
|
-
case 'photo':
|
|
72
|
-
return (
|
|
73
|
-
<PhotoFormInput
|
|
74
|
-
sectionName={sectionName}
|
|
75
|
-
input={input as PhotoFieldClientConfig}
|
|
76
|
-
key={input.name}
|
|
77
|
-
/>
|
|
78
|
-
)
|
|
79
|
-
case 'video':
|
|
80
|
-
return (
|
|
81
|
-
<VideoFormInput
|
|
82
|
-
sectionName={sectionName}
|
|
83
|
-
input={input as VideoFieldClientConfig}
|
|
84
|
-
key={input.name}
|
|
85
|
-
/>
|
|
86
|
-
)
|
|
87
|
-
case 'document':
|
|
88
|
-
return (
|
|
89
|
-
<DocumentFormInput
|
|
90
|
-
sectionName={sectionName}
|
|
91
|
-
input={input as DocumentFieldClientConfig}
|
|
92
|
-
key={input.name}
|
|
93
|
-
/>
|
|
94
|
-
)
|
|
95
|
-
case 'password':
|
|
96
|
-
return <PasswordFormInput input={input as PasswordFieldClientConfig} key={input.name} />
|
|
97
|
-
case 'tags':
|
|
98
|
-
return <TagsFormInput input={input as TagsFieldClientConfig} key={input.name} />
|
|
99
|
-
case 'map':
|
|
100
|
-
return <MapFormInput input={input as MapFieldClientConfig} key={input.name} />
|
|
101
|
-
case 'checkbox':
|
|
102
|
-
// case 'permission':
|
|
103
|
-
return <CheckboxFormInput input={input as CheckboxFieldClientConfig} key={input.name} />
|
|
104
|
-
case 'slug':
|
|
105
|
-
return <SlugFormInput input={input as SlugFieldClientConfig} key={input.name} />
|
|
106
|
-
default:
|
|
107
|
-
return null
|
|
108
|
-
}
|
|
109
|
-
})}
|
|
110
|
-
</>
|
|
111
|
-
)
|
|
112
|
-
}
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import ColorFormInput from '@/components/form/inputs/ColorFormInput'
|
|
3
|
+
import NumberFormInput from '@/components/form/inputs/NumberFormInput'
|
|
4
|
+
import TextFormInput from '@/components/form/inputs/TextFormInput'
|
|
5
|
+
import DateFormInput from '@/components/form/inputs/DateFormInput'
|
|
6
|
+
import RichTextFormInput from '@/components/form/inputs/RichTextFormInput'
|
|
7
|
+
import SelectFormInput from '@/components/form/inputs/SelectFormInput'
|
|
8
|
+
import MultipleSelectFormInput from '@/components/form/inputs/MultipleSelectFormInput'
|
|
9
|
+
import PhotoFormInput from '@/components/form/inputs/PhotoFormInput'
|
|
10
|
+
import DocumentFormInput from '@/components/form/inputs/DocumentFormInput'
|
|
11
|
+
import TagsFormInput from '@/components/form/inputs/TagsFormInput'
|
|
12
|
+
import CheckboxFormInput from '@/components/form/inputs/CheckboxFormInput'
|
|
13
|
+
import MapFormInput from '@/components/form/inputs/MapFormInput'
|
|
14
|
+
import PasswordFormInput from '@/components/form/inputs/PasswordFormInput'
|
|
15
|
+
import TextareaFormInput from '@/components/form/inputs/TextareaFormInput'
|
|
16
|
+
import VideoFormInput from '@/components/form/inputs/VideoFormInput'
|
|
17
|
+
import SlugFormInput from '@/components/form/inputs/SlugFormInput'
|
|
18
|
+
import type { FieldClientConfig } from 'nextjs-cms/core/fields'
|
|
19
|
+
import {
|
|
20
|
+
CheckboxFieldClientConfig,
|
|
21
|
+
ColorFieldClientConfig,
|
|
22
|
+
DateFieldClientConfig,
|
|
23
|
+
DocumentFieldClientConfig,
|
|
24
|
+
MapFieldClientConfig,
|
|
25
|
+
NumberFieldClientConfig,
|
|
26
|
+
PasswordFieldClientConfig,
|
|
27
|
+
PhotoFieldClientConfig,
|
|
28
|
+
RichTextFieldClientConfig,
|
|
29
|
+
SelectFieldClientConfig,
|
|
30
|
+
SelectMultipleFieldClientConfig,
|
|
31
|
+
TagsFieldClientConfig,
|
|
32
|
+
TextAreaFieldClientConfig,
|
|
33
|
+
TextFieldClientConfig,
|
|
34
|
+
VideoFieldClientConfig,
|
|
35
|
+
SlugFieldClientConfig,
|
|
36
|
+
} from 'nextjs-cms/core/fields'
|
|
37
|
+
|
|
38
|
+
export default function FormInputs({ inputs, sectionName }: { inputs: FieldClientConfig[]; sectionName: string }) {
|
|
39
|
+
return (
|
|
40
|
+
<>
|
|
41
|
+
{inputs?.length > 0 &&
|
|
42
|
+
inputs?.map((input) => {
|
|
43
|
+
switch (input.type) {
|
|
44
|
+
case 'color':
|
|
45
|
+
return <ColorFormInput input={input as ColorFieldClientConfig} key={input.name} />
|
|
46
|
+
case 'number':
|
|
47
|
+
return <NumberFormInput input={input as NumberFieldClientConfig} key={input.name} />
|
|
48
|
+
case 'text':
|
|
49
|
+
return <TextFormInput input={input as TextFieldClientConfig} key={input.name} />
|
|
50
|
+
case 'date':
|
|
51
|
+
return <DateFormInput input={input as DateFieldClientConfig} key={input.name} />
|
|
52
|
+
case 'rich_text':
|
|
53
|
+
return <RichTextFormInput input={input as RichTextFieldClientConfig} key={input.name} />
|
|
54
|
+
case 'textarea':
|
|
55
|
+
return <TextareaFormInput input={input as TextAreaFieldClientConfig} key={input.name} />
|
|
56
|
+
case 'select':
|
|
57
|
+
return (
|
|
58
|
+
<SelectFormInput
|
|
59
|
+
sectionName={sectionName}
|
|
60
|
+
input={input as SelectFieldClientConfig}
|
|
61
|
+
key={input.name}
|
|
62
|
+
/>
|
|
63
|
+
)
|
|
64
|
+
case 'select_multiple':
|
|
65
|
+
return (
|
|
66
|
+
<MultipleSelectFormInput
|
|
67
|
+
input={input as SelectMultipleFieldClientConfig}
|
|
68
|
+
key={input.name}
|
|
69
|
+
/>
|
|
70
|
+
)
|
|
71
|
+
case 'photo':
|
|
72
|
+
return (
|
|
73
|
+
<PhotoFormInput
|
|
74
|
+
sectionName={sectionName}
|
|
75
|
+
input={input as PhotoFieldClientConfig}
|
|
76
|
+
key={input.name}
|
|
77
|
+
/>
|
|
78
|
+
)
|
|
79
|
+
case 'video':
|
|
80
|
+
return (
|
|
81
|
+
<VideoFormInput
|
|
82
|
+
sectionName={sectionName}
|
|
83
|
+
input={input as VideoFieldClientConfig}
|
|
84
|
+
key={input.name}
|
|
85
|
+
/>
|
|
86
|
+
)
|
|
87
|
+
case 'document':
|
|
88
|
+
return (
|
|
89
|
+
<DocumentFormInput
|
|
90
|
+
sectionName={sectionName}
|
|
91
|
+
input={input as DocumentFieldClientConfig}
|
|
92
|
+
key={input.name}
|
|
93
|
+
/>
|
|
94
|
+
)
|
|
95
|
+
case 'password':
|
|
96
|
+
return <PasswordFormInput input={input as PasswordFieldClientConfig} key={input.name} />
|
|
97
|
+
case 'tags':
|
|
98
|
+
return <TagsFormInput input={input as TagsFieldClientConfig} key={input.name} />
|
|
99
|
+
case 'map':
|
|
100
|
+
return <MapFormInput input={input as MapFieldClientConfig} key={input.name} />
|
|
101
|
+
case 'checkbox':
|
|
102
|
+
// case 'permission':
|
|
103
|
+
return <CheckboxFormInput input={input as CheckboxFieldClientConfig} key={input.name} />
|
|
104
|
+
case 'slug':
|
|
105
|
+
return <SlugFormInput input={input as SlugFieldClientConfig} key={input.name} />
|
|
106
|
+
default:
|
|
107
|
+
return null
|
|
108
|
+
}
|
|
109
|
+
})}
|
|
110
|
+
</>
|
|
111
|
+
)
|
|
112
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
let configLastUpdated: number = 0
|
|
2
|
-
|
|
3
|
-
// Use new Function to bypass next.js dynamic import restriction
|
|
4
|
-
const loadHotReloadFile = async () => {
|
|
5
|
-
try {
|
|
6
|
-
// This approach completely bypasses next.js dynamic import restriction
|
|
7
|
-
const importFn = new Function('path', 'return import(path)')
|
|
8
|
-
const sectionInfo = await importFn('./_section-hot-reload.js')
|
|
9
|
-
configLastUpdated = sectionInfo?.configLastUpdated ?? 0
|
|
10
|
-
} catch {
|
|
11
|
-
configLastUpdated = 0
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
loadHotReloadFile()
|
|
16
|
-
|
|
17
|
-
export { configLastUpdated }
|
|
1
|
+
let configLastUpdated: number = 0
|
|
2
|
+
|
|
3
|
+
// Use new Function to bypass next.js dynamic import restriction
|
|
4
|
+
const loadHotReloadFile = async () => {
|
|
5
|
+
try {
|
|
6
|
+
// This approach completely bypasses next.js dynamic import restriction
|
|
7
|
+
const importFn = new Function('path', 'return import(path)')
|
|
8
|
+
const sectionInfo = await importFn('./_section-hot-reload.js')
|
|
9
|
+
configLastUpdated = sectionInfo?.configLastUpdated ?? 0
|
|
10
|
+
} catch {
|
|
11
|
+
configLastUpdated = 0
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
loadHotReloadFile()
|
|
16
|
+
|
|
17
|
+
export { configLastUpdated }
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import FormInputElement from '@/components/form/FormInputElement'
|
|
3
|
-
import { CheckboxFieldClientConfig } from 'nextjs-cms/core/fields'
|
|
4
|
-
import { useController, useFormContext } from 'react-hook-form'
|
|
5
|
-
import { Switch } from '@/components/ui/switch'
|
|
6
|
-
|
|
7
|
-
export default function CheckboxFormInput({ input }: { input: CheckboxFieldClientConfig }) {
|
|
8
|
-
const { control } = useFormContext()
|
|
9
|
-
const {
|
|
10
|
-
field,
|
|
11
|
-
fieldState: { invalid, isTouched, isDirty, error },
|
|
12
|
-
} = useController({
|
|
13
|
-
name: input.name,
|
|
14
|
-
control,
|
|
15
|
-
defaultValue: input.value === 1,
|
|
16
|
-
})
|
|
17
|
-
return (
|
|
18
|
-
<FormInputElement
|
|
19
|
-
validationError={error}
|
|
20
|
-
value={input.value}
|
|
21
|
-
readonly={input.readonly}
|
|
22
|
-
label={input.label}
|
|
23
|
-
required={input.required}
|
|
24
|
-
>
|
|
25
|
-
<Switch
|
|
26
|
-
ref={field.ref}
|
|
27
|
-
onCheckedChange={field.onChange}
|
|
28
|
-
defaultChecked={input.value === 1}
|
|
29
|
-
name={field.name}
|
|
30
|
-
/>
|
|
31
|
-
</FormInputElement>
|
|
32
|
-
)
|
|
33
|
-
}
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import FormInputElement from '@/components/form/FormInputElement'
|
|
3
|
+
import { CheckboxFieldClientConfig } from 'nextjs-cms/core/fields'
|
|
4
|
+
import { useController, useFormContext } from 'react-hook-form'
|
|
5
|
+
import { Switch } from '@/components/ui/switch'
|
|
6
|
+
|
|
7
|
+
export default function CheckboxFormInput({ input }: { input: CheckboxFieldClientConfig }) {
|
|
8
|
+
const { control } = useFormContext()
|
|
9
|
+
const {
|
|
10
|
+
field,
|
|
11
|
+
fieldState: { invalid, isTouched, isDirty, error },
|
|
12
|
+
} = useController({
|
|
13
|
+
name: input.name,
|
|
14
|
+
control,
|
|
15
|
+
defaultValue: input.value === 1,
|
|
16
|
+
})
|
|
17
|
+
return (
|
|
18
|
+
<FormInputElement
|
|
19
|
+
validationError={error}
|
|
20
|
+
value={input.value}
|
|
21
|
+
readonly={input.readonly}
|
|
22
|
+
label={input.label}
|
|
23
|
+
required={input.required}
|
|
24
|
+
>
|
|
25
|
+
<Switch
|
|
26
|
+
ref={field.ref}
|
|
27
|
+
onCheckedChange={field.onChange}
|
|
28
|
+
defaultChecked={input.value === 1}
|
|
29
|
+
name={field.name}
|
|
30
|
+
/>
|
|
31
|
+
</FormInputElement>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import FormInputElement from '@/components/form/FormInputElement'
|
|
3
|
-
import { ColorFieldClientConfig } from 'nextjs-cms/core/fields'
|
|
4
|
-
import { useController, useFormContext } from 'react-hook-form'
|
|
5
|
-
|
|
6
|
-
export default function ColorFormInput({ input }: { input: ColorFieldClientConfig }) {
|
|
7
|
-
const { control } = useFormContext()
|
|
8
|
-
const {
|
|
9
|
-
field,
|
|
10
|
-
fieldState: { invalid, isTouched, isDirty, error },
|
|
11
|
-
} = useController({
|
|
12
|
-
name: input.name,
|
|
13
|
-
control,
|
|
14
|
-
defaultValue: input.value ?? '#000000',
|
|
15
|
-
disabled: input.readonly,
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
const colorSpan = (
|
|
19
|
-
<>
|
|
20
|
-
<span style={{ padding: '2px 40px', backgroundColor: input.value }}></span>
|
|
21
|
-
</>
|
|
22
|
-
)
|
|
23
|
-
return (
|
|
24
|
-
<FormInputElement
|
|
25
|
-
validationError={error}
|
|
26
|
-
value={colorSpan}
|
|
27
|
-
readonly={input.readonly}
|
|
28
|
-
label={input.label}
|
|
29
|
-
required={input.required}
|
|
30
|
-
>
|
|
31
|
-
<input
|
|
32
|
-
type='color'
|
|
33
|
-
readOnly={input.readonly}
|
|
34
|
-
disabled={field.disabled}
|
|
35
|
-
name={field.name}
|
|
36
|
-
onChange={field.onChange}
|
|
37
|
-
onBlur={field.onBlur}
|
|
38
|
-
value={field.value}
|
|
39
|
-
ref={field.ref}
|
|
40
|
-
className='h-10 w-full rounded bg-input p-1 text-foreground shadow-xs outline-0 ring-2 ring-blue-300 focus:ring-blue-500'
|
|
41
|
-
/>
|
|
42
|
-
</FormInputElement>
|
|
43
|
-
)
|
|
44
|
-
}
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import FormInputElement from '@/components/form/FormInputElement'
|
|
3
|
+
import { ColorFieldClientConfig } from 'nextjs-cms/core/fields'
|
|
4
|
+
import { useController, useFormContext } from 'react-hook-form'
|
|
5
|
+
|
|
6
|
+
export default function ColorFormInput({ input }: { input: ColorFieldClientConfig }) {
|
|
7
|
+
const { control } = useFormContext()
|
|
8
|
+
const {
|
|
9
|
+
field,
|
|
10
|
+
fieldState: { invalid, isTouched, isDirty, error },
|
|
11
|
+
} = useController({
|
|
12
|
+
name: input.name,
|
|
13
|
+
control,
|
|
14
|
+
defaultValue: input.value ?? '#000000',
|
|
15
|
+
disabled: input.readonly,
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
const colorSpan = (
|
|
19
|
+
<>
|
|
20
|
+
<span style={{ padding: '2px 40px', backgroundColor: input.value }}></span>
|
|
21
|
+
</>
|
|
22
|
+
)
|
|
23
|
+
return (
|
|
24
|
+
<FormInputElement
|
|
25
|
+
validationError={error}
|
|
26
|
+
value={colorSpan}
|
|
27
|
+
readonly={input.readonly}
|
|
28
|
+
label={input.label}
|
|
29
|
+
required={input.required}
|
|
30
|
+
>
|
|
31
|
+
<input
|
|
32
|
+
type='color'
|
|
33
|
+
readOnly={input.readonly}
|
|
34
|
+
disabled={field.disabled}
|
|
35
|
+
name={field.name}
|
|
36
|
+
onChange={field.onChange}
|
|
37
|
+
onBlur={field.onBlur}
|
|
38
|
+
value={field.value}
|
|
39
|
+
ref={field.ref}
|
|
40
|
+
className='h-10 w-full rounded bg-input p-1 text-foreground shadow-xs outline-0 ring-2 ring-blue-300 focus:ring-blue-500'
|
|
41
|
+
/>
|
|
42
|
+
</FormInputElement>
|
|
43
|
+
)
|
|
44
|
+
}
|