create-nextjs-cms 0.9.4 → 0.9.6

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 (187) 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 +3 -3
  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)/layout.tsx +81 -81
  14. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/page.tsx +40 -40
  15. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/plugin-server-registry.ts +16 -16
  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 +63 -63
  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/_trpc/client.ts +3 -3
  28. package/templates/default/app/api/auth/csrf/route.ts +25 -25
  29. package/templates/default/app/api/auth/refresh/route.ts +10 -10
  30. package/templates/default/app/api/auth/route.ts +49 -49
  31. package/templates/default/app/api/auth/session/route.ts +20 -20
  32. package/templates/default/app/api/document/route.ts +165 -165
  33. package/templates/default/app/api/editor/photo/route.ts +49 -49
  34. package/templates/default/app/api/photo/route.ts +27 -27
  35. package/templates/default/app/api/submit/section/item/[slug]/route.ts +95 -95
  36. package/templates/default/app/api/submit/section/item/route.ts +56 -56
  37. package/templates/default/app/api/submit/section/simple/route.ts +86 -86
  38. package/templates/default/app/api/trpc/[trpc]/route.ts +33 -33
  39. package/templates/default/app/api/video/route.ts +174 -174
  40. package/templates/default/app/globals.css +228 -228
  41. package/templates/default/app/providers.tsx +152 -152
  42. package/templates/default/cms.config.ts +58 -57
  43. package/templates/default/components/AdminCard.tsx +166 -166
  44. package/templates/default/components/AdminEditPage.tsx +124 -124
  45. package/templates/default/components/AdminPrivilegeCard.tsx +185 -185
  46. package/templates/default/components/AdminsPage.tsx +43 -43
  47. package/templates/default/components/AnalyticsPage.tsx +144 -128
  48. package/templates/default/components/BarChartBox.tsx +42 -42
  49. package/templates/default/components/BrowsePage.tsx +106 -106
  50. package/templates/default/components/CategorizedSectionPage.tsx +31 -31
  51. package/templates/default/components/CategoryDeleteConfirmPage.tsx +130 -130
  52. package/templates/default/components/CategorySectionSelectInput.tsx +140 -140
  53. package/templates/default/components/ConditionalFields.tsx +49 -49
  54. package/templates/default/components/ContainerBox.tsx +24 -24
  55. package/templates/default/components/DashboardPageAlt.tsx +45 -45
  56. package/templates/default/components/DefaultNavItems.tsx +3 -3
  57. package/templates/default/components/Dropzone.tsx +154 -154
  58. package/templates/default/components/ErrorComponent.tsx +16 -16
  59. package/templates/default/components/GalleryPhoto.tsx +93 -93
  60. package/templates/default/components/InfoCard.tsx +93 -93
  61. package/templates/default/components/ItemEditPage.tsx +294 -294
  62. package/templates/default/components/Layout.tsx +84 -84
  63. package/templates/default/components/LoadingSpinners.tsx +67 -67
  64. package/templates/default/components/LocaleSwitcher.tsx +89 -89
  65. package/templates/default/components/LogPage.tsx +107 -107
  66. package/templates/default/components/Modal.tsx +166 -166
  67. package/templates/default/components/Navbar.tsx +258 -258
  68. package/templates/default/components/NewAdminForm.tsx +173 -173
  69. package/templates/default/components/NewPage.tsx +206 -206
  70. package/templates/default/components/NewVariantComponent.tsx +229 -229
  71. package/templates/default/components/PhotoGallery.tsx +35 -35
  72. package/templates/default/components/PieChartBox.tsx +101 -101
  73. package/templates/default/components/ProgressBar.tsx +48 -48
  74. package/templates/default/components/ProtectedDocument.tsx +44 -44
  75. package/templates/default/components/ProtectedImage.tsx +143 -143
  76. package/templates/default/components/ProtectedVideo.tsx +76 -76
  77. package/templates/default/components/SectionIcon.tsx +8 -8
  78. package/templates/default/components/SectionItemCard.tsx +144 -144
  79. package/templates/default/components/SectionItemStatusBadge.tsx +17 -17
  80. package/templates/default/components/SectionPage.tsx +205 -205
  81. package/templates/default/components/SelectBox.tsx +98 -98
  82. package/templates/default/components/SelectInputButtons.tsx +125 -125
  83. package/templates/default/components/SettingsPage.tsx +232 -232
  84. package/templates/default/components/Sidebar.tsx +204 -204
  85. package/templates/default/components/SidebarDropdownItem.tsx +83 -83
  86. package/templates/default/components/SidebarItem.tsx +24 -24
  87. package/templates/default/components/ThemeProvider.tsx +8 -8
  88. package/templates/default/components/TooltipComponent.tsx +27 -27
  89. package/templates/default/components/VariantCard.tsx +124 -124
  90. package/templates/default/components/VariantEditPage.tsx +230 -230
  91. package/templates/default/components/analytics/BounceRate.tsx +70 -70
  92. package/templates/default/components/analytics/LivePageViews.tsx +55 -55
  93. package/templates/default/components/analytics/LiveUsersCount.tsx +33 -33
  94. package/templates/default/components/analytics/MonthlyPageViews.tsx +42 -42
  95. package/templates/default/components/analytics/TopCountries.tsx +52 -52
  96. package/templates/default/components/analytics/TopDevices.tsx +46 -46
  97. package/templates/default/components/analytics/TopMediums.tsx +58 -58
  98. package/templates/default/components/analytics/TopSources.tsx +45 -45
  99. package/templates/default/components/analytics/TotalPageViews.tsx +41 -41
  100. package/templates/default/components/analytics/TotalSessions.tsx +41 -41
  101. package/templates/default/components/analytics/TotalUniqueUsers.tsx +41 -41
  102. package/templates/default/components/custom/RightHomeRoomVariantCard.tsx +138 -138
  103. package/templates/default/components/dndKit/Draggable.tsx +21 -21
  104. package/templates/default/components/dndKit/Droppable.tsx +20 -20
  105. package/templates/default/components/dndKit/SortableItem.tsx +18 -18
  106. package/templates/default/components/form/Form.tsx +370 -360
  107. package/templates/default/components/form/FormInputElement.tsx +70 -70
  108. package/templates/default/components/form/FormInputs.tsx +120 -111
  109. package/templates/default/components/form/helpers/_section-hot-reload.js +1 -1
  110. package/templates/default/components/form/helpers/util.ts +17 -17
  111. package/templates/default/components/form/inputs/CheckboxFormInput.tsx +46 -46
  112. package/templates/default/components/form/inputs/ColorFormInput.tsx +44 -44
  113. package/templates/default/components/form/inputs/DateFormInput.tsx +156 -156
  114. package/templates/default/components/form/inputs/DateRangeFormInput.tsx +153 -0
  115. package/templates/default/components/form/inputs/DocumentFormInput.tsx +222 -222
  116. package/templates/default/components/form/inputs/MapFormInput.tsx +140 -140
  117. package/templates/default/components/form/inputs/MultipleSelectFormInput.tsx +85 -85
  118. package/templates/default/components/form/inputs/NumberFormInput.tsx +43 -43
  119. package/templates/default/components/form/inputs/PasswordFormInput.tsx +47 -47
  120. package/templates/default/components/form/inputs/PhotoFormInput.tsx +275 -275
  121. package/templates/default/components/form/inputs/RichTextFormInput.tsx +138 -138
  122. package/templates/default/components/form/inputs/SelectFormInput.tsx +175 -175
  123. package/templates/default/components/form/inputs/SlugFormInput.tsx +131 -131
  124. package/templates/default/components/form/inputs/TagsFormInput.tsx +261 -260
  125. package/templates/default/components/form/inputs/TextFormInput.tsx +51 -51
  126. package/templates/default/components/form/inputs/TextareaFormInput.tsx +50 -50
  127. package/templates/default/components/form/inputs/VideoFormInput.tsx +118 -118
  128. package/templates/default/components/multi-select.tsx +1146 -1146
  129. package/templates/default/components/pagination/Pagination.tsx +36 -36
  130. package/templates/default/components/pagination/PaginationButtons.tsx +147 -147
  131. package/templates/default/components/theme-toggle.tsx +39 -39
  132. package/templates/default/components/ui/accordion.tsx +53 -53
  133. package/templates/default/components/ui/alert-dialog.tsx +157 -157
  134. package/templates/default/components/ui/alert.tsx +47 -47
  135. package/templates/default/components/ui/badge.tsx +38 -38
  136. package/templates/default/components/ui/button.tsx +62 -62
  137. package/templates/default/components/ui/calendar.tsx +166 -166
  138. package/templates/default/components/ui/card.tsx +43 -43
  139. package/templates/default/components/ui/checkbox.tsx +29 -29
  140. package/templates/default/components/ui/command.tsx +137 -137
  141. package/templates/default/components/ui/custom-alert-dialog.tsx +113 -113
  142. package/templates/default/components/ui/custom-dialog.tsx +123 -123
  143. package/templates/default/components/ui/dialog.tsx +123 -123
  144. package/templates/default/components/ui/direction.tsx +22 -22
  145. package/templates/default/components/ui/dropdown-menu.tsx +182 -182
  146. package/templates/default/components/ui/input-group.tsx +54 -54
  147. package/templates/default/components/ui/input.tsx +22 -22
  148. package/templates/default/components/ui/label.tsx +19 -19
  149. package/templates/default/components/ui/popover.tsx +42 -42
  150. package/templates/default/components/ui/progress.tsx +31 -31
  151. package/templates/default/components/ui/scroll-area.tsx +42 -42
  152. package/templates/default/components/ui/select.tsx +165 -165
  153. package/templates/default/components/ui/separator.tsx +28 -28
  154. package/templates/default/components/ui/sheet.tsx +103 -103
  155. package/templates/default/components/ui/spinner.tsx +16 -16
  156. package/templates/default/components/ui/switch.tsx +29 -29
  157. package/templates/default/components/ui/table.tsx +83 -83
  158. package/templates/default/components/ui/tabs.tsx +55 -55
  159. package/templates/default/components/ui/toast.tsx +113 -113
  160. package/templates/default/components/ui/toaster.tsx +35 -35
  161. package/templates/default/components/ui/tooltip.tsx +30 -30
  162. package/templates/default/components/ui/use-toast.ts +188 -188
  163. package/templates/default/components.json +21 -21
  164. package/templates/default/context/ModalProvider.tsx +53 -53
  165. package/templates/default/drizzle.config.ts +4 -4
  166. package/templates/default/env/env.js +130 -130
  167. package/templates/default/envConfig.ts +4 -4
  168. package/templates/default/hooks/useModal.ts +8 -8
  169. package/templates/default/lib/apiHelpers.ts +92 -92
  170. package/templates/default/lib/postinstall.js +14 -14
  171. package/templates/default/lib/utils.ts +6 -6
  172. package/templates/default/next-env.d.ts +6 -6
  173. package/templates/default/next.config.ts +23 -23
  174. package/templates/default/package.json +3 -3
  175. package/templates/default/postcss.config.mjs +6 -6
  176. package/templates/default/proxy.ts +32 -32
  177. package/templates/default/tsconfig.json +48 -48
  178. package/templates/default/app/(rootLayout)/dashboard-new/page.tsx +0 -7
  179. package/templates/default/components/DashboardNewPage.tsx +0 -253
  180. package/templates/default/components/DashboardPage.tsx +0 -188
  181. package/templates/default/components/EmailCard.tsx +0 -138
  182. package/templates/default/components/EmailPasswordForm.tsx +0 -85
  183. package/templates/default/components/EmailQuotaForm.tsx +0 -73
  184. package/templates/default/components/EmailsPage.tsx +0 -49
  185. package/templates/default/components/NewEmailForm.tsx +0 -132
  186. package/templates/default/components/form/DateRangeFormInput.tsx +0 -57
  187. package/templates/default/dynamic-schemas/schema.ts +0 -475
