create-nextjs-cms 0.9.30 → 0.9.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +71 -71
  3. package/dist/helpers/utils.js +16 -16
  4. package/dist/lib/section-creators.js +166 -166
  5. package/package.json +2 -2
  6. package/templates/default/.eslintrc.json +5 -5
  7. package/templates/default/.prettierignore +7 -7
  8. package/templates/default/.prettierrc.json +27 -27
  9. package/templates/default/CHANGELOG.md +140 -140
  10. package/templates/default/_gitignore +57 -57
  11. package/templates/default/app/(auth)/auth/login/LoginPage.tsx +192 -192
  12. package/templates/default/app/(auth)/auth/login/page.tsx +11 -11
  13. package/templates/default/app/(auth)/auth-language-provider.tsx +34 -34
  14. package/templates/default/app/(auth)/layout.tsx +81 -81
  15. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/plugin-server-registry.ts +10 -6
  16. package/templates/default/app/(rootLayout)/admins/page.tsx +10 -10
  17. package/templates/default/app/(rootLayout)/browse/[section]/[page]/page.tsx +22 -22
  18. package/templates/default/app/(rootLayout)/categorized/[section]/page.tsx +15 -15
  19. package/templates/default/app/(rootLayout)/dashboard/page.tsx +70 -70
  20. package/templates/default/app/(rootLayout)/edit/[section]/[itemId]/page.tsx +20 -20
  21. package/templates/default/app/(rootLayout)/layout.tsx +81 -81
  22. package/templates/default/app/(rootLayout)/loading.tsx +10 -10
  23. package/templates/default/app/(rootLayout)/log/page.tsx +7 -7
  24. package/templates/default/app/(rootLayout)/new/[section]/page.tsx +15 -15
  25. package/templates/default/app/(rootLayout)/section/[section]/page.tsx +19 -19
  26. package/templates/default/app/(rootLayout)/settings/page.tsx +13 -13
  27. package/templates/default/app/api/auth/csrf/route.ts +25 -25
  28. package/templates/default/app/api/auth/refresh/route.ts +10 -10
  29. package/templates/default/app/api/auth/route.ts +49 -49
  30. package/templates/default/app/api/auth/session/route.ts +20 -20
  31. package/templates/default/app/api/document/route.ts +165 -165
  32. package/templates/default/app/api/editor/photo/route.ts +49 -49
  33. package/templates/default/app/api/photo/route.ts +27 -27
  34. package/templates/default/app/api/submit/section/item/[slug]/route.ts +95 -95
  35. package/templates/default/app/api/submit/section/item/route.ts +56 -56
  36. package/templates/default/app/api/submit/section/simple/route.ts +86 -86
  37. package/templates/default/app/api/video/route.ts +174 -174
  38. package/templates/default/app/globals.css +236 -236
  39. package/templates/default/cms.config.ts +56 -56
  40. package/templates/default/components/admin/admin-card.tsx +165 -165
  41. package/templates/default/components/admin/admin-edit-page.tsx +124 -124
  42. package/templates/default/components/admin/admin-privilege-card.tsx +184 -184
  43. package/templates/default/components/admin/new-admin-form.tsx +172 -172
  44. package/templates/default/components/container-box.tsx +24 -24
  45. package/templates/default/components/dnd-kit/draggable.tsx +21 -21
  46. package/templates/default/components/dnd-kit/droppable.tsx +20 -20
  47. package/templates/default/components/dnd-kit/sortable-item.tsx +18 -18
  48. package/templates/default/components/feedback/error-component.tsx +16 -16
  49. package/templates/default/components/feedback/info-card.tsx +93 -93
  50. package/templates/default/components/feedback/loading-spinners.tsx +67 -67
  51. package/templates/default/components/feedback/modal.tsx +166 -166
  52. package/templates/default/components/feedback/progress-bar.tsx +48 -48
  53. package/templates/default/components/feedback/tooltip-component.tsx +27 -27
  54. package/templates/default/components/form/form-input-element.tsx +70 -70
  55. package/templates/default/components/form/helpers/_section-hot-reload.js +1 -1
  56. package/templates/default/components/form/helpers/util.ts +17 -17
  57. package/templates/default/components/form/inputs/checkbox-form-input.tsx +46 -46
  58. package/templates/default/components/form/inputs/color-form-input.tsx +44 -44
  59. package/templates/default/components/form/inputs/date-form-input.tsx +93 -93
  60. package/templates/default/components/form/inputs/map-form-input.tsx +141 -141
  61. package/templates/default/components/form/inputs/multiple-select-form-input.tsx +85 -85
  62. package/templates/default/components/form/inputs/number-form-input.tsx +43 -43
  63. package/templates/default/components/form/inputs/password-form-input.tsx +47 -47
  64. package/templates/default/components/form/inputs/photo-form-input.tsx +279 -279
  65. package/templates/default/components/form/inputs/rich-text-form-input.tsx +148 -148
  66. package/templates/default/components/form/inputs/select-form-input.tsx +159 -159
  67. package/templates/default/components/form/inputs/slug-form-input.tsx +131 -131
  68. package/templates/default/components/form/inputs/tags-form-input.tsx +255 -255
  69. package/templates/default/components/form/inputs/text-form-input.tsx +61 -61
  70. package/templates/default/components/form/inputs/textarea-form-input.tsx +61 -61
  71. package/templates/default/components/layout/default-nav-items.tsx +3 -3
  72. package/templates/default/components/layout/layout.tsx +84 -84
  73. package/templates/default/components/layout/navbar.tsx +258 -258
  74. package/templates/default/components/layout/sidebar-dropdown-item.tsx +83 -83
  75. package/templates/default/components/layout/sidebar-item.tsx +24 -24
  76. package/templates/default/components/layout/sidebar.tsx +229 -229
  77. package/templates/default/components/layout/theme-provider.tsx +8 -8
  78. package/templates/default/components/layout/theme-toggle.tsx +39 -39
  79. package/templates/default/components/locale/locale-switcher.tsx +98 -98
  80. package/templates/default/components/media/dropzone.tsx +154 -154
  81. package/templates/default/components/media/protected-document.tsx +44 -44
  82. package/templates/default/components/media/protected-image.tsx +143 -143
  83. package/templates/default/components/media/protected-video.tsx +76 -76
  84. package/templates/default/components/multi-select.tsx +1150 -1150
  85. package/templates/default/components/pages/admins-page.tsx +43 -43
  86. package/templates/default/components/pages/browse-page.tsx +106 -106
  87. package/templates/default/components/pages/categorized-section-page.tsx +31 -31
  88. package/templates/default/components/pages/dashboard-page-alt.tsx +45 -45
  89. package/templates/default/components/pages/item-edit-page.tsx +267 -267
  90. package/templates/default/components/pages/log-page.tsx +107 -107
  91. package/templates/default/components/pages/new-page.tsx +183 -183
  92. package/templates/default/components/pages/section-page.tsx +203 -203
  93. package/templates/default/components/pages/settings-page.tsx +232 -232
  94. package/templates/default/components/pagination/pagination-buttons.tsx +147 -147
  95. package/templates/default/components/pagination/pagination.tsx +36 -36
  96. package/templates/default/components/sections/category-delete-confirm-page.tsx +130 -130
  97. package/templates/default/components/sections/category-section-select-input.tsx +139 -139
  98. package/templates/default/components/sections/conditional-fields.tsx +49 -49
  99. package/templates/default/components/sections/section-icon.tsx +8 -8
  100. package/templates/default/components/sections/section-item-card.tsx +143 -143
  101. package/templates/default/components/sections/section-item-status-badge.tsx +17 -17
  102. package/templates/default/components/sections/select-input-buttons.tsx +125 -125
  103. package/templates/default/components/select-box.tsx +98 -98
  104. package/templates/default/components/ui/accordion.tsx +53 -53
  105. package/templates/default/components/ui/alert-dialog.tsx +113 -113
  106. package/templates/default/components/ui/alert.tsx +47 -47
  107. package/templates/default/components/ui/badge.tsx +38 -38
  108. package/templates/default/components/ui/card.tsx +43 -43
  109. package/templates/default/components/ui/command.tsx +137 -137
  110. package/templates/default/components/ui/custom-alert-dialog.tsx +113 -113
  111. package/templates/default/components/ui/custom-dialog.tsx +123 -123
  112. package/templates/default/components/ui/dialog.tsx +123 -123
  113. package/templates/default/components/ui/direction.tsx +22 -22
  114. package/templates/default/components/ui/dropdown-menu.tsx +182 -182
  115. package/templates/default/components/ui/input-group.tsx +54 -54
  116. package/templates/default/components/ui/input.tsx +22 -22
  117. package/templates/default/components/ui/label.tsx +19 -19
  118. package/templates/default/components/ui/popover.tsx +42 -42
  119. package/templates/default/components/ui/progress.tsx +31 -31
  120. package/templates/default/components/ui/scroll-area.tsx +42 -42
  121. package/templates/default/components/ui/select.tsx +165 -165
  122. package/templates/default/components/ui/separator.tsx +28 -28
  123. package/templates/default/components/ui/sheet.tsx +103 -103
  124. package/templates/default/components/ui/spinner.tsx +16 -16
  125. package/templates/default/components/ui/switch.tsx +29 -29
  126. package/templates/default/components/ui/table.tsx +83 -83
  127. package/templates/default/components/ui/tabs.tsx +55 -55
  128. package/templates/default/components/ui/toast.tsx +113 -113
  129. package/templates/default/components/ui/toaster.tsx +35 -35
  130. package/templates/default/components/ui/tooltip.tsx +30 -30
  131. package/templates/default/components/ui/use-toast.ts +187 -187
  132. package/templates/default/drizzle.config.ts +4 -4
  133. package/templates/default/dynamic-schemas/schema.ts +225 -75
  134. package/templates/default/env/env.ts +46 -46
  135. package/templates/default/envConfig.ts +4 -4
  136. package/templates/default/lib/postinstall.js +14 -14
  137. package/templates/default/lib/utils.ts +6 -6
  138. package/templates/default/next-env.d.ts +6 -6
  139. package/templates/default/next.config.ts +24 -24
  140. package/templates/default/package.json +1 -1
  141. package/templates/default/postcss.config.mjs +6 -6
  142. package/templates/default/proxy.ts +32 -32
  143. package/templates/default/tsconfig.json +48 -48
