create-ej-app 6.0.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. package/cli.js +88 -14
  2. package/cli.ts +100 -17
  3. package/package.json +2 -2
  4. package/template/base/.env.example +11 -15
  5. package/template/base/Dockerfile +15 -0
  6. package/template/base/components.json +10 -5
  7. package/template/base/drizzle.config.ts +4 -5
  8. package/template/{new → base}/eslint.config.mjs +6 -1
  9. package/template/base/package.json +58 -75
  10. package/template/base/postcss.config.mjs +1 -4
  11. package/template/base/src/app/(admin)/layout.tsx +20 -0
  12. package/template/base/src/app/(app)/layout.tsx +13 -118
  13. package/template/base/src/app/(auth)/login/page.tsx +65 -42
  14. package/template/base/src/app/(marketing)/layout.tsx +7 -35
  15. package/template/base/src/app/(marketing)/page.tsx +2 -96
  16. package/template/base/src/app/(marketing)/privacy/page.tsx +3 -0
  17. package/template/base/src/app/(marketing)/terms/page.tsx +3 -0
  18. package/template/base/src/app/globals.css +118 -66
  19. package/template/base/src/app/layout.tsx +27 -12
  20. package/template/base/src/app/not-found.tsx +27 -0
  21. package/template/base/src/components/site-footer.tsx +16 -24
  22. package/template/base/src/components/ui/button.tsx +31 -27
  23. package/template/base/src/components/ui/card.tsx +83 -70
  24. package/template/base/src/components/ui/form.tsx +38 -47
  25. package/template/base/src/components/ui/input.tsx +16 -20
  26. package/template/base/src/components/ui/label.tsx +16 -18
  27. package/template/base/src/components/ui/separator.tsx +11 -14
  28. package/template/base/src/components/ui/sonner.tsx +22 -13
  29. package/template/base/src/db/index.ts +4 -11
  30. package/template/base/src/db/schema.ts +60 -268
  31. package/template/{new → base}/src/env.ts +2 -2
  32. package/template/{new → base}/src/lib/auth-client.ts +2 -0
  33. package/template/base/src/lib/auth.ts +64 -80
  34. package/template/base/src/lib/safe-action.ts +30 -6
  35. package/template/base/tsconfig.json +9 -7
  36. package/template/{prisma-advanced → old}/.env.example +10 -9
  37. package/template/{prisma → old}/components.json +1 -1
  38. package/template/old/drizzle.config.ts +11 -0
  39. package/template/old/package.json +87 -0
  40. package/template/old/postcss.config.mjs +8 -0
  41. package/template/{prisma-advanced → old}/src/app/(app)/layout.tsx +11 -3
  42. package/template/{prisma-advanced → old}/src/app/(auth)/login/page.tsx +2 -2
  43. package/template/{prisma → old}/src/app/(marketing)/page.tsx +8 -7
  44. package/template/old/src/app/layout.tsx +31 -0
  45. package/template/old/src/components/ui/sonner.tsx +31 -0
  46. package/template/old/src/db/index.ts +14 -0
  47. package/template/old/src/db/schema.ts +287 -0
  48. package/template/old/src/lib/auth.ts +89 -0
  49. package/template/old/src/lib/safe-action.ts +19 -0
  50. package/template/{prisma-advanced → old}/tsconfig.json +3 -2
  51. package/template/new/.env.example +0 -13
  52. package/template/new/components.json +0 -22
  53. package/template/new/drizzle.config.ts +0 -10
  54. package/template/new/package.json +0 -81
  55. package/template/new/postcss.config.mjs +0 -5
  56. package/template/new/src/app/(auth)/login/page.tsx +0 -72
  57. package/template/new/src/app/globals.css +0 -128
  58. package/template/new/src/app/layout.tsx +0 -50
  59. package/template/new/src/app/page.tsx +0 -3
  60. package/template/new/src/components/ui/button.tsx +0 -60
  61. package/template/new/src/components/ui/card.tsx +0 -92
  62. package/template/new/src/components/ui/form.tsx +0 -167
  63. package/template/new/src/components/ui/input.tsx +0 -21
  64. package/template/new/src/components/ui/label.tsx +0 -24
  65. package/template/new/src/components/ui/separator.tsx +0 -28
  66. package/template/new/src/components/ui/sonner.tsx +0 -40
  67. package/template/new/src/db/index.ts +0 -7
  68. package/template/new/src/db/schema.ts +0 -74
  69. package/template/new/src/lib/auth.ts +0 -67
  70. package/template/new/src/lib/safe-action.ts +0 -15
  71. package/template/new/tsconfig.json +0 -49
  72. package/template/prisma/.env.example +0 -16
  73. package/template/prisma/.eslintrc.cjs +0 -24
  74. package/template/prisma/next.config.mjs +0 -15
  75. package/template/prisma/package.json +0 -80
  76. package/template/prisma/postcss.config.cjs +0 -6
  77. package/template/prisma/prettier.config.ts +0 -11
  78. package/template/prisma/prisma/schema.prisma +0 -115
  79. package/template/prisma/public/next.svg +0 -1
  80. package/template/prisma/src/app/(app)/dashboard/page.tsx +0 -19
  81. package/template/prisma/src/app/(app)/layout.tsx +0 -90
  82. package/template/prisma/src/app/(app)/settings/actions.ts +0 -18
  83. package/template/prisma/src/app/(app)/settings/loading.tsx +0 -28
  84. package/template/prisma/src/app/(app)/settings/page.tsx +0 -28
  85. package/template/prisma/src/app/(app)/settings/render.tsx +0 -113
  86. package/template/prisma/src/app/(app)/tasks/[id]/actions.ts +0 -147
  87. package/template/prisma/src/app/(app)/tasks/[id]/page.tsx +0 -25
  88. package/template/prisma/src/app/(app)/tasks/[id]/render.tsx +0 -413
  89. package/template/prisma/src/app/(app)/tasks/actions.ts +0 -69
  90. package/template/prisma/src/app/(app)/tasks/page.tsx +0 -53
  91. package/template/prisma/src/app/(app)/tasks/render.tsx +0 -107
  92. package/template/prisma/src/app/(app)/users/[id]/actions.ts +0 -83
  93. package/template/prisma/src/app/(app)/users/[id]/page.tsx +0 -32
  94. package/template/prisma/src/app/(app)/users/[id]/render.tsx +0 -240
  95. package/template/prisma/src/app/(app)/users/actions.ts +0 -55
  96. package/template/prisma/src/app/(app)/users/page.tsx +0 -49
  97. package/template/prisma/src/app/(app)/users/render.tsx +0 -80
  98. package/template/prisma/src/app/(auth)/layout.tsx +0 -20
  99. package/template/prisma/src/app/(auth)/login/page.tsx +0 -49
  100. package/template/prisma/src/app/(auth)/login/user-auth-form.tsx +0 -152
  101. package/template/prisma/src/app/api/auth/[...nextauth]/route.ts +0 -7
  102. package/template/prisma/src/app/api/upload/route.ts +0 -36
  103. package/template/prisma/src/app/favicon.ico +0 -0
  104. package/template/prisma/src/app/layout.tsx +0 -34
  105. package/template/prisma/src/components/app-nav-command.tsx +0 -160
  106. package/template/prisma/src/components/dark-mode-toggle.tsx +0 -43
  107. package/template/prisma/src/components/data-table/data-table-column-header.tsx +0 -91
  108. package/template/prisma/src/components/data-table/data-table-faceted-filter.tsx +0 -149
  109. package/template/prisma/src/components/data-table/data-table-loading.tsx +0 -77
  110. package/template/prisma/src/components/data-table/data-table-pagination.tsx +0 -94
  111. package/template/prisma/src/components/data-table/data-table-toolbar.tsx +0 -78
  112. package/template/prisma/src/components/data-table/data-table-types.ts +0 -17
  113. package/template/prisma/src/components/data-table/data-table-view-options.tsx +0 -59
  114. package/template/prisma/src/components/data-table/data-table.tsx +0 -301
  115. package/template/prisma/src/components/data-table/simple-data-table.tsx +0 -109
  116. package/template/prisma/src/components/empty-placeholder.tsx +0 -78
  117. package/template/prisma/src/components/heading.tsx +0 -17
  118. package/template/prisma/src/components/icons.tsx +0 -85
  119. package/template/prisma/src/components/main-nav.tsx +0 -64
  120. package/template/prisma/src/components/mobile-nav.tsx +0 -50
  121. package/template/prisma/src/components/shell.tsx +0 -13
  122. package/template/prisma/src/components/side-nav.tsx +0 -51
  123. package/template/prisma/src/components/site-footer.tsx +0 -31
  124. package/template/prisma/src/components/system-info.tsx +0 -36
  125. package/template/prisma/src/components/theme-provider.tsx +0 -13
  126. package/template/prisma/src/components/ui/alert-dialog.tsx +0 -141
  127. package/template/prisma/src/components/ui/avatar.tsx +0 -50
  128. package/template/prisma/src/components/ui/badge.tsx +0 -36
  129. package/template/prisma/src/components/ui/button.tsx +0 -56
  130. package/template/prisma/src/components/ui/card.tsx +0 -79
  131. package/template/prisma/src/components/ui/checkbox.tsx +0 -30
  132. package/template/prisma/src/components/ui/command.tsx +0 -155
  133. package/template/prisma/src/components/ui/dialog.tsx +0 -122
  134. package/template/prisma/src/components/ui/dropdown-menu.tsx +0 -200
  135. package/template/prisma/src/components/ui/form.tsx +0 -176
  136. package/template/prisma/src/components/ui/input.tsx +0 -25
  137. package/template/prisma/src/components/ui/label.tsx +0 -26
  138. package/template/prisma/src/components/ui/popover.tsx +0 -31
  139. package/template/prisma/src/components/ui/select.tsx +0 -160
  140. package/template/prisma/src/components/ui/separator.tsx +0 -31
  141. package/template/prisma/src/components/ui/skeleton.tsx +0 -15
  142. package/template/prisma/src/components/ui/table.tsx +0 -117
  143. package/template/prisma/src/components/ui/textarea.tsx +0 -24
  144. package/template/prisma/src/components/ui/toast.tsx +0 -127
  145. package/template/prisma/src/components/ui/toaster.tsx +0 -35
  146. package/template/prisma/src/components/ui/use-toast.ts +0 -189
  147. package/template/prisma/src/components/user-account-nav.tsx +0 -60
  148. package/template/prisma/src/components/user-avatar.tsx +0 -25
  149. package/template/prisma/src/env.mjs +0 -78
  150. package/template/prisma/src/hooks/use-debounce.ts +0 -17
  151. package/template/prisma/src/hooks/use-lock-body.tsx +0 -12
  152. package/template/prisma/src/lib/auth.ts +0 -80
  153. package/template/prisma/src/lib/cn.ts +0 -4
  154. package/template/prisma/src/lib/db.ts +0 -20
  155. package/template/prisma/src/lib/delay.ts +0 -2
  156. package/template/prisma/src/lib/formatDate.ts +0 -11
  157. package/template/prisma/src/lib/generateLabel.ts +0 -5
  158. package/template/prisma/src/lib/siteConfig.ts +0 -4
  159. package/template/prisma/src/lib/storageClient.ts +0 -11
  160. package/template/prisma/src/styles/editor.css +0 -61
  161. package/template/prisma/src/styles/globals.css +0 -76
  162. package/template/prisma/src/types/UnwrapPromise.ts +0 -1
  163. package/template/prisma/tailwind.config.ts +0 -80
  164. package/template/prisma/tsconfig.json +0 -46
  165. package/template/prisma-advanced/.eslintrc.cjs +0 -24
  166. package/template/prisma-advanced/components.json +0 -17
  167. package/template/prisma-advanced/next.config.mjs +0 -15
  168. package/template/prisma-advanced/package.json +0 -80
  169. package/template/prisma-advanced/postcss.config.cjs +0 -6
  170. package/template/prisma-advanced/prettier.config.ts +0 -11
  171. package/template/prisma-advanced/prisma/schema.prisma +0 -154
  172. package/template/prisma-advanced/public/next.svg +0 -1
  173. package/template/prisma-advanced/src/app/(app)/dashboard/page.tsx +0 -19
  174. package/template/prisma-advanced/src/app/(app)/roles/[id]/actions.ts +0 -100
  175. package/template/prisma-advanced/src/app/(app)/roles/[id]/page.tsx +0 -36
  176. package/template/prisma-advanced/src/app/(app)/roles/[id]/render.tsx +0 -266
  177. package/template/prisma-advanced/src/app/(app)/roles/actions.ts +0 -67
  178. package/template/prisma-advanced/src/app/(app)/roles/page.tsx +0 -51
  179. package/template/prisma-advanced/src/app/(app)/roles/render.tsx +0 -70
  180. package/template/prisma-advanced/src/app/(app)/settings/actions.ts +0 -18
  181. package/template/prisma-advanced/src/app/(app)/settings/loading.tsx +0 -28
  182. package/template/prisma-advanced/src/app/(app)/settings/page.tsx +0 -28
  183. package/template/prisma-advanced/src/app/(app)/settings/render.tsx +0 -113
  184. package/template/prisma-advanced/src/app/(app)/tasks/[id]/actions.ts +0 -147
  185. package/template/prisma-advanced/src/app/(app)/tasks/[id]/page.tsx +0 -55
  186. package/template/prisma-advanced/src/app/(app)/tasks/[id]/render.tsx +0 -418
  187. package/template/prisma-advanced/src/app/(app)/tasks/actions.ts +0 -69
  188. package/template/prisma-advanced/src/app/(app)/tasks/page.tsx +0 -63
  189. package/template/prisma-advanced/src/app/(app)/tasks/render.tsx +0 -114
  190. package/template/prisma-advanced/src/app/(app)/users/[id]/actions.ts +0 -104
  191. package/template/prisma-advanced/src/app/(app)/users/[id]/page.tsx +0 -39
  192. package/template/prisma-advanced/src/app/(app)/users/[id]/render.tsx +0 -320
  193. package/template/prisma-advanced/src/app/(app)/users/actions.ts +0 -67
  194. package/template/prisma-advanced/src/app/(app)/users/page.tsx +0 -61
  195. package/template/prisma-advanced/src/app/(app)/users/render.tsx +0 -108
  196. package/template/prisma-advanced/src/app/(auth)/layout.tsx +0 -20
  197. package/template/prisma-advanced/src/app/(auth)/login/user-auth-form.tsx +0 -152
  198. package/template/prisma-advanced/src/app/(marketing)/layout.tsx +0 -42
  199. package/template/prisma-advanced/src/app/(marketing)/page.tsx +0 -96
  200. package/template/prisma-advanced/src/app/api/auth/[...nextauth]/route.ts +0 -7
  201. package/template/prisma-advanced/src/app/api/upload/route.ts +0 -36
  202. package/template/prisma-advanced/src/app/favicon.ico +0 -0
  203. package/template/prisma-advanced/src/app/layout.tsx +0 -34
  204. package/template/prisma-advanced/src/components/app-nav-command.tsx +0 -160
  205. package/template/prisma-advanced/src/components/dark-mode-toggle.tsx +0 -43
  206. package/template/prisma-advanced/src/components/data-table/data-table-column-header.tsx +0 -91
  207. package/template/prisma-advanced/src/components/data-table/data-table-faceted-filter.tsx +0 -149
  208. package/template/prisma-advanced/src/components/data-table/data-table-loading.tsx +0 -77
  209. package/template/prisma-advanced/src/components/data-table/data-table-pagination.tsx +0 -94
  210. package/template/prisma-advanced/src/components/data-table/data-table-toolbar.tsx +0 -78
  211. package/template/prisma-advanced/src/components/data-table/data-table-types.ts +0 -17
  212. package/template/prisma-advanced/src/components/data-table/data-table-view-options.tsx +0 -59
  213. package/template/prisma-advanced/src/components/data-table/data-table.tsx +0 -301
  214. package/template/prisma-advanced/src/components/data-table/simple-data-table.tsx +0 -109
  215. package/template/prisma-advanced/src/components/empty-placeholder.tsx +0 -78
  216. package/template/prisma-advanced/src/components/heading.tsx +0 -17
  217. package/template/prisma-advanced/src/components/icons.tsx +0 -85
  218. package/template/prisma-advanced/src/components/main-nav.tsx +0 -64
  219. package/template/prisma-advanced/src/components/shell.tsx +0 -13
  220. package/template/prisma-advanced/src/components/side-nav.tsx +0 -51
  221. package/template/prisma-advanced/src/components/system-info.tsx +0 -36
  222. package/template/prisma-advanced/src/components/theme-provider.tsx +0 -13
  223. package/template/prisma-advanced/src/components/ui/alert-dialog.tsx +0 -141
  224. package/template/prisma-advanced/src/components/ui/avatar.tsx +0 -50
  225. package/template/prisma-advanced/src/components/ui/badge.tsx +0 -36
  226. package/template/prisma-advanced/src/components/ui/checkbox.tsx +0 -30
  227. package/template/prisma-advanced/src/components/ui/command.tsx +0 -155
  228. package/template/prisma-advanced/src/components/ui/dialog.tsx +0 -122
  229. package/template/prisma-advanced/src/components/ui/dropdown-menu.tsx +0 -200
  230. package/template/prisma-advanced/src/components/ui/popover.tsx +0 -31
  231. package/template/prisma-advanced/src/components/ui/select.tsx +0 -160
  232. package/template/prisma-advanced/src/components/ui/skeleton.tsx +0 -15
  233. package/template/prisma-advanced/src/components/ui/table.tsx +0 -117
  234. package/template/prisma-advanced/src/components/ui/textarea.tsx +0 -24
  235. package/template/prisma-advanced/src/components/ui/toast.tsx +0 -127
  236. package/template/prisma-advanced/src/components/ui/toaster.tsx +0 -35
  237. package/template/prisma-advanced/src/components/ui/use-toast.ts +0 -189
  238. package/template/prisma-advanced/src/components/user-account-nav.tsx +0 -60
  239. package/template/prisma-advanced/src/components/user-avatar.tsx +0 -25
  240. package/template/prisma-advanced/src/env.mjs +0 -78
  241. package/template/prisma-advanced/src/hooks/use-debounce.ts +0 -17
  242. package/template/prisma-advanced/src/hooks/use-lock-body.tsx +0 -12
  243. package/template/prisma-advanced/src/lib/auth.ts +0 -180
  244. package/template/prisma-advanced/src/lib/cn.ts +0 -4
  245. package/template/prisma-advanced/src/lib/db.ts +0 -20
  246. package/template/prisma-advanced/src/lib/delay.ts +0 -2
  247. package/template/prisma-advanced/src/lib/formatDate.ts +0 -11
  248. package/template/prisma-advanced/src/lib/generateLabel.ts +0 -5
  249. package/template/prisma-advanced/src/lib/siteConfig.ts +0 -4
  250. package/template/prisma-advanced/src/lib/storageClient.ts +0 -11
  251. package/template/prisma-advanced/src/styles/editor.css +0 -61
  252. package/template/prisma-advanced/src/types/UnwrapPromise.ts +0 -1
  253. package/template/prisma-advanced/tailwind.config.ts +0 -80
  254. package/template/{new → base}/next.config.ts +0 -0
  255. package/template/{new → base}/public/placeholder.svg +0 -0
  256. package/template/{new → base}/src/app/(auth)/login/email-login-form.tsx +0 -0
  257. package/template/{new → base}/src/app/(auth)/login/social-login-buttons.tsx +0 -0
  258. package/template/{new → base}/src/app/api/auth/[...all]/route.ts +0 -0
  259. package/template/{new → base}/src/components/loader.tsx +0 -0
  260. package/template/{new → base}/src/components/react-query-provider.tsx +0 -0
  261. package/template/{new → base}/src/components/screen-size.tsx +0 -0
  262. package/template/{new → base}/src/components/theme-toggle.tsx +0 -0
  263. package/template/{new → base}/src/lib/toast-message.ts +0 -0
  264. package/template/{base → old}/.eslintrc.cjs +0 -0
  265. package/template/{base → old}/next.config.mjs +0 -0
  266. package/template/{new → old}/prettier.config.mjs +0 -0
  267. package/template/{base → old}/public/next.svg +0 -0
  268. package/template/{base → old}/public/vercel.svg +0 -0
  269. package/template/{base → old}/src/app/(app)/dashboard/layout.tsx +0 -0
  270. package/template/{base → old}/src/app/(app)/dashboard/page.tsx +0 -0
  271. package/template/{base → old}/src/app/(app)/roles/[id]/actions.ts +0 -0
  272. package/template/{base → old}/src/app/(app)/roles/[id]/page.tsx +0 -0
  273. package/template/{base → old}/src/app/(app)/roles/[id]/render.tsx +0 -0
  274. package/template/{base → old}/src/app/(app)/roles/[id]/validation.ts +0 -0
  275. package/template/{base → old}/src/app/(app)/roles/actions.ts +0 -0
  276. package/template/{base → old}/src/app/(app)/roles/page.tsx +0 -0
  277. package/template/{base → old}/src/app/(app)/roles/render.tsx +0 -0
  278. package/template/{base → old}/src/app/(app)/settings/actions.ts +0 -0
  279. package/template/{base → old}/src/app/(app)/settings/layout.tsx +0 -0
  280. package/template/{base → old}/src/app/(app)/settings/loading.tsx +0 -0
  281. package/template/{base → old}/src/app/(app)/settings/page.tsx +0 -0
  282. package/template/{base → old}/src/app/(app)/settings/render.tsx +0 -0
  283. package/template/{base → old}/src/app/(app)/settings/validation.ts +0 -0
  284. package/template/{base → old}/src/app/(app)/tasks/[id]/actions.ts +0 -0
  285. package/template/{base → old}/src/app/(app)/tasks/[id]/page.tsx +0 -0
  286. package/template/{base → old}/src/app/(app)/tasks/[id]/render.tsx +0 -0
  287. package/template/{base → old}/src/app/(app)/tasks/[id]/validation.ts +0 -0
  288. package/template/{base → old}/src/app/(app)/tasks/actions.ts +0 -0
  289. package/template/{base → old}/src/app/(app)/tasks/page.tsx +0 -0
  290. package/template/{base → old}/src/app/(app)/tasks/render.tsx +0 -0
  291. package/template/{base → old}/src/app/(app)/tasks/statusEnum.ts +0 -0
  292. package/template/{base → old}/src/app/(app)/users/[id]/actions.ts +0 -0
  293. package/template/{base → old}/src/app/(app)/users/[id]/page.tsx +0 -0
  294. package/template/{base → old}/src/app/(app)/users/[id]/render.tsx +0 -0
  295. package/template/{base → old}/src/app/(app)/users/[id]/validation.ts +0 -0
  296. package/template/{base → old}/src/app/(app)/users/actions.ts +0 -0
  297. package/template/{base → old}/src/app/(app)/users/page.tsx +0 -0
  298. package/template/{base → old}/src/app/(app)/users/render.tsx +0 -0
  299. package/template/{base → old}/src/app/(auth)/layout.tsx +0 -0
  300. package/template/{base → old}/src/app/(auth)/login/render.tsx +0 -0
  301. package/template/{prisma → old}/src/app/(marketing)/layout.tsx +1 -1
  302. /package/template/{base → old}/src/app/api/auth/[...nextauth]/route.ts +0 -0
  303. /package/template/{new → old}/src/app/favicon.ico +0 -0
  304. /package/template/{prisma-advanced/src/styles → old/src/app}/globals.css +0 -0
  305. /package/template/{base → old}/src/components/app-nav-command.tsx +0 -0
  306. /package/template/{base → old}/src/components/dark-mode-toggle.tsx +0 -0
  307. /package/template/{base → old}/src/components/data-table/data-table-column-header.tsx +0 -0
  308. /package/template/{base → old}/src/components/data-table/data-table-faceted-filter.tsx +0 -0
  309. /package/template/{base → old}/src/components/data-table/data-table-loading.tsx +0 -0
  310. /package/template/{base → old}/src/components/data-table/data-table-pagination.tsx +0 -0
  311. /package/template/{base → old}/src/components/data-table/data-table-toolbar.tsx +0 -0
  312. /package/template/{base → old}/src/components/data-table/data-table-types.ts +0 -0
  313. /package/template/{base → old}/src/components/data-table/data-table-view-options.tsx +0 -0
  314. /package/template/{base → old}/src/components/data-table/data-table.tsx +0 -0
  315. /package/template/{base → old}/src/components/data-table/simple-data-table.tsx +0 -0
  316. /package/template/{base → old}/src/components/empty-placeholder.tsx +0 -0
  317. /package/template/{base → old}/src/components/heading.tsx +0 -0
  318. /package/template/{base → old}/src/components/icons.tsx +0 -0
  319. /package/template/{base → old}/src/components/main-nav.tsx +0 -0
  320. /package/template/{base → old}/src/components/mobile-nav.tsx +0 -0
  321. /package/template/{base → old}/src/components/shell.tsx +0 -0
  322. /package/template/{base → old}/src/components/side-nav.tsx +0 -0
  323. /package/template/{prisma-advanced → old}/src/components/site-footer.tsx +0 -0
  324. /package/template/{base → old}/src/components/system-info.tsx +0 -0
  325. /package/template/{base → old}/src/components/ui/alert-dialog.tsx +0 -0
  326. /package/template/{base → old}/src/components/ui/avatar.tsx +0 -0
  327. /package/template/{base → old}/src/components/ui/badge.tsx +0 -0
  328. /package/template/{prisma-advanced → old}/src/components/ui/button.tsx +0 -0
  329. /package/template/{prisma-advanced → old}/src/components/ui/card.tsx +0 -0
  330. /package/template/{base → old}/src/components/ui/checkbox.tsx +0 -0
  331. /package/template/{base → old}/src/components/ui/command.tsx +0 -0
  332. /package/template/{base → old}/src/components/ui/dialog.tsx +0 -0
  333. /package/template/{base → old}/src/components/ui/dropdown-menu.tsx +0 -0
  334. /package/template/{prisma-advanced → old}/src/components/ui/form.tsx +0 -0
  335. /package/template/{prisma-advanced → old}/src/components/ui/input.tsx +0 -0
  336. /package/template/{prisma-advanced → old}/src/components/ui/label.tsx +0 -0
  337. /package/template/{base → old}/src/components/ui/popover.tsx +0 -0
  338. /package/template/{base → old}/src/components/ui/select.tsx +0 -0
  339. /package/template/{prisma-advanced → old}/src/components/ui/separator.tsx +0 -0
  340. /package/template/{base → old}/src/components/ui/skeleton.tsx +0 -0
  341. /package/template/{base → old}/src/components/ui/table.tsx +0 -0
  342. /package/template/{base → old}/src/components/user-account-nav.tsx +0 -0
  343. /package/template/{base → old}/src/components/user-avatar.tsx +0 -0
  344. /package/template/{base → old}/src/data-access/resource.ts +0 -0
  345. /package/template/{base → old}/src/data-access/role-permission.ts +0 -0
  346. /package/template/{base → old}/src/data-access/role.ts +0 -0
  347. /package/template/{base → old}/src/data-access/task.ts +0 -0
  348. /package/template/{base → old}/src/data-access/user.ts +0 -0
  349. /package/template/{base → old}/src/env.mjs +0 -0
  350. /package/template/{base → old}/src/hooks/use-debounce.tsx +0 -0
  351. /package/template/{base → old}/src/hooks/use-lock-body.tsx +0 -0
  352. /package/template/{new → old}/src/lib/cn.ts +0 -0
  353. /package/template/{base → old}/src/lib/currentUser.ts +0 -0
  354. /package/template/{new → old}/src/lib/delay.ts +0 -0
  355. /package/template/{base → old}/src/lib/formatDate.ts +0 -0
  356. /package/template/{base → old}/src/lib/generateLabel.ts +0 -0
  357. /package/template/{base → old}/src/lib/s3Client.ts +0 -0
  358. /package/template/{new → old}/src/lib/siteConfig.ts +0 -0
  359. /package/template/{base → old}/src/lib/sortOrderEnum.ts +0 -0
  360. /package/template/{base → old}/src/use-case/role-permission.ts +0 -0
  361. /package/template/{base → old}/src/use-case/role.ts +0 -0
  362. /package/template/{base → old}/src/use-case/task.ts +0 -0
  363. /package/template/{base → old}/src/use-case/user.ts +0 -0
  364. /package/template/{base → old}/tailwind.config.ts +0 -0