@@ -1,138 +0,0 @@
1
- import { useI18n } from 'nextjs-cms/translations/client'
2
- import React from 'react'
3
- import { EmailItem } from 'nextjs-cms/core/types'
4
- import useModal from '@/hooks/useModal'
5
- import { useToast } from '@/components/ui/use-toast'
6
- import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'
7
- import { Button } from '@/components/ui/button'
8
- import ProgressBar from '@/components/ProgressBar'
9
- import EmailQuotaForm from '@/components/EmailQuotaForm'
10
- import EmailPasswordForm from '@/components/EmailPasswordForm'
11
- import { trpc } from '@/app/_trpc/client'
12
-
13
- export default function EmailCard({ email, action }: { email: EmailItem; action: any }) {
14
- const t = useI18n()
15
- const { setModal, modal, modalResponse, setModalResponse } = useModal()
16
- const { toast } = useToast()
17
-
18
- const deleteMutation = trpc.cpanelEmails.deleteEmail.useMutation({
19
- onError: (error) => {
20
- setModalResponse({
21
- message: error.message,
22
- messageColor: 'text-red-900',
23
- borderColor: 'border-red-600',
24
- bgColor: 'bg-red-200',
25
- })
26
- },
27
- onSuccess: (data) => {
28
- action()
29
- setModal(null)
30
- setModalResponse(null)
31
- toast({
32
- variant: 'success',
33
- title: t('deleteEmailAccount'),
34
- description: data.message,
35
- })
36
- },
37
- })
38
- const deleteEmail = async () => {
39
- deleteMutation.mutate(email.user)
40
- }
41
-
42
- return (
43
- <Card className='border border-gray-400 shadow-xs'>
44
- <CardHeader>
45
- <CardTitle>
46
- <div className='flex flex-row items-center'>
47
- <div className='flex flex-col break-all'>
48
- <div className='text-sm font-medium text-foreground'>
49
- <div className='me-2 font-bold'>{email.email}</div>
50
- </div>
51
- </div>
52
- </div>
53
- </CardTitle>
54
- </CardHeader>
55
- <CardContent>
56
- {email.humandiskused} / {email.humandiskquota !== 'None' ? email.humandiskquota : email.diskquota}
57
- <ProgressBar variant='determinate' value={parseInt(email.diskusedpercent)} />
58
- </CardContent>
59
- <CardFooter className='flex flex-wrap gap-1'>
60
- <Button
61
- size='sm'
62
- variant='default'
63
- onClick={() => {
64
- setModal({
65
- title: t('emailQuota'),
66
- body: (
67
- <div className='p-4'>
68
- <EmailQuotaForm email={email.user} action={() => action()} />
69
- </div>
70
- ),
71
- headerColor: 'bg-sky-700',
72
- titleColor: 'text-white',
73
- lang: 'en',
74
- })
75
- }}
76
- >
77
- {t('quota')}
78
- </Button>
79
- <Button
80
- size='sm'
81
- variant='default'
82
- onClick={() => {
83
- setModal({
84
- title: t('changePassword'),
85
- body: (
86
- <div className='p-4'>
87
- <EmailPasswordForm email={email.user} action={() => action()} />
88
- </div>
89
- ),
90
- headerColor: 'bg-sky-700',
91
- titleColor: 'text-white',
92
- lang: 'en',
93
- })
94
- }}
95
- >
96
- {t('password')}
97
- </Button>
98
- <Button
99
- size='sm'
100
- variant='destructive'
101
- onClick={() => {
102
- setModal({
103
- title: t('delete'),
104
- body: (
105
- <div className='p-4'>
106
- <div className='flex flex-col gap-4'>
107
- <div>{t('deleteEmailText')}</div>
108
- <div className='flex gap-2'>
109
- <button
110
- className='rounded bg-green-600 px-2 py-1 text-white'
111
- onClick={deleteEmail}
112
- >
113
- {t('yes')}
114
- </button>
115
- <button
116
- className='rounded bg-red-800 px-2 py-1 text-white'
117
- onClick={() => {
118
- setModal(null)
119
- }}
120
- >
121
- {t('no')}
122
- </button>
123
- </div>
124
- </div>
125
- </div>
126
- ),
127
- headerColor: 'bg-red-700',
128
- titleColor: 'text-white',
129
- lang: 'en',
130
- })
131
- }}
132
- >
133
- {t('delete')}
134
- </Button>
135
- </CardFooter>
136
- </Card>
137
- )
138
- }
@@ -1,85 +0,0 @@
1
- import { useI18n } from 'nextjs-cms/translations/client'
2
- import React from 'react'
3
- import useModal from '@/hooks/useModal'
4
- import { useToast } from '@/components/ui/use-toast'
5
- import InfoCard from '@/components/InfoCard'
6
- import { trpc } from '@/app/_trpc/client'
7
-
8
- export default function EmailPasswordForm({ email, action }: { email: string; action: any }) {
9
- const t = useI18n()
10
- const { setModal, modal, modalResponse, setModalResponse } = useModal()
11
-
12
- const { toast } = useToast()
13
- const quotaMutation = trpc.cpanelEmails.passwordChange.useMutation({
14
- onError: (error) => {
15
- setModal({
16
- title: t('error'),
17
- body: (
18
- <div className='p-4'>
19
- <InfoCard result={{ key: 'danger', title: error.message, status: false }} />
20
- </div>
21
- ),
22
- headerColor: 'bg-red-700',
23
- titleColor: 'text-white',
24
- lang: 'en',
25
- })
26
- },
27
- onSuccess: (data) => {
28
- action()
29
- setModal(null)
30
- setModalResponse(null)
31
- toast({
32
- variant: 'success',
33
- title: t('success'),
34
- })
35
- },
36
- })
37
- const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
38
- e.preventDefault()
39
- quotaMutation.mutate({
40
- email,
41
- password: e.currentTarget.password.value,
42
- passwordConfirm: e.currentTarget.passwordConfirm.value,
43
- })
44
- }
45
-
46
- return (
47
- <form onSubmit={handleSubmit} className='flex flex-col gap-2'>
48
- <div>
49
- <label htmlFor='password' className='block text-sm font-medium leading-6 text-foreground'>
50
- {t('newPassword')}
51
- </label>
52
- <div className=''>
53
- <input
54
- id='password'
55
- name='password'
56
- type='text'
57
- autoComplete='password'
58
- required
59
- className='block w-full rounded-md border-0 bg-input p-2.5 text-foreground shadow-xs outline-0 ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6'
60
- />
61
- </div>
62
- </div>
63
- <div>
64
- <label htmlFor='passwordConfirm' className='block text-sm font-medium leading-6 text-foreground'>
65
- {t('confirmNewPassword')}
66
- </label>
67
- <div className=''>
68
- <input
69
- id='passwordConfirm'
70
- name='passwordConfirm'
71
- type='text'
72
- autoComplete='passwordConfirm'
73
- required
74
- className='block w-full rounded-md border-0 bg-input p-2.5 text-foreground shadow-xs outline-0 ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6'
75
- />
76
- </div>
77
- </div>
78
- <div className='mt-4'>
79
- <button className='rounded bg-blue-700 px-2 py-1 font-bold text-white'>
80
- {t('changePassword')}
81
- </button>
82
- </div>
83
- </form>
84
- )
85
- }
@@ -1,73 +0,0 @@
1
- import { useI18n } from 'nextjs-cms/translations/client'
2
- import React from 'react'
3
- import useModal from '@/hooks/useModal'
4
- import { Badge } from '@/components/ui/badge'
5
- import { useToast } from '@/components/ui/use-toast'
6
- import InfoCard from '@/components/InfoCard'
7
- import { trpc } from '@/app/_trpc/client'
8
-
9
- export default function EmailQuotaForm({ email, action }: { email: string; action: any }) {
10
- const t = useI18n()
11
- const { setModal, modal, modalResponse, setModalResponse } = useModal()
12
- const { toast } = useToast()
13
-
14
- const quotaMutation = trpc.cpanelEmails.quotaChange.useMutation({
15
- onError: (error) => {
16
- setModal({
17
- title: t('error'),
18
- body: (
19
- <div className='p-4'>
20
- <InfoCard result={{ key: 'danger', title: error.message, status: false }} />
21
- </div>
22
- ),
23
- headerColor: 'bg-red-700',
24
- titleColor: 'text-white',
25
- lang: 'en',
26
- })
27
- },
28
- onSuccess: (data) => {
29
- action()
30
- setModal(null)
31
- setModalResponse(null)
32
- toast({
33
- variant: 'success',
34
- title: t('success'),
35
- })
36
- },
37
- })
38
- const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
39
- e.preventDefault()
40
- quotaMutation.mutate({
41
- email,
42
- quota: e.currentTarget.quota.value,
43
- })
44
- }
45
-
46
- return (
47
- <form onSubmit={handleSubmit} className='flex flex-col gap-2'>
48
- <div>
49
- <label htmlFor='quota' className='block text-sm font-medium leading-6 text-foreground'>
50
- {t('emailQuota')}
51
- </label>
52
- <div className=''>
53
- <input
54
- id='quota'
55
- name='quota'
56
- type='number'
57
- autoComplete='quota'
58
- required
59
- className='block rounded-md border-0 bg-input p-2.5 text-foreground shadow-xs outline-0 ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6'
60
- />
61
- <Badge className='rounded-sm border-muted-foreground text-muted-foreground' variant='secondary'>
62
- 0 = {t('unlimited')}
63
- </Badge>
64
- </div>
65
- </div>
66
- <div className='mt-4'>
67
- <button className='rounded bg-blue-700 px-2 py-1 font-bold text-white'>
68
- {t('updateQuota')}
69
- </button>
70
- </div>
71
- </form>
72
- )
73
- }
@@ -1,49 +0,0 @@
1
- 'use client'
2
-
3
- import { useEffect } from 'react'
4
- import { EmailItem } from 'nextjs-cms/core/types'
5
- import { useI18n } from 'nextjs-cms/translations/client'
6
- import ContainerBox from '@/components/ContainerBox'
7
- import NewEmailForm from '@/components/NewEmailForm'
8
- import EmailCard from '@/components/EmailCard'
9
- import { trpc } from '@/app/_trpc/client'
10
-
11
- const EmailsPage = () => {
12
- const t = useI18n()
13
- const controller = new AbortController()
14
-
15
- const { isLoading, isError, data, error, refetch } = trpc.cpanelEmails.getEmails.useQuery()
16
-
17
- useEffect(() => {
18
- return () => {
19
- controller.abort()
20
- }
21
- }, [])
22
-
23
- return (
24
- <div className='bg-white dark:bg-slate-900'>
25
- <div className='bg-linear-to-r from-sky-200 via-emerald-300 to-blue-600 p-8 font-extrabold text-foreground dark:from-blue-800 dark:via-amber-700 dark:to-rose-900'>
26
- <h1 className='text-3xl'>{t('emailAccounts')}</h1>
27
- </div>
28
-
29
- <div className='flex flex-col gap-2 p-4'>
30
- <ContainerBox title={t('createNewEmailAccount')}>
31
- <NewEmailForm action={() => refetch()} />
32
- </ContainerBox>
33
-
34
- {isLoading && <div>{t('loading')}</div>}
35
- {data && data.emails && data.emails.length > 0 && (
36
- <ContainerBox title={t('emailAccountsList')}>
37
- <div className='mt-2 grid w-full grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3'>
38
- {data.emails.map((email: EmailItem) => (
39
- <EmailCard key={email.user} action={() => refetch()} email={email} />
40
- ))}
41
- </div>
42
- </ContainerBox>
43
- )}
44
- </div>
45
- </div>
46
- )
47
- }
48
-
49
- export default EmailsPage
@@ -1,132 +0,0 @@
1
- import { useI18n } from 'nextjs-cms/translations/client'
2
- import React from 'react'
3
- import useModal from '@/hooks/useModal'
4
- import { Badge } from '@/components/ui/badge'
5
- import { useToast } from '@/components/ui/use-toast'
6
- import InfoCard from '@/components/InfoCard'
7
- import { trpc } from '@/app/_trpc/client'
8
-
9
- export default function NewEmailForm({ action }: { action: any }) {
10
- const t = useI18n()
11
- const { setModal, modal, modalResponse, setModalResponse } = useModal()
12
- const formRef = React.useRef<HTMLFormElement>(null)
13
- const { toast } = useToast()
14
- const newEmailMutation = trpc.cpanelEmails.createEmail.useMutation({
15
- onError: (error) => {
16
- setModal({
17
- title: t('error'),
18
- body: (
19
- <div className='p-4'>
20
- <InfoCard result={{ key: 'danger', title: error.message, status: false }} />
21
- </div>
22
- ),
23
- headerColor: 'bg-red-700',
24
- titleColor: 'text-white',
25
- lang: 'en',
26
- })
27
- },
28
- onSuccess: (data) => {
29
- action()
30
- toast({
31
- variant: 'success',
32
- title: t('success'),
33
- description: data.message,
34
- })
35
-
36
- // Empty the form
37
- if (formRef.current) {
38
- formRef.current.reset()
39
- }
40
- },
41
- })
42
- const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
43
- e.preventDefault()
44
- newEmailMutation.mutate({
45
- email: e.currentTarget.username.value,
46
- password: e.currentTarget.password.value,
47
- quota: e.currentTarget.quota.value,
48
- })
49
-
50
- /*const data = new FormData(e.currentTarget)
51
- const values = Object.fromEntries(data.entries())
52
- values.operationType = 'newEmail'
53
- const response = await handleEmailSubmission(values, axiosPrivate, controller)
54
- if (response.error) {
55
- setModal({
56
- title: t('error'),
57
- body: (
58
- <div className='p-4'>
59
- <InfoCard result={{ key: 'danger', title: response.error.message, status: false }} />
60
- </div>
61
- ),
62
- headerColor: 'bg-red-700',
63
- titleColor: 'text-white',
64
- lang: 'en',
65
- })
66
- } else if (response.code === 200) {
67
- action()
68
- toast({
69
- variant: 'success',
70
- title: t('success'),
71
- description: response.message,
72
- })
73
- }*/
74
- }
75
-
76
- return (
77
- <form ref={formRef} onSubmit={handleSubmit} className='flex flex-col gap-2'>
78
- <div>
79
- <label htmlFor='username' className='block text-sm font-medium leading-6 text-foreground'>
80
- {t('email')}
81
- </label>
82
- <div className=''>
83
- <input
84
- id='username'
85
- name='username'
86
- type='text'
87
- autoComplete='username'
88
- required
89
- className='block w-full rounded-md border-0 bg-input p-2.5 text-foreground shadow-xs outline-0 ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6'
90
- />
91
- </div>
92
- </div>
93
-
94
- <div>
95
- <label htmlFor='password' className='block text-sm font-medium leading-6 text-foreground'>
96
- {t('password')}
97
- </label>
98
- <div className=''>
99
- <input
100
- id='password'
101
- name='password'
102
- type='text'
103
- autoComplete='password'
104
- required
105
- className='block w-full rounded-md border-0 bg-input p-2.5 text-foreground shadow-xs outline-0 ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6'
106
- />
107
- </div>
108
- </div>
109
- <div>
110
- <label htmlFor='quota' className='block text-sm font-medium leading-6 text-foreground'>
111
- {t('emailQuota')}
112
- </label>
113
- <div className=''>
114
- <input
115
- id='quota'
116
- name='quota'
117
- type='number'
118
- autoComplete='quota'
119
- required
120
- className='block rounded-md border-0 bg-input p-2.5 text-foreground shadow-xs outline-0 ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6'
121
- />
122
- <Badge className='rounded-sm border-muted-foreground text-muted-foreground' variant='secondary'>
123
- 0 = {t('unlimited')}
124
- </Badge>
125
- </div>
126
- </div>
127
- <div className='mt-4'>
128
- <button className='rounded bg-blue-700 px-2 py-1 font-bold text-white'>{t('create')}</button>
129
- </div>
130
- </form>
131
- )
132
- }
@@ -1,57 +0,0 @@
1
- 'use client'
2
-
3
- import * as React from 'react'
4
- import dayjs from 'dayjs'
5
- import type { DateRange } from 'react-day-picker'
6
-
7
- import { cn } from '@/lib/utils'
8
- import { Button } from '@/components/ui/button'
9
- import { Calendar } from '@/components/ui/calendar'
10
- import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
11
- import { CalendarIcon } from '@radix-ui/react-icons'
12
-
13
- export function DatePickerWithRange({ className }: React.HTMLAttributes<HTMLDivElement>) {
14
- const [date, setDate] = React.useState<DateRange | undefined>({
15
- from: new Date(2020, 0, 20),
16
- to: dayjs(new Date(2023, 0, 20))
17
- .add(20, 'day')
18
- .toDate(),
19
- })
20
-
21
- return (
22
- <div className={cn('grid gap-2', className)}>
23
- <Popover>
24
- <PopoverTrigger asChild>
25
- <Button
26
- id='date'
27
- variant={'outline'}
28
- className={cn('justify-start text-left font-normal', !date && 'text-muted-foreground')}
29
- >
30
- <CalendarIcon className='mr-2 h-4 w-4' />
31
- {date?.from ? (
32
- date.to ? (
33
- <>
34
- {dayjs(date.from).format('MMM DD, YYYY')} - {dayjs(date.to).format('MMM DD, YYYY')}
35
- </>
36
- ) : (
37
- dayjs(date.from).format('MMM DD, YYYY')
38
- )
39
- ) : (
40
- <span>Pick a date</span>
41
- )}
42
- </Button>
43
- </PopoverTrigger>
44
- <PopoverContent className='w-auto p-0' align='start'>
45
- <Calendar
46
- autoFocus
47
- mode='range'
48
- defaultMonth={date?.from}
49
- selected={date}
50
- onSelect={setDate}
51
- numberOfMonths={2}
52
- />
53
- </PopoverContent>
54
- </Popover>
55
- </div>
56
- )
57
- }