@@ -1,144 +1,144 @@
1
- import React from 'react'
2
- import { useI18n } from 'nextjs-cms/translations/client'
3
- import { useModal } from '@/components/feedback/modal-context'
4
- import ProtectedImage from '@/components/media/protected-image'
5
- import SectionItemStatusBadge from '@/components/sections/section-item-status-badge'
6
- import { displayDateFromString } from 'nextjs-cms/utils'
7
- import Link from 'next/link'
8
- import { CardTitle, CardHeader, CardFooter, Card, CardContent } from '@/components/ui/card'
9
- import { Button } from '@/components/ui/button'
10
- import { PersonIcon } from '@radix-ui/react-icons'
11
- import { trpc } from '@/app/_trpc/client'
1
+ import React from 'react'
2
+ import { useI18n } from 'nextjs-cms/translations/client'
3
+ import { useModal } from '@/components/feedback/modal-context'
4
+ import ProtectedImage from '@/components/media/protected-image'
5
+ import SectionItemStatusBadge from '@/components/sections/section-item-status-badge'
6
+ import { displayDateFromString } from 'nextjs-cms/utils'
7
+ import Link from 'next/link'
8
+ import { CardTitle, CardHeader, CardFooter, Card, CardContent } from '@/components/ui/card'
9
+ import { Button } from '@/components/ui/button'
10
+ import { PersonIcon } from '@radix-ui/react-icons'
11
+ import { trpc } from '@/app/_trpc/client'
12
12
  import type { RouterOutputs } from '@/app/_trpc/types'
