create-ej-app 6.0.0 → 7.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,301 +0,0 @@
1
- 'use client'
2
-
3
- import {
4
- flexRender,
5
- getCoreRowModel,
6
- getFacetedRowModel,
7
- getFacetedUniqueValues,
8
- getFilteredRowModel,
9
- getPaginationRowModel,
10
- getSortedRowModel,
11
- useReactTable,
12
- type ColumnDef,
13
- type ColumnFiltersState,
14
- type PaginationState,
15
- type SortingState,
16
- type VisibilityState
17
- } from '@tanstack/react-table'
18
- import { usePathname, useRouter, useSearchParams } from 'next/navigation'
19
-
20
- import { DataTablePagination } from '@/components/data-table/data-table-pagination'
21
- import { DataTableToolbar } from '@/components/data-table/data-table-toolbar'
22
- import {
23
- Table,
24
- TableBody,
25
- TableCell,
26
- TableHead,
27
- TableHeader,
28
- TableRow
29
- } from '@/components/ui/table'
30
- import { useDebounce } from '@/hooks/use-debounce'
31
- import { useCallback, useEffect, useMemo, useState } from 'react'
32
- import {
33
- DataTableFilterableColumn,
34
- DataTableSearchableColumn
35
- } from './data-table-types'
36
-
37
- interface DataTableProps<TData, TValue> {
38
- columns: ColumnDef<TData, TValue>[]
39
- data: TData[]
40
- total: number
41
- filterableColumns?: DataTableFilterableColumn<TData>[]
42
- searchableColumns?: DataTableSearchableColumn<TData>[]
43
- }
44
-
45
- export function DataTable<TData, TValue>({
46
- columns,
47
- data,
48
- total,
49
- filterableColumns = [],
50
- searchableColumns = []
51
- }: DataTableProps<TData, TValue>) {
52
- const router = useRouter()
53
- const pathname = usePathname()
54
- const searchParams = useSearchParams()
55
-
56
- // Search params
57
- const page = searchParams?.get('page') ?? '1'
58
- const limit = searchParams?.get('limit') ?? '10'
59
- const sort = searchParams?.get('sort')
60
- const [column, order] = sort?.split('.') ?? []
61
-
62
- // Create query string
63
- const createQueryString = useCallback(
64
- (params: Record<string, string | number | null>) => {
65
- const newSearchParams = new URLSearchParams(searchParams?.toString())
66
-
67
- for (const [key, value] of Object.entries(params)) {
68
- if (value === null) {
69
- newSearchParams.delete(key)
70
- } else {
71
- newSearchParams.set(key, String(value))
72
- }
73
- }
74
-
75
- return newSearchParams.toString()
76
- },
77
- [searchParams]
78
- )
79
-
80
- // Table states
81
- const [rowSelection, setRowSelection] = useState({})
82
- const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})
83
- const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
84
-
85
- // Handle server-side pagination
86
- const [{ pageIndex, pageSize }, setPagination] = useState<PaginationState>({
87
- pageIndex: Number(page) - 1,
88
- pageSize: Number(limit)
89
- })
90
-
91
- const pagination = useMemo(
92
- () => ({
93
- pageIndex,
94
- pageSize
95
- }),
96
- [pageIndex, pageSize]
97
- )
98
-
99
- useEffect(() => {
100
- setPagination({
101
- pageIndex: Number(page) - 1,
102
- pageSize: Number(limit)
103
- })
104
- }, [page, limit])
105
-
106
- useEffect(() => {
107
- router.push(
108
- `${pathname}?${createQueryString({
109
- page: pageIndex + 1,
110
- limit: pageSize
111
- })}`
112
- )
113
- // eslint-disable-next-line react-hooks/exhaustive-deps
114
- }, [pageIndex, pageSize])
115
-
116
- // Handle server-side sorting
117
- const [sorting, setSorting] = useState<SortingState>([
118
- {
119
- id: column ?? '',
120
- desc: order === 'desc'
121
- }
122
- ])
123
-
124
- useEffect(() => {
125
- router.push(
126
- `${pathname}?${createQueryString({
127
- page,
128
- sort: sorting[0]?.id
129
- ? `${sorting[0]?.id}.${sorting[0]?.desc ? 'desc' : 'asc'}`
130
- : null
131
- })}`
132
- )
133
- // eslint-disable-next-line react-hooks/exhaustive-deps
134
- }, [sorting])
135
-
136
- // Handle server-side filtering
137
- const debouncedSearchableColumnFilters = JSON.parse(
138
- useDebounce(
139
- JSON.stringify(
140
- columnFilters.filter(filter => {
141
- return searchableColumns.find(column => column.id === filter.id)
142
- })
143
- ),
144
- 500
145
- )
146
- ) as ColumnFiltersState
147
-
148
- const filterableColumnFilters = columnFilters.filter(filter => {
149
- return filterableColumns.find(column => column.id === filter.id)
150
- })
151
-
152
- useEffect(() => {
153
- for (const column of debouncedSearchableColumnFilters) {
154
- if (typeof column.value === 'string') {
155
- router.push(
156
- `${pathname}?${createQueryString({
157
- page: 1,
158
- [column.id]: typeof column.value === 'string' ? column.value : null
159
- })}`
160
- )
161
- }
162
- }
163
-
164
- for (const key of searchParams.keys()) {
165
- if (
166
- searchableColumns.find(column => column.id === key) &&
167
- !debouncedSearchableColumnFilters.find(column => column.id === key)
168
- ) {
169
- router.push(
170
- `${pathname}?${createQueryString({
171
- page: 1,
172
- [key]: null
173
- })}`
174
- )
175
- }
176
- }
177
- // eslint-disable-next-line react-hooks/exhaustive-deps
178
- }, [JSON.stringify(debouncedSearchableColumnFilters)])
179
-
180
- useEffect(() => {
181
- for (const column of filterableColumnFilters) {
182
- if (typeof column.value === 'object' && Array.isArray(column.value)) {
183
- router.push(
184
- `${pathname}?${createQueryString({
185
- page: 1,
186
- [column.id]: column.value.join('.')
187
- })}`
188
- )
189
- }
190
- }
191
-
192
- for (const key of searchParams.keys()) {
193
- if (
194
- filterableColumns.find(column => column.id === key) &&
195
- !filterableColumnFilters.find(column => column.id === key)
196
- ) {
197
- router.push(
198
- `${pathname}?${createQueryString({
199
- page: 1,
200
- [key]: null
201
- })}`
202
- )
203
- }
204
- }
205
- // eslint-disable-next-line react-hooks/exhaustive-deps
206
- }, [JSON.stringify(filterableColumnFilters)])
207
-
208
- const pageCount = useMemo(
209
- () => Math.ceil(total / pageSize),
210
- [total, pageSize]
211
- )
212
-
213
- const table = useReactTable({
214
- data,
215
- columns,
216
- pageCount,
217
- state: {
218
- pagination,
219
- sorting,
220
- columnVisibility,
221
- rowSelection,
222
- columnFilters
223
- },
224
- enableRowSelection: true,
225
- onRowSelectionChange: setRowSelection,
226
- onPaginationChange: setPagination,
227
- onSortingChange: setSorting,
228
- onColumnFiltersChange: setColumnFilters,
229
- onColumnVisibilityChange: setColumnVisibility,
230
- getCoreRowModel: getCoreRowModel(),
231
- getFilteredRowModel: getFilteredRowModel(),
232
- getPaginationRowModel: getPaginationRowModel(),
233
- getSortedRowModel: getSortedRowModel(),
234
- getFacetedRowModel: getFacetedRowModel(),
235
- getFacetedUniqueValues: getFacetedUniqueValues(),
236
- manualPagination: true,
237
- manualSorting: true,
238
- manualFiltering: true
239
- })
240
-
241
- return (
242
- <div className="w-full space-y-4 overflow-auto">
243
- <DataTableToolbar
244
- table={table}
245
- filterableColumns={filterableColumns}
246
- searchableColumns={searchableColumns}
247
- />
248
- <div className="rounded-md border">
249
- <Table>
250
- <TableHeader>
251
- {table.getHeaderGroups().map(headerGroup => (
252
- <TableRow key={headerGroup.id}>
253
- {headerGroup.headers.map(header => {
254
- return (
255
- <TableHead key={header.id}>
256
- {header.isPlaceholder
257
- ? null
258
- : flexRender(
259
- header.column.columnDef.header,
260
- header.getContext()
261
- )}
262
- </TableHead>
263
- )
264
- })}
265
- </TableRow>
266
- ))}
267
- </TableHeader>
268
- <TableBody>
269
- {table.getRowModel().rows?.length ? (
270
- table.getRowModel().rows.map(row => (
271
- <TableRow
272
- key={row.id}
273
- data-state={row.getIsSelected() && 'selected'}
274
- >
275
- {row.getVisibleCells().map(cell => (
276
- <TableCell key={cell.id}>
277
- {flexRender(
278
- cell.column.columnDef.cell,
279
- cell.getContext()
280
- )}
281
- </TableCell>
282
- ))}
283
- </TableRow>
284
- ))
285
- ) : (
286
- <TableRow>
287
- <TableCell
288
- colSpan={columns.length}
289
- className="h-24 text-center"
290
- >
291
- No results.
292
- </TableCell>
293
- </TableRow>
294
- )}
295
- </TableBody>
296
- </Table>
297
- </div>
298
- <DataTablePagination table={table} />
299
- </div>
300
- )
301
- }
@@ -1,109 +0,0 @@
1
- 'use client'
2
-
3
- import {
4
- ColumnDef,
5
- flexRender,
6
- getCoreRowModel,
7
- getPaginationRowModel,
8
- useReactTable
9
- } from '@tanstack/react-table'
10
-
11
- import { Button } from '@/components/ui/button'
12
- import {
13
- Table,
14
- TableBody,
15
- TableCell,
16
- TableHead,
17
- TableHeader,
18
- TableRow
19
- } from '@/components/ui/table'
20
-
21
- interface DataTableProps<TData, TValue> {
22
- columns: ColumnDef<TData, TValue>[]
23
- data: TData[]
24
- }
25
-
26
- export function SimpleDataTable<TData, TValue>({
27
- columns,
28
- data
29
- }: DataTableProps<TData, TValue>) {
30
- const table = useReactTable({
31
- data,
32
- columns,
33
- getCoreRowModel: getCoreRowModel(),
34
- getPaginationRowModel: getPaginationRowModel()
35
- })
36
-
37
- return (
38
- <div>
39
- <div className="rounded-md border">
40
- <Table>
41
- <TableHeader>
42
- {table.getHeaderGroups().map(headerGroup => (
43
- <TableRow key={headerGroup.id}>
44
- {headerGroup.headers.map(header => {
45
- return (
46
- <TableHead key={header.id}>
47
- {header.isPlaceholder
48
- ? null
49
- : flexRender(
50
- header.column.columnDef.header,
51
- header.getContext()
52
- )}
53
- </TableHead>
54
- )
55
- })}
56
- </TableRow>
57
- ))}
58
- </TableHeader>
59
- <TableBody>
60
- {table.getRowModel().rows?.length ? (
61
- table.getRowModel().rows.map(row => (
62
- <TableRow
63
- key={row.id}
64
- data-state={row.getIsSelected() && 'selected'}
65
- >
66
- {row.getVisibleCells().map(cell => (
67
- <TableCell key={cell.id}>
68
- {flexRender(
69
- cell.column.columnDef.cell,
70
- cell.getContext()
71
- )}
72
- </TableCell>
73
- ))}
74
- </TableRow>
75
- ))
76
- ) : (
77
- <TableRow>
78
- <TableCell
79
- colSpan={columns.length}
80
- className="h-24 text-center"
81
- >
82
- No results.
83
- </TableCell>
84
- </TableRow>
85
- )}
86
- </TableBody>
87
- </Table>
88
- </div>
89
- <div className="flex items-center justify-end space-x-2 py-4">
90
- <Button
91
- variant="outline"
92
- size="sm"
93
- onClick={() => table.previousPage()}
94
- disabled={!table.getCanPreviousPage()}
95
- >
96
- Previous
97
- </Button>
98
- <Button
99
- variant="outline"
100
- size="sm"
101
- onClick={() => table.nextPage()}
102
- disabled={!table.getCanNextPage()}
103
- >
104
- Next
105
- </Button>
106
- </div>
107
- </div>
108
- )
109
- }
@@ -1,78 +0,0 @@
1
- import * as React from 'react'
2
-
3
- import { Icons } from '@/components/icons'
4
- import { cn } from '@/lib/cn'
5
-
6
- interface EmptyPlaceholderProps extends React.HTMLAttributes<HTMLDivElement> {}
7
-
8
- export function EmptyPlaceholder({
9
- className,
10
- children,
11
- ...props
12
- }: EmptyPlaceholderProps) {
13
- return (
14
- <div
15
- className={cn(
16
- 'flex min-h-[400px] flex-col items-center justify-center rounded-md border border-dashed p-8 text-center animate-in fade-in-50',
17
- className
18
- )}
19
- {...props}
20
- >
21
- <div className="mx-auto flex max-w-[420px] flex-col items-center justify-center text-center">
22
- {children}
23
- </div>
24
- </div>
25
- )
26
- }
27
-
28
- interface EmptyPlaceholderIconProps
29
- extends Partial<React.SVGProps<SVGSVGElement>> {
30
- name: keyof typeof Icons
31
- }
32
-
33
- EmptyPlaceholder.Icon = function EmptyPlaceHolderIcon({
34
- name,
35
- className
36
- }: EmptyPlaceholderIconProps) {
37
- const Icon = Icons[name]
38
-
39
- if (!Icon) {
40
- return null
41
- }
42
-
43
- return (
44
- <div className="flex h-20 w-20 items-center justify-center rounded-full bg-muted">
45
- <Icon className={cn('h-10 w-10', className)} />
46
- </div>
47
- )
48
- }
49
-
50
- interface EmptyPlacholderTitleProps
51
- extends React.HTMLAttributes<HTMLHeadingElement> {}
52
-
53
- EmptyPlaceholder.Title = function EmptyPlaceholderTitle({
54
- className,
55
- ...props
56
- }: EmptyPlacholderTitleProps) {
57
- return (
58
- <h2 className={cn('mt-6 text-xl font-semibold', className)} {...props} />
59
- )
60
- }
61
-
62
- interface EmptyPlacholderDescriptionProps
63
- extends React.HTMLAttributes<HTMLParagraphElement> {}
64
-
65
- EmptyPlaceholder.Description = function EmptyPlaceholderDescription({
66
- className,
67
- ...props
68
- }: EmptyPlacholderDescriptionProps) {
69
- return (
70
- <p
71
- className={cn(
72
- 'mb-8 mt-2 text-center text-sm font-normal leading-6 text-muted-foreground',
73
- className
74
- )}
75
- {...props}
76
- />
77
- )
78
- }
@@ -1,17 +0,0 @@
1
- import { FC, ReactNode } from 'react'
2
-
3
- export const Heading: FC<{
4
- heading: string
5
- text?: string
6
- children?: ReactNode
7
- }> = ({ heading, text, children }) => {
8
- return (
9
- <div className="flex items-center justify-between px-2">
10
- <div className="grid gap-1">
11
- <h1 className="font-heading text-3xl md:text-4xl">{heading}</h1>
12
- {text && <p className="text-lg text-muted-foreground">{text}</p>}
13
- </div>
14
- {children}
15
- </div>
16
- )
17
- }
@@ -1,85 +0,0 @@
1
- import { cn } from '@/lib/cn'
2
- import {
3
- ArrowDown,
4
- ArrowRight,
5
- ArrowUp,
6
- ArrowUpDown,
7
- Biohazard,
8
- Check,
9
- ChevronLeft,
10
- ChevronRight,
11
- ChevronsLeft,
12
- ChevronsRight,
13
- ClipboardList,
14
- Download,
15
- Edit,
16
- EyeOff,
17
- Github,
18
- Laptop,
19
- LayoutDashboard,
20
- Loader2,
21
- LogIn,
22
- LogOut,
23
- LucideIcon,
24
- LucideProps,
25
- Moon,
26
- Plus,
27
- PlusCircle,
28
- Save,
29
- Settings,
30
- Settings2,
31
- Sun,
32
- Trash,
33
- User,
34
- X
35
- } from 'lucide-react'
36
-
37
- export type Icon = LucideIcon
38
-
39
- export const Icons = {
40
- logo: Biohazard,
41
- sun: Sun,
42
- moon: Moon,
43
- laptop: Laptop,
44
- chevronLeft: ChevronLeft,
45
- arrowRight: ArrowRight,
46
- github: Github,
47
- google: ({ ...props }: LucideProps) => (
48
- <svg
49
- aria-hidden="true"
50
- focusable="false"
51
- data-prefix="fab"
52
- data-icon="google"
53
- role="img"
54
- xmlns="http://www.w3.org/2000/svg"
55
- viewBox="0 0 30 30"
56
- {...props}
57
- className={cn('fill-current', props.className)}
58
- >
59
- <path d="M 15.003906 3 C 8.3749062 3 3 8.373 3 15 C 3 21.627 8.3749062 27 15.003906 27 C 25.013906 27 27.269078 17.707 26.330078 13 L 25 13 L 22.732422 13 L 15 13 L 15 17 L 22.738281 17 C 21.848702 20.448251 18.725955 23 15 23 C 10.582 23 7 19.418 7 15 C 7 10.582 10.582 7 15 7 C 17.009 7 18.839141 7.74575 20.244141 8.96875 L 23.085938 6.1289062 C 20.951937 4.1849063 18.116906 3 15.003906 3 z"></path>
60
- </svg>
61
- ),
62
- login: LogIn,
63
- logout: LogOut,
64
- user: User,
65
- spinner: Loader2,
66
- settings: Settings,
67
- close: X,
68
- add: Plus,
69
- edit: Edit,
70
- save: Save,
71
- delete: Trash,
72
- download: Download,
73
- dashboard: LayoutDashboard,
74
- task: ClipboardList,
75
- arrowUp: ArrowUp,
76
- arrowDown: ArrowDown,
77
- arrowUpDown: ArrowUpDown,
78
- eyeOff: EyeOff,
79
- plusCircle: PlusCircle,
80
- check: Check,
81
- chevronsLeft: ChevronsLeft,
82
- chevronsRight: ChevronsRight,
83
- chevronRight: ChevronRight,
84
- mixer: Settings2
85
- }
@@ -1,64 +0,0 @@
1
- 'use client'
2
-
3
- import Link from 'next/link'
4
- import { useSelectedLayoutSegment } from 'next/navigation'
5
- import { FC, useState } from 'react'
6
-
7
- import { Icons } from '@/components/icons'
8
- import { MobileNav } from '@/components/mobile-nav'
9
- import { cn } from '@/lib/cn'
10
- import { siteConfig } from '@/lib/siteConfig'
11
-
12
- type MainNavItem = {
13
- title: string
14
- href: string
15
- disabled?: boolean
16
- }
17
-
18
- type MainNavProps = {
19
- logoLink?: string
20
- items?: MainNavItem[]
21
- }
22
-
23
- export const MainNav: FC<MainNavProps> = ({ logoLink = '/', items }) => {
24
- const [showMobileMenu, setShowMobileMenu] = useState(false)
25
- const segment = useSelectedLayoutSegment()
26
-
27
- return (
28
- <div className="flex md:gap-10">
29
- <Link href={logoLink} className="hidden items-center space-x-2 md:flex">
30
- <Icons.logo />
31
- <span className="hidden font-bold sm:inline-block">
32
- {siteConfig.name}
33
- </span>
34
- </Link>
35
- {items?.length ? (
36
- <nav className="hidden gap-6 md:flex">
37
- {items?.map((item, i) => (
38
- <Link
39
- key={i}
40
- href={item.disabled ? '#' : item.href}
41
- className={cn(
42
- 'flex items-center text-lg font-medium transition-colors hover:text-foreground/80 sm:text-sm',
43
- item.href.startsWith(`/${segment}`)
44
- ? 'text-foreground'
45
- : 'text-foreground/60',
46
- item.disabled && 'cursor-not-allowed opacity-80'
47
- )}
48
- >
49
- {item.title}
50
- </Link>
51
- ))}
52
- </nav>
53
- ) : undefined}
54
- <button
55
- className="flex items-center space-x-2 md:hidden"
56
- onClick={() => setShowMobileMenu(prev => !prev)}
57
- >
58
- {showMobileMenu ? <Icons.close /> : <Icons.logo />}
59
- <span className="font-bold">Menu</span>
60
- </button>
61
- {showMobileMenu && items?.length && <MobileNav items={items} />}
62
- </div>
63
- )
64
- }
@@ -1,13 +0,0 @@
1
- import { FC } from 'react'
2
-
3
- import { cn } from '@/lib/cn'
4
-
5
- interface ShellProps extends React.HTMLAttributes<HTMLDivElement> {}
6
-
7
- export const Shell: FC<ShellProps> = ({ children, className, ...props }) => {
8
- return (
9
- <div className={cn('grid items-start gap-8 p-1', className)} {...props}>
10
- {children}
11
- </div>
12
- )
13
- }