@@ -1,418 +0,0 @@
1
- 'use client'
2
-
3
- import EditorJS from '@editorjs/editorjs'
4
- import { zodResolver } from '@hookform/resolvers/zod'
5
- import { TaskStatus } from '@prisma/client'
6
- import edjsHTML from 'editorjs-html'
7
- import Link from 'next/link'
8
- import { useRouter } from 'next/navigation'
9
- import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'
10
- import { useForm } from 'react-hook-form'
11
- import { z } from 'zod'
12
-
13
- import { Heading } from '@/components/heading'
14
- import { Icons } from '@/components/icons'
15
- import { Shell } from '@/components/shell'
16
- import { SystemInfo } from '@/components/system-info'
17
- import {
18
- AlertDialog,
19
- AlertDialogAction,
20
- AlertDialogCancel,
21
- AlertDialogContent,
22
- AlertDialogDescription,
23
- AlertDialogFooter,
24
- AlertDialogHeader,
25
- AlertDialogTitle,
26
- AlertDialogTrigger
27
- } from '@/components/ui/alert-dialog'
28
- import { Button } from '@/components/ui/button'
29
- import {
30
- Form,
31
- FormControl,
32
- FormField,
33
- FormItem,
34
- FormLabel,
35
- FormMessage
36
- } from '@/components/ui/form'
37
- import { Input } from '@/components/ui/input'
38
- import {
39
- Select,
40
- SelectContent,
41
- SelectItem,
42
- SelectTrigger,
43
- SelectValue
44
- } from '@/components/ui/select'
45
- import { toast } from '@/components/ui/use-toast'
46
- import { formatDateTime, timesAgo } from '@/lib/formatDate'
47
- import { generateLabel } from '@/lib/generateLabel'
48
- import '@/styles/editor.css'
49
- import {
50
- GetTaskFnDataType,
51
- createTask,
52
- deleteTask,
53
- updateTask
54
- } from './actions'
55
-
56
- const TaskSchema = z.object({
57
- title: z.string().nonempty(),
58
- status: z.nativeEnum(TaskStatus)
59
- })
60
-
61
- type FormData = z.infer<typeof TaskSchema>
62
-
63
- const statuses = Object.values(TaskStatus).map(x => ({
64
- label: generateLabel(x),
65
- value: x
66
- }))
67
-
68
- const edjsParser = edjsHTML()
69
-
70
- export const Render: FC<{
71
- task: GetTaskFnDataType | undefined
72
- canUpdate: boolean
73
- canCreate: boolean
74
- canDelete: boolean
75
- }> = ({ task, canUpdate, canCreate, canDelete }) => {
76
- const form = useForm<FormData>({
77
- resolver: zodResolver(TaskSchema),
78
- defaultValues: {
79
- title: task?.title ?? '',
80
- status: task?.status || 'Todo'
81
- }
82
- })
83
- const router = useRouter()
84
- const [isSaving, setIsSaving] = useState(false)
85
- const [isDeleting, setIsDeleting] = useState(false)
86
- const [isEditorMounted, setIsMounted] = useState<boolean>(false)
87
-
88
- const editorRef = useRef<EditorJS>()
89
-
90
- const initializeEditor = useCallback(async () => {
91
- const EditorJS = (await import('@editorjs/editorjs')).default
92
-
93
- // @ts-ignore
94
- const Table = (await import('@editorjs/table')).default
95
- // @ts-ignore
96
- const List = (await import('@editorjs/list')).default
97
- // @ts-ignore
98
- const Image = (await import('@editorjs/image')).default
99
- // @ts-ignore
100
- const Header = (await import('@editorjs/header')).default
101
- // @ts-ignore
102
- const Quote = (await import('@editorjs/quote')).default
103
- // @ts-ignore
104
- const CheckList = (await import('@editorjs/checklist')).default
105
- // @ts-ignore
106
- const Delimiter = (await import('@editorjs/delimiter')).default
107
-
108
- if (!editorRef.current) {
109
- const editor = new EditorJS({
110
- holder: 'editor',
111
- onReady() {
112
- editorRef.current = editor
113
- },
114
- placeholder: 'Type here to write...',
115
- inlineToolbar: true,
116
- data: task?.description as any,
117
- tools: {
118
- header: Header,
119
- list: List,
120
- image: {
121
- class: Image,
122
- config: {
123
- uploader: {
124
- async uploadByFile(file: any) {
125
- const formData = new FormData()
126
- formData.append('file', file)
127
- const res = await fetch('/api/upload', {
128
- method: 'POST',
129
- body: formData
130
- })
131
- const json = await res.json()
132
- if (json.success && json.id && json.url) {
133
- return {
134
- success: true,
135
- file: {
136
- id: json.id,
137
- url: json.url
138
- }
139
- }
140
- } else {
141
- return {
142
- success: false
143
- }
144
- }
145
- }
146
- }
147
- }
148
- },
149
- table: Table,
150
- checklist: CheckList,
151
- quote: Quote,
152
- delimiter: Delimiter
153
- }
154
- })
155
- }
156
- }, [task?.description])
157
-
158
- useEffect(() => {
159
- if (typeof window !== 'undefined') setIsMounted(true)
160
- }, [])
161
-
162
- useEffect(() => {
163
- if (!isEditorMounted) return
164
-
165
- initializeEditor()
166
-
167
- return () => {
168
- editorRef.current?.destroy()
169
- editorRef.current = undefined
170
- }
171
- }, [isEditorMounted, initializeEditor])
172
-
173
- const editorHTML = useMemo(() => {
174
- if (!task?.description) return ''
175
- return edjsParser.parse(task.description as any).join('')
176
- }, [task?.description])
177
- console.log(editorHTML)
178
-
179
- async function onSubmit(data: FormData) {
180
- setIsSaving(true)
181
- try {
182
- const editorData = await editorRef.current?.save()
183
- const imageIds: string[] = []
184
- if (editorData?.blocks)
185
- for (const b of editorData.blocks)
186
- if (
187
- b.type === 'image' &&
188
- b.data &&
189
- b.data.file &&
190
- b.data.file.id &&
191
- b.data.file.url
192
- )
193
- imageIds.push(b.data.file.id)
194
-
195
- if (!task) {
196
- const newId = await createTask({
197
- ...data,
198
- description: editorData,
199
- imageIds
200
- })
201
- router.replace(`/tasks/${newId}`)
202
- } else {
203
- await updateTask({
204
- id: task.id,
205
- ...data,
206
- description: editorData,
207
- imageIds
208
- })
209
- }
210
- toast({
211
- title: 'Task saved'
212
- })
213
- } catch (err) {
214
- toast({
215
- title: 'Error saving task',
216
- variant: 'destructive'
217
- })
218
- }
219
- setIsSaving(false)
220
- }
221
-
222
- return (
223
- <Shell>
224
- <Heading heading={task ? task.title : 'New Task'} />
225
- <Form {...form}>
226
- <form
227
- className="grid grid-cols-1 gap-3 md:grid-cols-2"
228
- onSubmit={form.handleSubmit(onSubmit)}
229
- >
230
- <div className="col-span-1 mb-1 grid grid-cols-2 gap-2 sm:flex md:col-span-2">
231
- <Button type="button" onClick={() => router.back()} variant="ghost">
232
- <Icons.chevronLeft className="mr-2 h-4 w-4" />
233
- Back
234
- </Button>
235
- {(task ? canUpdate : canCreate) ? (
236
- <Button type="submit" disabled={isSaving || isDeleting}>
237
- {isSaving ? (
238
- <Icons.spinner className="mr-2 h-4 w-4 animate-spin" />
239
- ) : (
240
- <Icons.save className="mr-2 h-4 w-4" />
241
- )}
242
- <span>Save</span>
243
- </Button>
244
- ) : undefined}
245
- {task && canDelete ? (
246
- <AlertDialog>
247
- <AlertDialogTrigger asChild>
248
- <Button
249
- type="button"
250
- variant="destructive"
251
- disabled={isSaving || isDeleting}
252
- >
253
- {isDeleting ? (
254
- <Icons.spinner className="mr-2 h-4 w-4 animate-spin" />
255
- ) : (
256
- <Icons.delete className="mr-2 h-4 w-4" />
257
- )}
258
- Delete
259
- </Button>
260
- </AlertDialogTrigger>
261
- <AlertDialogContent>
262
- <AlertDialogHeader>
263
- <AlertDialogTitle>
264
- Are you absolutely sure?
265
- </AlertDialogTitle>
266
- <AlertDialogDescription>
267
- This action cannot be undone.
268
- </AlertDialogDescription>
269
- </AlertDialogHeader>
270
- <AlertDialogFooter>
271
- <AlertDialogCancel>Cancel</AlertDialogCancel>
272
- <AlertDialogAction
273
- onClick={async () => {
274
- setIsDeleting(true)
275
- try {
276
- await deleteTask(task.id)
277
- toast({
278
- title: 'Task deleted'
279
- })
280
- router.push('/tasks')
281
- } catch (err) {
282
- toast({
283
- title: 'Error deleting task',
284
- variant: 'destructive'
285
- })
286
- }
287
- setIsDeleting(false)
288
- }}
289
- >
290
- Continue
291
- </AlertDialogAction>
292
- </AlertDialogFooter>
293
- </AlertDialogContent>
294
- </AlertDialog>
295
- ) : undefined}
296
- {task && canCreate ? (
297
- <Link href="/tasks/new">
298
- <Button
299
- type="button"
300
- disabled={isSaving || isDeleting}
301
- variant="secondary"
302
- className="w-full"
303
- >
304
- <Icons.add className="mr-2 h-4 w-4" />
305
- New
306
- </Button>
307
- </Link>
308
- ) : undefined}
309
- </div>
310
-
311
- <FormField
312
- control={form.control}
313
- name="title"
314
- render={({ field }) => (
315
- <FormItem>
316
- <FormLabel>Title</FormLabel>
317
- <FormControl>
318
- <Input
319
- type="text"
320
- placeholder="Enter a title"
321
- disabled={isSaving}
322
- {...field}
323
- />
324
- </FormControl>
325
- <FormMessage />
326
- </FormItem>
327
- )}
328
- />
329
-
330
- <FormField
331
- control={form.control}
332
- name="status"
333
- render={({ field }) => (
334
- <FormItem>
335
- <FormLabel>Status</FormLabel>
336
- <Select
337
- onValueChange={field.onChange}
338
- defaultValue={field.value}
339
- disabled={isSaving}
340
- >
341
- <FormControl>
342
- <SelectTrigger>
343
- <SelectValue placeholder="Select status" />
344
- </SelectTrigger>
345
- </FormControl>
346
- <SelectContent>
347
- {statuses.map(({ label, value }) => (
348
- <SelectItem key={value} value={value}>
349
- {label}
350
- </SelectItem>
351
- ))}
352
- </SelectContent>
353
- </Select>
354
- <FormMessage />
355
- </FormItem>
356
- )}
357
- />
358
-
359
- {isEditorMounted ? (
360
- <div className="col-span-1 md:col-span-2 w-full mt-5 prose prose-neutral mx-auto dark:prose-invert">
361
- <h3 className="w-full bg-transparent text-3xl font-bold">
362
- Description
363
- </h3>
364
- <div id="editor" className="min-h-[360px] w-full" />
365
- <p className="text-sm text-gray-500">
366
- Use{' '}
367
- <kbd className="rounded-md border bg-muted px-1 text-xs uppercase">
368
- Tab
369
- </kbd>{' '}
370
- to open the command menu.
371
- </p>
372
- </div>
373
- ) : undefined}
374
- </form>
375
- </Form>
376
- {task ? (
377
- <SystemInfo
378
- items={[
379
- {
380
- label: 'Id',
381
- value: task.id
382
- },
383
- {
384
- label: 'Created At',
385
- value: formatDateTime(task.createdAt)
386
- },
387
- {
388
- label: 'Updated At',
389
- value: timesAgo(task.updatedAt)
390
- },
391
- {
392
- label: 'Created By',
393
- value: (
394
- <Link
395
- href={`/users/${task.createdBy.id}`}
396
- className="underline underline-offset-4 transition-all hover:text-foreground"
397
- >
398
- {task.createdBy.name ?? 'Unknown'}
399
- </Link>
400
- )
401
- },
402
- {
403
- label: 'Updated By',
404
- value: (
405
- <Link
406
- href={`/users/${task.updatedBy.id}`}
407
- className="underline underline-offset-4 transition-all hover:text-foreground"
408
- >
409
- {task.updatedBy.name ?? 'Unknown'}
410
- </Link>
411
- )
412
- }
413
- ]}
414
- />
415
- ) : undefined}
416
- </Shell>
417
- )
418
- }
@@ -1,69 +0,0 @@
1
- 'use server'
2
-
3
- import { Task, TaskStatus } from '@prisma/client'
4
-
5
- import { authGuard } from '@/lib/auth'
6
- import { prisma } from '@/lib/db'
7
- import { UnwrapPromise } from '@/types/UnwrapPromise'
8
-
9
- export const getTasks = async ({
10
- page,
11
- limit,
12
- sortBy,
13
- sortOrder,
14
- title,
15
- status
16
- }: {
17
- page: number
18
- limit: number
19
- sortBy?: keyof Task
20
- sortOrder?: 'asc' | 'desc'
21
- title?: string
22
- status?: TaskStatus[]
23
- }) => {
24
- const session = await authGuard(['Root', 'Normal'], 'TaskList')
25
- if (!session) throw new Error('Unauthorized')
26
-
27
- const where = {
28
- title: title
29
- ? { contains: title, mode: 'insensitive' as const }
30
- : undefined,
31
- status: status?.length ? { in: status } : undefined
32
- }
33
- const [tasks, total] = await Promise.all([
34
- prisma.task.findMany({
35
- where,
36
- select: {
37
- id: true,
38
- title: true,
39
- status: true,
40
- createdAt: true,
41
- updatedAt: true,
42
- createdBy: {
43
- select: {
44
- id: true,
45
- name: true
46
- }
47
- },
48
- updatedBy: {
49
- select: {
50
- id: true,
51
- name: true
52
- }
53
- }
54
- },
55
- skip: (page - 1) * limit,
56
- take: limit,
57
- orderBy: {
58
- [sortBy || 'createdAt']: sortOrder || 'desc'
59
- }
60
- }),
61
- prisma.task.count({
62
- where
63
- })
64
- ])
65
-
66
- return { tasks, total }
67
- }
68
-
69
- export type GetTasksFnDataType = UnwrapPromise<ReturnType<typeof getTasks>>
@@ -1,63 +0,0 @@
1
- import { Task, TaskStatus } from '@prisma/client'
2
- import { Metadata } from 'next'
3
- import { notFound } from 'next/navigation'
4
-
5
- import { authGuard, checkForPermission } from '@/lib/auth'
6
- import { siteConfig } from '@/lib/siteConfig'
7
- import { getTasks } from './actions'
8
- import { Render } from './render'
9
-
10
- export const metadata: Metadata = {
11
- title: 'Tasks' + ' | ' + siteConfig.name
12
- }
13
-
14
- const TasksPage = async ({
15
- searchParams
16
- }: {
17
- searchParams: {
18
- page?: string
19
- limit?: string
20
- sort?: string
21
- title?: string
22
- status?: string
23
- }
24
- }) => {
25
- const session = await authGuard(['Root', 'Normal'], 'TaskList')
26
- if (!session) return notFound()
27
-
28
- const page = searchParams.page ? parseInt(searchParams.page) : 1
29
- const limit = searchParams.limit ? parseInt(searchParams.limit) : 10
30
-
31
- const [sortBy, sortOrder] =
32
- typeof searchParams.sort === 'string'
33
- ? (searchParams.sort.split('.') as [
34
- keyof Task | undefined,
35
- 'asc' | 'desc' | undefined
36
- ])
37
- : []
38
-
39
- const title = searchParams.title
40
-
41
- const status =
42
- typeof searchParams.status === 'string'
43
- ? (searchParams.status.split('.') as TaskStatus[])
44
- : undefined
45
-
46
- const [canView, canCreate] = await Promise.all([
47
- checkForPermission('TaskView', session),
48
- checkForPermission('TaskCreate', session)
49
- ])
50
-
51
- const data = await getTasks({
52
- page,
53
- limit,
54
- sortBy,
55
- sortOrder,
56
- title,
57
- status
58
- })
59
-
60
- return <Render data={data} canView={canView} canCreate={canCreate} />
61
- }
62
-
63
- export default TasksPage
@@ -1,114 +0,0 @@
1
- 'use client'
2
-
3
- import { TaskStatus } from '@prisma/client'
4
- import Link from 'next/link'
5
- import { FC } from 'react'
6
-
7
- import { DataTable } from '@/components/data-table/data-table'
8
- import { DataTableColumnHeader } from '@/components/data-table/data-table-column-header'
9
- import { Heading } from '@/components/heading'
10
- import { Icons } from '@/components/icons'
11
- import { Shell } from '@/components/shell'
12
- import { Button } from '@/components/ui/button'
13
- import { formatDateTime, timesAgo } from '@/lib/formatDate'
14
- import { generateLabel } from '@/lib/generateLabel'
15
- import { GetTasksFnDataType } from './actions'
16
-
17
- const statuses = Object.values(TaskStatus).map(x => ({
18
- label: generateLabel(x),
19
- value: x
20
- }))
21
-
22
- export const Render: FC<{
23
- data: GetTasksFnDataType
24
- canView: boolean
25
- canCreate: boolean
26
- }> = ({ data, canView, canCreate }) => {
27
- return (
28
- <Shell>
29
- <Heading heading="Tasks" text="List of all the tasks">
30
- {canCreate ? (
31
- <Link href="/tasks/new">
32
- <Button>
33
- <Icons.add className="mr-2 h-4 w-4" />
34
- New
35
- </Button>
36
- </Link>
37
- ) : undefined}
38
- </Heading>
39
- <DataTable
40
- columns={[
41
- {
42
- accessorKey: 'title',
43
- header: ({ column }) => (
44
- <DataTableColumnHeader column={column} title="Title" />
45
- ),
46
- cell: ({ row }) =>
47
- canView ? (
48
- <Link
49
- className="underline underline-offset-4"
50
- href={`/tasks/${row.original.id}`}
51
- >
52
- {row.original.title}
53
- </Link>
54
- ) : (
55
- row.original.title
56
- )
57
- },
58
- {
59
- accessorKey: 'status',
60
- header: ({ column }) => (
61
- <DataTableColumnHeader column={column} title="Status" />
62
- ),
63
- cell: ({ row }) => row.original.status.replace('_', ' ')
64
- },
65
- {
66
- accessorKey: 'createdBy',
67
- header: ({ column }) => (
68
- <DataTableColumnHeader column={column} title="Created By" />
69
- ),
70
- cell: ({ row }) => row.original.createdBy.name,
71
- enableSorting: false
72
- },
73
- {
74
- accessorKey: 'updatedBy',
75
- header: ({ column }) => (
76
- <DataTableColumnHeader column={column} title="Updated By" />
77
- ),
78
- cell: ({ row }) => row.original.updatedBy.name,
79
- enableSorting: false
80
- },
81
- {
82
- accessorKey: 'createdAt',
83
- header: ({ column }) => (
84
- <DataTableColumnHeader column={column} title="Created At" />
85
- ),
86
- cell: ({ row }) => formatDateTime(row.original.createdAt)
87
- },
88
- {
89
- accessorKey: 'updatedAt',
90
- header: ({ column }) => (
91
- <DataTableColumnHeader column={column} title="Updated At" />
92
- ),
93
- cell: ({ row }) => timesAgo(row.original.updatedAt)
94
- }
95
- ]}
96
- data={data.tasks}
97
- total={data.total}
98
- searchableColumns={[
99
- {
100
- id: 'title',
101
- title: 'Title'
102
- }
103
- ]}
104
- filterableColumns={[
105
- {
106
- id: 'status',
107
- title: 'Status',
108
- options: statuses
109
- }
110
- ]}
111
- />
112
- </Shell>
113
- )
114
- }