13
-
14
- // Used to get elements of array types as types
15
- type ArrElement<ArrType> = ArrType extends readonly (infer ElementType)[] ? ElementType : never
16
-
17
- export default function SectionItemCard({
18
- sectionName,
19
- item,
20
- action,
21
- }: {
22
- sectionName: string
23
- item: ArrElement<RouterOutputs['hasItemsSections']['listItems']['items']>
24
- action: any
25
- }) {
26
- const t = useI18n()
27
- const { setModal } = useModal()
28
- const utils = trpc.useUtils()
29
- const deleteMutation = trpc.hasItemsSections.deleteItem.useMutation({
30
- onError: (error) => {
31
- setModal({
32
- title: t('delete'),
33
- body: (
34
- <div className='rounded border-2 border-dashed border-red-500 bg-red-100 p-2 text-red-800'>
35
- {error.message}
36
- </div>
37
- ),
38
- headerColor: 'bg-red-700',
39
- titleColor: 'text-white',
40
- lang: 'en',
41
- })
42
- },
43
-
44
- onSuccess: async (data) => {
45
- await utils.hasItemsSections.listItems.invalidate({
46
- sectionName: sectionName,
47
- })
48
- action()
49
- setModal({
50
- title: t('delete'),
51
- body: (
52
- <div className='rounded border-2 border-dashed border-green-500 bg-green-100 p-2 text-green-800'>
53
- {t('itemDeletedSuccessfully')}
54
- </div>
55
- ),
56
- headerColor: 'bg-green-700',
57
- titleColor: 'text-white',
58
- lang: 'en',
59
- })
60
- },
61
- })
62
- const handleDelete = async () => {
63
- deleteMutation.mutate({
64
- sectionName: sectionName,
65
- sectionItemId: item.id,
66
- })
67
- }
68
-
69
- return (
70
- <>
71
- <Card className='relative mx-auto w-full max-w-md overflow-hidden rounded-lg border-secondary-foreground pb-[85px] shadow-sm'>
72
- {item.coverPhoto ? (
73
- <div className='relative h-[200px]'>
74
- {[0, 1].includes(item.permission) ? <SectionItemStatusBadge status={item.permission} /> : null}
75
- <ProtectedImage
76
- className='h-64 w-full object-cover'
77
- photo={item.coverPhoto}
78
- section={sectionName}
79
- isThumb={true}
80
- alt={'item'}
81
- width={100}
82
- height={50}
83
- fill={true}
84
- />
85
- </div>
86
- ) : null}
87
- <CardHeader className='p-6'>
88
- <CardTitle className='text-xl font-bold'>{item.headingTitle}</CardTitle>
89
- </CardHeader>
90
- <CardContent className='mt-2'>
91
- <div className='flex flex-row flex-wrap gap-1'>
92
- <PersonIcon fontSize='small' /> {item.createdBy},{' '}
93
- {displayDateFromString(item.createdAt, 'en', false, ',')}
94
- </div>
95
- </CardContent>
96
- <CardFooter className='absolute bottom-0 start-0 flex h-[85px] w-full justify-between p-6'>
97
- <Link
98
- href={`/edit/${sectionName}/${item.id}`}
99
- className='rounded bg-primary px-3 py-1 font-semibold text-primary-foreground'
100
- >
101
- {t('edit')}
102
- </Link>
103
- <Button
104
- onClick={() => {
105
- setModal({
106
- title: t('delete'),
107
- body: (
108
- <div className='p-4'>
109
- <div className='flex flex-col gap-4'>
110
- <div>{t('deleteItemText')}</div>
111
- <div className='flex gap-2'>
112
- <button
113
- className='rounded bg-success px-2 py-1 text-success-foreground'
114
- onClick={handleDelete}
115
- >
116
- Yes
117
- </button>
118
- <button
119
- className='rounded bg-destructive px-2 py-1 text-destructive-foreground'
120
- onClick={() => {
121
- setModal(null)
122
- }}
123
- >
124
- No
125
- </button>
126
- </div>
127
- </div>
128
- </div>
129
- ),
130
- headerColor: 'bg-red-700',
131
- titleColor: 'text-white',
132
- lang: 'en',
133
- })
134
- }}
135
- variant='destructive'
136
- className='rounded px-3 py-1 font-semibold'
137
- >
138
- {t('delete')}
139
- </Button>
140
- </CardFooter>
141
- </Card>
142
- </>
143
- )
144
- }
13
+
14
+ // Used to get elements of array types as types
15
+ type ArrElement<ArrType> = ArrType extends readonly (infer ElementType)[] ? ElementType : never
16
+
17
+ export default function SectionItemCard({
18
+ sectionName,
19
+ item,
20
+ action,
21
+ }: {
22
+ sectionName: string
23
+ item: ArrElement<RouterOutputs['hasItemsSections']['listItems']['items']>
24
+ action: any
25
+ }) {
26
+ const t = useI18n()
27
+ const { setModal } = useModal()
28
+ const utils = trpc.useUtils()
29
+ const deleteMutation = trpc.hasItemsSections.deleteItem.useMutation({
30
+ onError: (error) => {
31
+ setModal({
32
+ title: t('delete'),
33
+ body: (
34
+ <div className='rounded border-2 border-dashed border-red-500 bg-red-100 p-2 text-red-800'>
35
+ {error.message}
36
+ </div>
37
+ ),
38
+ headerColor: 'bg-red-700',
39
+ titleColor: 'text-white',
40
+ lang: 'en',
41
+ })
42
+ },
43
+
44
+ onSuccess: async (data) => {
45
+ await utils.hasItemsSections.listItems.invalidate({
46
+ sectionName: sectionName,
47
+ })
48
+ action()
49
+ setModal({
50
+ title: t('delete'),
51
+ body: (
52
+ <div className='rounded border-2 border-dashed border-green-500 bg-green-100 p-2 text-green-800'>
53
+ {t('itemDeletedSuccessfully')}
54
+ </div>
55
+ ),
56
+ headerColor: 'bg-green-700',
57
+ titleColor: 'text-white',
58
+ lang: 'en',
59
+ })
60
+ },
61
+ })
62
+ const handleDelete = async () => {
63
+ deleteMutation.mutate({
64
+ sectionName: sectionName,
65
+ sectionItemId: item.id,
66
+ })
67
+ }
68
+
69
+ return (
70
+ <>
71
+ <Card className='relative mx-auto w-full max-w-md overflow-hidden rounded-lg border-secondary-foreground pb-[85px] shadow-sm'>
72
+ {item.coverPhoto ? (
73
+ <div className='relative h-[200px]'>
74
+ {[0, 1].includes(item.permission) ? <SectionItemStatusBadge status={item.permission} /> : null}
75
+ <ProtectedImage
76
+ className='h-64 w-full object-cover'
77
+ photo={item.coverPhoto}
78
+ section={sectionName}
79
+ isThumb={true}
80
+ alt={'item'}
81
+ width={100}
82
+ height={50}
83
+ fill={true}
84
+ />
85
+ </div>
86
+ ) : null}
87
+ <CardHeader className='p-6'>
88
+ <CardTitle className='text-xl font-bold'>{item.headingTitle}</CardTitle>
89
+ </CardHeader>
90
+ <CardContent className='mt-2'>
91
+ <div className='flex flex-row flex-wrap gap-1'>
92
+ <PersonIcon fontSize='small' /> {item.createdBy},{' '}
93
+ {displayDateFromString(item.createdAt, 'en', false, ',')}
94
+ </div>
95
+ </CardContent>
96
+ <CardFooter className='absolute bottom-0 start-0 flex h-[85px] w-full justify-between p-6'>
97
+ <Link
98
+ href={`/edit/${sectionName}/${item.id}`}
99
+ className='rounded bg-primary px-3 py-1 font-semibold text-primary-foreground'
100
+ >
101
+ {t('edit')}
102
+ </Link>
103
+ <Button
104
+ onClick={() => {
105
+ setModal({
106
+ title: t('delete'),
107
+ body: (
108
+ <div className='p-4'>
109
+ <div className='flex flex-col gap-4'>
110
+ <div>{t('deleteItemText')}</div>
111
+ <div className='flex gap-2'>
112
+ <button
113
+ className='rounded bg-success px-2 py-1 text-success-foreground'
114
+ onClick={handleDelete}
115
+ >
116
+ Yes
117
+ </button>
118
+ <button
119
+ className='rounded bg-destructive px-2 py-1 text-destructive-foreground'
120
+ onClick={() => {
121
+ setModal(null)
122
+ }}
123
+ >
124
+ No
125
+ </button>
126
+ </div>
127
+ </div>
128
+ </div>
129
+ ),
130
+ headerColor: 'bg-red-700',
131
+ titleColor: 'text-white',
132
+ lang: 'en',
133
+ })
134
+ }}
135
+ variant='destructive'
136
+ className='rounded px-3 py-1 font-semibold'
137
+ >
138
+ {t('delete')}
139
+ </Button>
140
+ </CardFooter>
141
+ </Card>
142
+ </>
143
+ )
144
+ }
@@ -1,17 +1,17 @@
1
- import React from 'react'
2
- import { useI18n } from 'nextjs-cms/translations/client'
3
- import { Badge } from '@/components/ui/badge'
4
-
5
- const SectionItemStatusBadge = ({ status }: { status: number }) => {
6
- const t = useI18n()
7
- return (
8
- <Badge
9
- variant={status === 1 ? 'success' : 'destructive'}
10
- className='absolute top-3 shadow-sm left-3 z-30 font-bold'
11
- >
12
- {status === 1 ? t('approved') : t('pendingApproval')}
13
- </Badge>
14
- )
15
- }
16
-
17
- export default SectionItemStatusBadge
1
+ import React from 'react'
2
+ import { useI18n } from 'nextjs-cms/translations/client'
3
+ import { Badge } from '@/components/ui/badge'
4
+
5
+ const SectionItemStatusBadge = ({ status }: { status: number }) => {
6
+ const t = useI18n()
7
+ return (
8
+ <Badge
9
+ variant={status === 1 ? 'success' : 'destructive'}
10
+ className='absolute top-3 shadow-sm left-3 z-30 font-bold'
11
+ >
12
+ {status === 1 ? t('approved') : t('pendingApproval')}
13
+ </Badge>
14
+ )
15
+ }
16
+
17
+ export default SectionItemStatusBadge
@@ -1,125 +1,125 @@
1
- import { useI18n } from 'nextjs-cms/translations/client'
2
- import { useModal } from '@/components/feedback/modal-context'
3
- import React from 'react'
4
- import NewPage from '@/components/pages/new-page'
5
- import ItemEditPage from '@/components/pages/item-edit-page'
6
- import { Button } from '@/components/ui/button'
7
- import CategoryDeleteConfirmPage from '@/components/sections/category-delete-confirm-page'
8
-
9
- export default function SelectInputButtons({
10
- section,
11
- sectionTitle,
12
- value,
13
- parentId,
14
- level,
15
- refetch,
16
- reset,
17
- allowRecursiveDelete,
18
- }: {
19
- section: string
20
- sectionTitle: string
21
- value: string | number | undefined
22
- parentId: string | number | undefined
23
- level: number
24
- refetch: any
25
- reset: any
26
- allowRecursiveDelete: boolean
27
- }) {
28
- const t = useI18n()
29
- const { setModal } = useModal()
30
- const newCatInit = () => {
31
- setModal({
32
- title: t('addNewItem'),
33
- body: (
34
- <NewPage
35
- section={section}
36
- action={refetch}
37
- sectionType='categorized'
38
- hiddenInputs={[
39
- {
40
- name: 'parent_id',
41
- value: parentId,
42
- },
43
- {
44
- name: 'level',
45
- value: level.toString(),
46
- },
47
- ]}
48
- />
49
- ),
50
- headerColor: 'bg-emerald-700',
51
- titleColor: 'text-white',
52
- lang: 'en',
53
- size: 'xl',
54
- })
55
- }
56
-
57
- const catEditInit = () => {
58
- if (value === undefined) return
59
- setModal({
60
- title: t('edit'),
61
- body: (
62
- <ItemEditPage
63
- sectionType='categorized'
64
- action={() => {
65
- refetch()
66
- reset()
67
- }}
68
- itemId={value.toString()}
69
- section={section}
70
- hiddenInputs={[
71
- {
72
- name: 'parent_id',
73
- value: parentId,
74
- },
75
- {
76
- name: 'level',
77
- value: level.toString(),
78
- },
79
- ]}
80
- />
81
- ),
82
- headerColor: 'bg-blue-700',
83
- titleColor: 'text-white',
84
- lang: 'en',
85
- size: 'xl',
86
- })
87
- }
88
-
89
- const catDeleteInit = () => {
90
- if (value === undefined) return
91
- setModal({
92
- title: t('delete'),
93
- body: (
94
- <CategoryDeleteConfirmPage
95
- action={() => {
96
- refetch()
97
- reset()
98
- }}
99
- allowRecursiveDelete={allowRecursiveDelete}
100
- sectionTitle={sectionTitle}
101
- section={section}
102
- id={value.toString()}
103
- />
104
- ),
105
- headerColor: 'bg-red-700',
106
- titleColor: 'text-white',
107
- lang: 'en',
108
- size: 'lg',
109
- })
110
- }
111
-
112
- return (
113
- <div className='flex flex-row gap-1 pt-1'>
114
- <Button variant='default' size='sm' onClick={newCatInit} type='button'>
115
- {t('add')}
116
- </Button>
117
- <Button variant='secondary' size='sm' onClick={catEditInit} type='button' disabled={value === undefined}>
118
- {t('edit')}
119
- </Button>
120
- <Button variant='destructive' size='sm' onClick={catDeleteInit} disabled={value === undefined}>
121
- {t('delete')}
122
- </Button>
123
- </div>
124
- )
125
- }
1
+ import { useI18n } from 'nextjs-cms/translations/client'
2
+ import { useModal } from '@/components/feedback/modal-context'
3
+ import React from 'react'
4
+ import NewPage from '@/components/pages/new-page'
5
+ import ItemEditPage from '@/components/pages/item-edit-page'
6
+ import { Button } from '@/components/ui/button'
7
+ import CategoryDeleteConfirmPage from '@/components/sections/category-delete-confirm-page'
8
+
9
+ export default function SelectInputButtons({
10
+ section,
11
+ sectionTitle,
12
+ value,
13
+ parentId,
14
+ level,
15
+ refetch,
16
+ reset,
17
+ allowRecursiveDelete,
18
+ }: {
19
+ section: string
20
+ sectionTitle: string
21
+ value: string | number | undefined
22
+ parentId: string | number | undefined
23
+ level: number
24
+ refetch: any
25
+ reset: any
26
+ allowRecursiveDelete: boolean
27
+ }) {
28
+ const t = useI18n()
29
+ const { setModal } = useModal()
30
+ const newCatInit = () => {
31
+ setModal({
32
+ title: t('addNewItem'),
33
+ body: (
34
+ <NewPage
35
+ section={section}
36
+ action={refetch}
37
+ sectionType='categorized'
38
+ hiddenInputs={[
39
+ {
40
+ name: 'parent_id',
41
+ value: parentId,
42
+ },
43
+ {
44
+ name: 'level',
45
+ value: level.toString(),
46
+ },
47
+ ]}
48
+ />
49
+ ),
50
+ headerColor: 'bg-emerald-700',
51
+ titleColor: 'text-white',
52
+ lang: 'en',
53
+ size: 'xl',
54
+ })
55
+ }
56
+
57
+ const catEditInit = () => {
58
+ if (value === undefined) return
59
+ setModal({
60
+ title: t('edit'),
61
+ body: (
62
+ <ItemEditPage
63
+ sectionType='categorized'
64
+ action={() => {
65
+ refetch()
66
+ reset()
67
+ }}
68
+ itemId={value.toString()}
69
+ section={section}
70
+ hiddenInputs={[
71
+ {
72
+ name: 'parent_id',
73
+ value: parentId,
74
+ },
75
+ {
76
+ name: 'level',
77
+ value: level.toString(),
78
+ },
79
+ ]}
80
+ />
81
+ ),
82
+ headerColor: 'bg-blue-700',
83
+ titleColor: 'text-white',
84
+ lang: 'en',
85
+ size: 'xl',
86
+ })
87
+ }
88
+
89
+ const catDeleteInit = () => {
90
+ if (value === undefined) return
91
+ setModal({
92
+ title: t('delete'),
93
+ body: (
94
+ <CategoryDeleteConfirmPage
95
+ action={() => {
96
+ refetch()
97
+ reset()
98
+ }}
99
+ allowRecursiveDelete={allowRecursiveDelete}
100
+ sectionTitle={sectionTitle}
101
+ section={section}
102
+ id={value.toString()}
103
+ />
104
+ ),
105
+ headerColor: 'bg-red-700',
106
+ titleColor: 'text-white',
107
+ lang: 'en',
108
+ size: 'lg',
109
+ })
110
+ }
111
+
112
+ return (
113
+ <div className='flex flex-row gap-1 pt-1'>
114
+ <Button variant='default' size='sm' onClick={newCatInit} type='button'>
115
+ {t('add')}
116
+ </Button>
117
+ <Button variant='secondary' size='sm' onClick={catEditInit} type='button' disabled={value === undefined}>
118
+ {t('edit')}
119
+ </Button>
120
+ <Button variant='destructive' size='sm' onClick={catDeleteInit} disabled={value === undefined}>
121
+ {t('delete')}
122
+ </Button>
123
+ </div>
124
+ )
125
+ }