@contractspec/example.saas-boilerplate 1.57.0 → 1.58.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 (283) hide show
  1. package/.turbo/turbo-build.log +160 -180
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +20 -0
  4. package/dist/billing/billing.entity.d.ts +40 -45
  5. package/dist/billing/billing.entity.d.ts.map +1 -1
  6. package/dist/billing/billing.entity.js +110 -118
  7. package/dist/billing/billing.enum.d.ts +2 -7
  8. package/dist/billing/billing.enum.d.ts.map +1 -1
  9. package/dist/billing/billing.enum.js +17 -24
  10. package/dist/billing/billing.event.d.ts +67 -73
  11. package/dist/billing/billing.event.d.ts.map +1 -1
  12. package/dist/billing/billing.event.js +84 -146
  13. package/dist/billing/billing.handler.d.ts +59 -62
  14. package/dist/billing/billing.handler.d.ts.map +1 -1
  15. package/dist/billing/billing.handler.js +140 -49
  16. package/dist/billing/billing.operations.d.ts +138 -144
  17. package/dist/billing/billing.operations.d.ts.map +1 -1
  18. package/dist/billing/billing.operations.js +273 -175
  19. package/dist/billing/billing.presentation.d.ts +2 -7
  20. package/dist/billing/billing.presentation.d.ts.map +1 -1
  21. package/dist/billing/billing.presentation.js +51 -57
  22. package/dist/billing/billing.schema.d.ts +159 -164
  23. package/dist/billing/billing.schema.d.ts.map +1 -1
  24. package/dist/billing/billing.schema.js +112 -204
  25. package/dist/billing/index.d.ts +11 -8
  26. package/dist/billing/index.d.ts.map +1 -0
  27. package/dist/billing/index.js +689 -9
  28. package/dist/browser/billing/billing.entity.js +113 -0
  29. package/dist/browser/billing/billing.enum.js +19 -0
  30. package/dist/browser/billing/billing.event.js +90 -0
  31. package/dist/browser/billing/billing.handler.js +148 -0
  32. package/dist/browser/billing/billing.operations.js +278 -0
  33. package/dist/browser/billing/billing.presentation.js +52 -0
  34. package/dist/browser/billing/billing.schema.js +121 -0
  35. package/dist/browser/billing/index.js +688 -0
  36. package/dist/browser/dashboard/dashboard.presentation.js +52 -0
  37. package/dist/browser/dashboard/index.js +52 -0
  38. package/dist/browser/docs/index.js +93 -0
  39. package/dist/browser/docs/saas-boilerplate.docblock.js +93 -0
  40. package/dist/browser/example.js +39 -0
  41. package/dist/browser/handlers/index.js +358 -0
  42. package/dist/browser/handlers/saas.handlers.js +134 -0
  43. package/dist/browser/index.js +3340 -0
  44. package/dist/browser/presentations/index.js +290 -0
  45. package/dist/browser/project/index.js +790 -0
  46. package/dist/browser/project/project.entity.js +77 -0
  47. package/dist/browser/project/project.enum.js +18 -0
  48. package/dist/browser/project/project.event.js +103 -0
  49. package/dist/browser/project/project.handler.js +178 -0
  50. package/dist/browser/project/project.operations.js +372 -0
  51. package/dist/browser/project/project.presentation.js +177 -0
  52. package/dist/browser/project/project.schema.js +134 -0
  53. package/dist/browser/saas-boilerplate.feature.js +88 -0
  54. package/dist/browser/seeders/index.js +20 -0
  55. package/dist/browser/settings/index.js +75 -0
  56. package/dist/browser/settings/settings.entity.js +74 -0
  57. package/dist/browser/settings/settings.enum.js +11 -0
  58. package/dist/browser/shared/mock-data.js +104 -0
  59. package/dist/browser/shared/overlay-types.js +0 -0
  60. package/dist/browser/tests/operations.test-spec.js +112 -0
  61. package/dist/browser/ui/SaasDashboard.js +988 -0
  62. package/dist/browser/ui/SaasProjectList.js +162 -0
  63. package/dist/browser/ui/SaasSettingsPanel.js +145 -0
  64. package/dist/browser/ui/hooks/index.js +159 -0
  65. package/dist/browser/ui/hooks/useProjectList.js +66 -0
  66. package/dist/browser/ui/hooks/useProjectMutations.js +91 -0
  67. package/dist/browser/ui/index.js +1808 -0
  68. package/dist/browser/ui/modals/CreateProjectModal.js +153 -0
  69. package/dist/browser/ui/modals/ProjectActionsModal.js +335 -0
  70. package/dist/browser/ui/modals/index.js +487 -0
  71. package/dist/browser/ui/overlays/demo-overlays.js +61 -0
  72. package/dist/browser/ui/overlays/index.js +61 -0
  73. package/dist/browser/ui/renderers/index.js +675 -0
  74. package/dist/browser/ui/renderers/project-list.markdown.js +499 -0
  75. package/dist/browser/ui/renderers/project-list.renderer.js +177 -0
  76. package/dist/dashboard/dashboard.presentation.d.ts +2 -7
  77. package/dist/dashboard/dashboard.presentation.d.ts.map +1 -1
  78. package/dist/dashboard/dashboard.presentation.js +51 -53
  79. package/dist/dashboard/index.d.ts +5 -2
  80. package/dist/dashboard/index.d.ts.map +1 -0
  81. package/dist/dashboard/index.js +53 -3
  82. package/dist/docs/index.d.ts +2 -1
  83. package/dist/docs/index.d.ts.map +1 -0
  84. package/dist/docs/index.js +94 -1
  85. package/dist/docs/saas-boilerplate.docblock.d.ts +2 -1
  86. package/dist/docs/saas-boilerplate.docblock.d.ts.map +1 -0
  87. package/dist/docs/saas-boilerplate.docblock.js +45 -51
  88. package/dist/example.d.ts +2 -6
  89. package/dist/example.d.ts.map +1 -1
  90. package/dist/example.js +38 -50
  91. package/dist/handlers/index.d.ts +7 -4
  92. package/dist/handlers/index.d.ts.map +1 -0
  93. package/dist/handlers/index.js +358 -4
  94. package/dist/handlers/saas.handlers.d.ts +60 -59
  95. package/dist/handlers/saas.handlers.d.ts.map +1 -1
  96. package/dist/handlers/saas.handlers.js +127 -140
  97. package/dist/index.d.ts +15 -45
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +3335 -75
  100. package/dist/node/billing/billing.entity.js +113 -0
  101. package/dist/node/billing/billing.enum.js +19 -0
  102. package/dist/node/billing/billing.event.js +90 -0
  103. package/dist/node/billing/billing.handler.js +148 -0
  104. package/dist/node/billing/billing.operations.js +278 -0
  105. package/dist/node/billing/billing.presentation.js +52 -0
  106. package/dist/node/billing/billing.schema.js +121 -0
  107. package/dist/node/billing/index.js +688 -0
  108. package/dist/node/dashboard/dashboard.presentation.js +52 -0
  109. package/dist/node/dashboard/index.js +52 -0
  110. package/dist/node/docs/index.js +93 -0
  111. package/dist/node/docs/saas-boilerplate.docblock.js +93 -0
  112. package/dist/node/example.js +39 -0
  113. package/dist/node/handlers/index.js +358 -0
  114. package/dist/node/handlers/saas.handlers.js +134 -0
  115. package/dist/node/index.js +3340 -0
  116. package/dist/node/presentations/index.js +290 -0
  117. package/dist/node/project/index.js +790 -0
  118. package/dist/node/project/project.entity.js +77 -0
  119. package/dist/node/project/project.enum.js +18 -0
  120. package/dist/node/project/project.event.js +103 -0
  121. package/dist/node/project/project.handler.js +178 -0
  122. package/dist/node/project/project.operations.js +372 -0
  123. package/dist/node/project/project.presentation.js +177 -0
  124. package/dist/node/project/project.schema.js +134 -0
  125. package/dist/node/saas-boilerplate.feature.js +88 -0
  126. package/dist/node/seeders/index.js +20 -0
  127. package/dist/node/settings/index.js +75 -0
  128. package/dist/node/settings/settings.entity.js +74 -0
  129. package/dist/node/settings/settings.enum.js +11 -0
  130. package/dist/node/shared/mock-data.js +104 -0
  131. package/dist/node/shared/overlay-types.js +0 -0
  132. package/dist/node/tests/operations.test-spec.js +112 -0
  133. package/dist/node/ui/SaasDashboard.js +988 -0
  134. package/dist/node/ui/SaasProjectList.js +162 -0
  135. package/dist/node/ui/SaasSettingsPanel.js +145 -0
  136. package/dist/node/ui/hooks/index.js +159 -0
  137. package/dist/node/ui/hooks/useProjectList.js +66 -0
  138. package/dist/node/ui/hooks/useProjectMutations.js +91 -0
  139. package/dist/node/ui/index.js +1808 -0
  140. package/dist/node/ui/modals/CreateProjectModal.js +153 -0
  141. package/dist/node/ui/modals/ProjectActionsModal.js +335 -0
  142. package/dist/node/ui/modals/index.js +487 -0
  143. package/dist/node/ui/overlays/demo-overlays.js +61 -0
  144. package/dist/node/ui/overlays/index.js +61 -0
  145. package/dist/node/ui/renderers/index.js +675 -0
  146. package/dist/node/ui/renderers/project-list.markdown.js +499 -0
  147. package/dist/node/ui/renderers/project-list.renderer.js +177 -0
  148. package/dist/presentations/index.d.ts +13 -14
  149. package/dist/presentations/index.d.ts.map +1 -1
  150. package/dist/presentations/index.js +289 -15
  151. package/dist/project/index.d.ts +11 -8
  152. package/dist/project/index.d.ts.map +1 -0
  153. package/dist/project/index.js +791 -9
  154. package/dist/project/project.entity.d.ts +23 -28
  155. package/dist/project/project.entity.d.ts.map +1 -1
  156. package/dist/project/project.entity.js +75 -82
  157. package/dist/project/project.enum.d.ts +2 -7
  158. package/dist/project/project.enum.d.ts.map +1 -1
  159. package/dist/project/project.enum.js +16 -23
  160. package/dist/project/project.event.d.ts +69 -75
  161. package/dist/project/project.event.d.ts.map +1 -1
  162. package/dist/project/project.event.js +95 -156
  163. package/dist/project/project.handler.d.ts +44 -47
  164. package/dist/project/project.handler.d.ts.map +1 -1
  165. package/dist/project/project.handler.js +168 -71
  166. package/dist/project/project.operations.d.ts +341 -347
  167. package/dist/project/project.operations.d.ts.map +1 -1
  168. package/dist/project/project.operations.js +366 -253
  169. package/dist/project/project.presentation.d.ts +2 -7
  170. package/dist/project/project.presentation.d.ts.map +1 -1
  171. package/dist/project/project.presentation.js +174 -61
  172. package/dist/project/project.schema.d.ts +191 -196
  173. package/dist/project/project.schema.d.ts.map +1 -1
  174. package/dist/project/project.schema.js +125 -205
  175. package/dist/saas-boilerplate.feature.d.ts +1 -6
  176. package/dist/saas-boilerplate.feature.d.ts.map +1 -1
  177. package/dist/saas-boilerplate.feature.js +87 -206
  178. package/dist/seeders/index.d.ts +4 -8
  179. package/dist/seeders/index.d.ts.map +1 -1
  180. package/dist/seeders/index.js +18 -16
  181. package/dist/settings/index.d.ts +6 -3
  182. package/dist/settings/index.d.ts.map +1 -0
  183. package/dist/settings/index.js +75 -3
  184. package/dist/settings/settings.entity.d.ts +23 -28
  185. package/dist/settings/settings.entity.d.ts.map +1 -1
  186. package/dist/settings/settings.entity.js +72 -75
  187. package/dist/settings/settings.enum.d.ts +1 -6
  188. package/dist/settings/settings.enum.d.ts.map +1 -1
  189. package/dist/settings/settings.enum.js +10 -19
  190. package/dist/shared/mock-data.d.ts +74 -77
  191. package/dist/shared/mock-data.d.ts.map +1 -1
  192. package/dist/shared/mock-data.js +102 -135
  193. package/dist/shared/overlay-types.d.ts +25 -28
  194. package/dist/shared/overlay-types.d.ts.map +1 -1
  195. package/dist/shared/overlay-types.js +1 -0
  196. package/dist/tests/operations.test-spec.d.ts +4 -9
  197. package/dist/tests/operations.test-spec.d.ts.map +1 -1
  198. package/dist/tests/operations.test-spec.js +108 -118
  199. package/dist/ui/SaasDashboard.d.ts +1 -6
  200. package/dist/ui/SaasDashboard.d.ts.map +1 -1
  201. package/dist/ui/SaasDashboard.js +977 -286
  202. package/dist/ui/SaasProjectList.d.ts +4 -11
  203. package/dist/ui/SaasProjectList.d.ts.map +1 -1
  204. package/dist/ui/SaasProjectList.js +159 -72
  205. package/dist/ui/SaasSettingsPanel.d.ts +1 -6
  206. package/dist/ui/SaasSettingsPanel.d.ts.map +1 -1
  207. package/dist/ui/SaasSettingsPanel.js +142 -134
  208. package/dist/ui/hooks/index.d.ts +3 -3
  209. package/dist/ui/hooks/index.d.ts.map +1 -0
  210. package/dist/ui/hooks/index.js +158 -4
  211. package/dist/ui/hooks/useProjectList.d.ts +26 -30
  212. package/dist/ui/hooks/useProjectList.d.ts.map +1 -1
  213. package/dist/ui/hooks/useProjectList.js +63 -71
  214. package/dist/ui/hooks/useProjectMutations.d.ts +20 -24
  215. package/dist/ui/hooks/useProjectMutations.d.ts.map +1 -1
  216. package/dist/ui/hooks/useProjectMutations.js +88 -142
  217. package/dist/ui/index.d.ts +8 -14
  218. package/dist/ui/index.d.ts.map +1 -0
  219. package/dist/ui/index.js +1809 -15
  220. package/dist/ui/modals/CreateProjectModal.d.ts +10 -19
  221. package/dist/ui/modals/CreateProjectModal.d.ts.map +1 -1
  222. package/dist/ui/modals/CreateProjectModal.js +150 -135
  223. package/dist/ui/modals/ProjectActionsModal.d.ts +20 -33
  224. package/dist/ui/modals/ProjectActionsModal.d.ts.map +1 -1
  225. package/dist/ui/modals/ProjectActionsModal.js +333 -289
  226. package/dist/ui/modals/index.d.ts +3 -3
  227. package/dist/ui/modals/index.d.ts.map +1 -0
  228. package/dist/ui/modals/index.js +487 -3
  229. package/dist/ui/overlays/demo-overlays.d.ts +10 -8
  230. package/dist/ui/overlays/demo-overlays.d.ts.map +1 -1
  231. package/dist/ui/overlays/demo-overlays.js +60 -68
  232. package/dist/ui/overlays/index.d.ts +2 -2
  233. package/dist/ui/overlays/index.d.ts.map +1 -0
  234. package/dist/ui/overlays/index.js +62 -3
  235. package/dist/ui/renderers/index.d.ts +3 -3
  236. package/dist/ui/renderers/index.d.ts.map +1 -0
  237. package/dist/ui/renderers/index.js +675 -3
  238. package/dist/ui/renderers/project-list.markdown.d.ts +15 -14
  239. package/dist/ui/renderers/project-list.markdown.d.ts.map +1 -1
  240. package/dist/ui/renderers/project-list.markdown.js +496 -146
  241. package/dist/ui/renderers/project-list.renderer.d.ts +6 -7
  242. package/dist/ui/renderers/project-list.renderer.d.ts.map +1 -1
  243. package/dist/ui/renderers/project-list.renderer.js +176 -15
  244. package/package.json +508 -98
  245. package/tsdown.config.js +1 -2
  246. package/.turbo/turbo-build$colon$bundle.log +0 -180
  247. package/dist/billing/billing.entity.js.map +0 -1
  248. package/dist/billing/billing.enum.js.map +0 -1
  249. package/dist/billing/billing.event.js.map +0 -1
  250. package/dist/billing/billing.handler.js.map +0 -1
  251. package/dist/billing/billing.operations.js.map +0 -1
  252. package/dist/billing/billing.presentation.js.map +0 -1
  253. package/dist/billing/billing.schema.js.map +0 -1
  254. package/dist/dashboard/dashboard.presentation.js.map +0 -1
  255. package/dist/docs/saas-boilerplate.docblock.js.map +0 -1
  256. package/dist/example.js.map +0 -1
  257. package/dist/handlers/saas.handlers.js.map +0 -1
  258. package/dist/index.js.map +0 -1
  259. package/dist/presentations/index.js.map +0 -1
  260. package/dist/project/project.entity.js.map +0 -1
  261. package/dist/project/project.enum.js.map +0 -1
  262. package/dist/project/project.event.js.map +0 -1
  263. package/dist/project/project.handler.js.map +0 -1
  264. package/dist/project/project.operations.js.map +0 -1
  265. package/dist/project/project.presentation.js.map +0 -1
  266. package/dist/project/project.schema.js.map +0 -1
  267. package/dist/saas-boilerplate.feature.js.map +0 -1
  268. package/dist/seeders/index.js.map +0 -1
  269. package/dist/settings/settings.entity.js.map +0 -1
  270. package/dist/settings/settings.enum.js.map +0 -1
  271. package/dist/shared/mock-data.js.map +0 -1
  272. package/dist/tests/operations.test-spec.js.map +0 -1
  273. package/dist/ui/SaasDashboard.js.map +0 -1
  274. package/dist/ui/SaasProjectList.js.map +0 -1
  275. package/dist/ui/SaasSettingsPanel.js.map +0 -1
  276. package/dist/ui/hooks/useProjectList.js.map +0 -1
  277. package/dist/ui/hooks/useProjectMutations.js.map +0 -1
  278. package/dist/ui/modals/CreateProjectModal.js.map +0 -1
  279. package/dist/ui/modals/ProjectActionsModal.js.map +0 -1
  280. package/dist/ui/overlays/demo-overlays.js.map +0 -1
  281. package/dist/ui/renderers/project-list.markdown.js.map +0 -1
  282. package/dist/ui/renderers/project-list.renderer.js.map +0 -1
  283. package/tsconfig.tsbuildinfo +0 -1
@@ -1,292 +1,336 @@
1
- 'use client';
2
-
1
+ // @bun
2
+ // src/ui/modals/ProjectActionsModal.tsx
3
3
  import { useEffect, useState } from "react";
4
4
  import { Button, Input } from "@contractspec/lib.design-system";
5
- import { jsx, jsxs } from "react/jsx-runtime";
6
-
7
- //#region src/ui/modals/ProjectActionsModal.tsx
8
- /**
9
- * ProjectActionsModal - Actions for a specific project
10
- *
11
- * Wires to UpdateProjectContract, DeleteProjectContract
12
- * via useProjectMutations hook.
13
- */
14
- function ProjectActionsModal({ isOpen, project, onClose, onUpdate, onArchive, onActivate, onDelete, isLoading = false }) {
15
- const [mode, setMode] = useState("menu");
16
- const [name, setName] = useState("");
17
- const [description, setDescription] = useState("");
18
- const [error, setError] = useState(null);
19
- const resetForm = () => {
20
- setMode("menu");
21
- setError(null);
22
- if (project) {
23
- setName(project.name);
24
- setDescription(project.description ?? "");
25
- }
26
- };
27
- const handleClose = () => {
28
- resetForm();
29
- onClose();
30
- };
31
- useEffect(() => {
32
- if (project) {
33
- setName(project.name);
34
- setDescription(project.description ?? "");
35
- }
36
- }, [project]);
37
- const handleEdit = async () => {
38
- if (!project) return;
39
- setError(null);
40
- if (!name.trim()) {
41
- setError("Project name is required");
42
- return;
43
- }
44
- try {
45
- await onUpdate({
46
- id: project.id,
47
- name: name.trim(),
48
- description: description.trim() || void 0
49
- });
50
- handleClose();
51
- } catch (err) {
52
- setError(err instanceof Error ? err.message : "Failed to update project");
53
- }
54
- };
55
- const handleArchive = async () => {
56
- if (!project) return;
57
- setError(null);
58
- try {
59
- await onArchive(project.id);
60
- handleClose();
61
- } catch (err) {
62
- setError(err instanceof Error ? err.message : "Failed to archive project");
63
- }
64
- };
65
- const handleActivate = async () => {
66
- if (!project) return;
67
- setError(null);
68
- try {
69
- await onActivate(project.id);
70
- handleClose();
71
- } catch (err) {
72
- setError(err instanceof Error ? err.message : "Failed to activate project");
73
- }
74
- };
75
- const handleDelete = async () => {
76
- if (!project) return;
77
- setError(null);
78
- try {
79
- await onDelete(project.id);
80
- handleClose();
81
- } catch (err) {
82
- setError(err instanceof Error ? err.message : "Failed to delete project");
83
- }
84
- };
85
- if (!isOpen || !project) return null;
86
- return /* @__PURE__ */ jsxs("div", {
87
- className: "fixed inset-0 z-50 flex items-center justify-center",
88
- children: [/* @__PURE__ */ jsx("div", {
89
- className: "bg-background/80 absolute inset-0 backdrop-blur-sm",
90
- onClick: handleClose,
91
- role: "button",
92
- tabIndex: 0,
93
- onKeyDown: (e) => {
94
- if (e.key === "Enter" || e.key === " ") handleClose();
95
- },
96
- "aria-label": "Close modal"
97
- }), /* @__PURE__ */ jsxs("div", {
98
- className: "bg-card border-border relative z-10 w-full max-w-md rounded-xl border p-6 shadow-xl",
99
- children: [
100
- /* @__PURE__ */ jsxs("div", {
101
- className: "border-border mb-4 border-b pb-4",
102
- children: [/* @__PURE__ */ jsx("h2", {
103
- className: "text-xl font-semibold",
104
- children: project.name
105
- }), /* @__PURE__ */ jsxs("p", {
106
- className: "text-muted-foreground text-sm",
107
- children: [
108
- project.tier,
109
- " · ",
110
- project.status
111
- ]
112
- })]
113
- }),
114
- mode === "menu" && /* @__PURE__ */ jsxs("div", {
115
- className: "space-y-3",
116
- children: [
117
- /* @__PURE__ */ jsxs(Button, {
118
- className: "w-full justify-start",
119
- variant: "ghost",
120
- onPress: () => setMode("edit"),
121
- children: [/* @__PURE__ */ jsx("span", {
122
- className: "mr-2",
123
- children: "✏️"
124
- }), " Edit Project"]
125
- }),
126
- project.status === "ACTIVE" || project.status === "DRAFT" ? /* @__PURE__ */ jsxs(Button, {
127
- className: "w-full justify-start",
128
- variant: "ghost",
129
- onPress: () => setMode("archive"),
130
- children: [/* @__PURE__ */ jsx("span", {
131
- className: "mr-2",
132
- children: "📦"
133
- }), " Archive Project"]
134
- }) : project.status === "ARCHIVED" ? /* @__PURE__ */ jsxs(Button, {
135
- className: "w-full justify-start",
136
- variant: "ghost",
137
- onPress: handleActivate,
138
- disabled: isLoading,
139
- children: [/* @__PURE__ */ jsx("span", {
140
- className: "mr-2",
141
- children: "🔄"
142
- }), " Restore Project"]
143
- }) : null,
144
- /* @__PURE__ */ jsxs(Button, {
145
- className: "w-full justify-start text-red-500 hover:text-red-600",
146
- variant: "ghost",
147
- onPress: () => setMode("delete"),
148
- children: [/* @__PURE__ */ jsx("span", {
149
- className: "mr-2",
150
- children: "🗑️"
151
- }), " Delete Project"]
152
- }),
153
- /* @__PURE__ */ jsx("div", {
154
- className: "border-border border-t pt-3",
155
- children: /* @__PURE__ */ jsx(Button, {
156
- className: "w-full",
157
- variant: "outline",
158
- onPress: handleClose,
159
- children: "Close"
160
- })
161
- })
162
- ]
163
- }),
164
- mode === "edit" && /* @__PURE__ */ jsxs("div", {
165
- className: "space-y-4",
166
- children: [
167
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("label", {
168
- htmlFor: "edit-name",
169
- className: "text-muted-foreground mb-1 block text-sm font-medium",
170
- children: "Project Name *"
171
- }), /* @__PURE__ */ jsx(Input, {
172
- id: "edit-name",
173
- value: name,
174
- onChange: (e) => setName(e.target.value),
175
- disabled: isLoading
176
- })] }),
177
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("label", {
178
- htmlFor: "edit-description",
179
- className: "text-muted-foreground mb-1 block text-sm font-medium",
180
- children: "Description"
181
- }), /* @__PURE__ */ jsx("textarea", {
182
- id: "edit-description",
183
- value: description,
184
- onChange: (e) => setDescription(e.target.value),
185
- rows: 3,
186
- disabled: isLoading,
187
- className: "border-input bg-background focus:ring-ring w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none disabled:opacity-50"
188
- })] }),
189
- error && /* @__PURE__ */ jsx("div", {
190
- className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
191
- children: error
192
- }),
193
- /* @__PURE__ */ jsxs("div", {
194
- className: "flex justify-end gap-3 pt-2",
195
- children: [/* @__PURE__ */ jsx(Button, {
196
- variant: "ghost",
197
- onPress: () => setMode("menu"),
198
- disabled: isLoading,
199
- children: "Back"
200
- }), /* @__PURE__ */ jsx(Button, {
201
- onPress: handleEdit,
202
- disabled: isLoading,
203
- children: isLoading ? "Saving..." : "Save Changes"
204
- })]
205
- })
206
- ]
207
- }),
208
- mode === "archive" && /* @__PURE__ */ jsxs("div", {
209
- className: "space-y-4",
210
- children: [
211
- /* @__PURE__ */ jsxs("p", {
212
- className: "text-muted-foreground",
213
- children: [
214
- "Are you sure you want to archive",
215
- " ",
216
- /* @__PURE__ */ jsx("span", {
217
- className: "text-foreground font-medium",
218
- children: project.name
219
- }),
220
- "?"
221
- ]
222
- }),
223
- /* @__PURE__ */ jsx("p", {
224
- className: "text-muted-foreground text-sm",
225
- children: "Archived projects can be restored later."
226
- }),
227
- error && /* @__PURE__ */ jsx("div", {
228
- className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
229
- children: error
230
- }),
231
- /* @__PURE__ */ jsxs("div", {
232
- className: "flex justify-end gap-3 pt-2",
233
- children: [/* @__PURE__ */ jsx(Button, {
234
- variant: "ghost",
235
- onPress: () => setMode("menu"),
236
- disabled: isLoading,
237
- children: "Cancel"
238
- }), /* @__PURE__ */ jsx(Button, {
239
- onPress: handleArchive,
240
- disabled: isLoading,
241
- children: isLoading ? "Archiving..." : "📦 Archive"
242
- })]
243
- })
244
- ]
245
- }),
246
- mode === "delete" && /* @__PURE__ */ jsxs("div", {
247
- className: "space-y-4",
248
- children: [
249
- /* @__PURE__ */ jsxs("p", {
250
- className: "text-muted-foreground",
251
- children: [
252
- "Are you sure you want to delete",
253
- " ",
254
- /* @__PURE__ */ jsx("span", {
255
- className: "text-foreground font-medium",
256
- children: project.name
257
- }),
258
- "?"
259
- ]
260
- }),
261
- /* @__PURE__ */ jsx("p", {
262
- className: "text-destructive text-sm",
263
- children: "This action cannot be undone."
264
- }),
265
- error && /* @__PURE__ */ jsx("div", {
266
- className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
267
- children: error
268
- }),
269
- /* @__PURE__ */ jsxs("div", {
270
- className: "flex justify-end gap-3 pt-2",
271
- children: [/* @__PURE__ */ jsx(Button, {
272
- variant: "ghost",
273
- onPress: () => setMode("menu"),
274
- disabled: isLoading,
275
- children: "Cancel"
276
- }), /* @__PURE__ */ jsx(Button, {
277
- variant: "destructive",
278
- onPress: handleDelete,
279
- disabled: isLoading,
280
- children: isLoading ? "Deleting..." : "🗑️ Delete"
281
- })]
282
- })
283
- ]
284
- })
285
- ]
286
- })]
287
- });
5
+ import { jsxDEV } from "react/jsx-dev-runtime";
6
+ "use client";
7
+ function ProjectActionsModal({
8
+ isOpen,
9
+ project,
10
+ onClose,
11
+ onUpdate,
12
+ onArchive,
13
+ onActivate,
14
+ onDelete,
15
+ isLoading = false
16
+ }) {
17
+ const [mode, setMode] = useState("menu");
18
+ const [name, setName] = useState("");
19
+ const [description, setDescription] = useState("");
20
+ const [error, setError] = useState(null);
21
+ const resetForm = () => {
22
+ setMode("menu");
23
+ setError(null);
24
+ if (project) {
25
+ setName(project.name);
26
+ setDescription(project.description ?? "");
27
+ }
28
+ };
29
+ const handleClose = () => {
30
+ resetForm();
31
+ onClose();
32
+ };
33
+ useEffect(() => {
34
+ if (project) {
35
+ setName(project.name);
36
+ setDescription(project.description ?? "");
37
+ }
38
+ }, [project]);
39
+ const handleEdit = async () => {
40
+ if (!project)
41
+ return;
42
+ setError(null);
43
+ if (!name.trim()) {
44
+ setError("Project name is required");
45
+ return;
46
+ }
47
+ try {
48
+ await onUpdate({
49
+ id: project.id,
50
+ name: name.trim(),
51
+ description: description.trim() || undefined
52
+ });
53
+ handleClose();
54
+ } catch (err) {
55
+ setError(err instanceof Error ? err.message : "Failed to update project");
56
+ }
57
+ };
58
+ const handleArchive = async () => {
59
+ if (!project)
60
+ return;
61
+ setError(null);
62
+ try {
63
+ await onArchive(project.id);
64
+ handleClose();
65
+ } catch (err) {
66
+ setError(err instanceof Error ? err.message : "Failed to archive project");
67
+ }
68
+ };
69
+ const handleActivate = async () => {
70
+ if (!project)
71
+ return;
72
+ setError(null);
73
+ try {
74
+ await onActivate(project.id);
75
+ handleClose();
76
+ } catch (err) {
77
+ setError(err instanceof Error ? err.message : "Failed to activate project");
78
+ }
79
+ };
80
+ const handleDelete = async () => {
81
+ if (!project)
82
+ return;
83
+ setError(null);
84
+ try {
85
+ await onDelete(project.id);
86
+ handleClose();
87
+ } catch (err) {
88
+ setError(err instanceof Error ? err.message : "Failed to delete project");
89
+ }
90
+ };
91
+ if (!isOpen || !project)
92
+ return null;
93
+ return /* @__PURE__ */ jsxDEV("div", {
94
+ className: "fixed inset-0 z-50 flex items-center justify-center",
95
+ children: [
96
+ /* @__PURE__ */ jsxDEV("div", {
97
+ className: "bg-background/80 absolute inset-0 backdrop-blur-sm",
98
+ onClick: handleClose,
99
+ role: "button",
100
+ tabIndex: 0,
101
+ onKeyDown: (e) => {
102
+ if (e.key === "Enter" || e.key === " ")
103
+ handleClose();
104
+ },
105
+ "aria-label": "Close modal"
106
+ }, undefined, false, undefined, this),
107
+ /* @__PURE__ */ jsxDEV("div", {
108
+ className: "bg-card border-border relative z-10 w-full max-w-md rounded-xl border p-6 shadow-xl",
109
+ children: [
110
+ /* @__PURE__ */ jsxDEV("div", {
111
+ className: "border-border mb-4 border-b pb-4",
112
+ children: [
113
+ /* @__PURE__ */ jsxDEV("h2", {
114
+ className: "text-xl font-semibold",
115
+ children: project.name
116
+ }, undefined, false, undefined, this),
117
+ /* @__PURE__ */ jsxDEV("p", {
118
+ className: "text-muted-foreground text-sm",
119
+ children: [
120
+ project.tier,
121
+ " \xB7 ",
122
+ project.status
123
+ ]
124
+ }, undefined, true, undefined, this)
125
+ ]
126
+ }, undefined, true, undefined, this),
127
+ mode === "menu" && /* @__PURE__ */ jsxDEV("div", {
128
+ className: "space-y-3",
129
+ children: [
130
+ /* @__PURE__ */ jsxDEV(Button, {
131
+ className: "w-full justify-start",
132
+ variant: "ghost",
133
+ onPress: () => setMode("edit"),
134
+ children: [
135
+ /* @__PURE__ */ jsxDEV("span", {
136
+ className: "mr-2",
137
+ children: "\u270F\uFE0F"
138
+ }, undefined, false, undefined, this),
139
+ " Edit Project"
140
+ ]
141
+ }, undefined, true, undefined, this),
142
+ project.status === "ACTIVE" || project.status === "DRAFT" ? /* @__PURE__ */ jsxDEV(Button, {
143
+ className: "w-full justify-start",
144
+ variant: "ghost",
145
+ onPress: () => setMode("archive"),
146
+ children: [
147
+ /* @__PURE__ */ jsxDEV("span", {
148
+ className: "mr-2",
149
+ children: "\uD83D\uDCE6"
150
+ }, undefined, false, undefined, this),
151
+ " Archive Project"
152
+ ]
153
+ }, undefined, true, undefined, this) : project.status === "ARCHIVED" ? /* @__PURE__ */ jsxDEV(Button, {
154
+ className: "w-full justify-start",
155
+ variant: "ghost",
156
+ onPress: handleActivate,
157
+ disabled: isLoading,
158
+ children: [
159
+ /* @__PURE__ */ jsxDEV("span", {
160
+ className: "mr-2",
161
+ children: "\uD83D\uDD04"
162
+ }, undefined, false, undefined, this),
163
+ " Restore Project"
164
+ ]
165
+ }, undefined, true, undefined, this) : null,
166
+ /* @__PURE__ */ jsxDEV(Button, {
167
+ className: "w-full justify-start text-red-500 hover:text-red-600",
168
+ variant: "ghost",
169
+ onPress: () => setMode("delete"),
170
+ children: [
171
+ /* @__PURE__ */ jsxDEV("span", {
172
+ className: "mr-2",
173
+ children: "\uD83D\uDDD1\uFE0F"
174
+ }, undefined, false, undefined, this),
175
+ " Delete Project"
176
+ ]
177
+ }, undefined, true, undefined, this),
178
+ /* @__PURE__ */ jsxDEV("div", {
179
+ className: "border-border border-t pt-3",
180
+ children: /* @__PURE__ */ jsxDEV(Button, {
181
+ className: "w-full",
182
+ variant: "outline",
183
+ onPress: handleClose,
184
+ children: "Close"
185
+ }, undefined, false, undefined, this)
186
+ }, undefined, false, undefined, this)
187
+ ]
188
+ }, undefined, true, undefined, this),
189
+ mode === "edit" && /* @__PURE__ */ jsxDEV("div", {
190
+ className: "space-y-4",
191
+ children: [
192
+ /* @__PURE__ */ jsxDEV("div", {
193
+ children: [
194
+ /* @__PURE__ */ jsxDEV("label", {
195
+ htmlFor: "edit-name",
196
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
197
+ children: "Project Name *"
198
+ }, undefined, false, undefined, this),
199
+ /* @__PURE__ */ jsxDEV(Input, {
200
+ id: "edit-name",
201
+ value: name,
202
+ onChange: (e) => setName(e.target.value),
203
+ disabled: isLoading
204
+ }, undefined, false, undefined, this)
205
+ ]
206
+ }, undefined, true, undefined, this),
207
+ /* @__PURE__ */ jsxDEV("div", {
208
+ children: [
209
+ /* @__PURE__ */ jsxDEV("label", {
210
+ htmlFor: "edit-description",
211
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
212
+ children: "Description"
213
+ }, undefined, false, undefined, this),
214
+ /* @__PURE__ */ jsxDEV("textarea", {
215
+ id: "edit-description",
216
+ value: description,
217
+ onChange: (e) => setDescription(e.target.value),
218
+ rows: 3,
219
+ disabled: isLoading,
220
+ className: "border-input bg-background focus:ring-ring w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none disabled:opacity-50"
221
+ }, undefined, false, undefined, this)
222
+ ]
223
+ }, undefined, true, undefined, this),
224
+ error && /* @__PURE__ */ jsxDEV("div", {
225
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
226
+ children: error
227
+ }, undefined, false, undefined, this),
228
+ /* @__PURE__ */ jsxDEV("div", {
229
+ className: "flex justify-end gap-3 pt-2",
230
+ children: [
231
+ /* @__PURE__ */ jsxDEV(Button, {
232
+ variant: "ghost",
233
+ onPress: () => setMode("menu"),
234
+ disabled: isLoading,
235
+ children: "Back"
236
+ }, undefined, false, undefined, this),
237
+ /* @__PURE__ */ jsxDEV(Button, {
238
+ onPress: handleEdit,
239
+ disabled: isLoading,
240
+ children: isLoading ? "Saving..." : "Save Changes"
241
+ }, undefined, false, undefined, this)
242
+ ]
243
+ }, undefined, true, undefined, this)
244
+ ]
245
+ }, undefined, true, undefined, this),
246
+ mode === "archive" && /* @__PURE__ */ jsxDEV("div", {
247
+ className: "space-y-4",
248
+ children: [
249
+ /* @__PURE__ */ jsxDEV("p", {
250
+ className: "text-muted-foreground",
251
+ children: [
252
+ "Are you sure you want to archive",
253
+ " ",
254
+ /* @__PURE__ */ jsxDEV("span", {
255
+ className: "text-foreground font-medium",
256
+ children: project.name
257
+ }, undefined, false, undefined, this),
258
+ "?"
259
+ ]
260
+ }, undefined, true, undefined, this),
261
+ /* @__PURE__ */ jsxDEV("p", {
262
+ className: "text-muted-foreground text-sm",
263
+ children: "Archived projects can be restored later."
264
+ }, undefined, false, undefined, this),
265
+ error && /* @__PURE__ */ jsxDEV("div", {
266
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
267
+ children: error
268
+ }, undefined, false, undefined, this),
269
+ /* @__PURE__ */ jsxDEV("div", {
270
+ className: "flex justify-end gap-3 pt-2",
271
+ children: [
272
+ /* @__PURE__ */ jsxDEV(Button, {
273
+ variant: "ghost",
274
+ onPress: () => setMode("menu"),
275
+ disabled: isLoading,
276
+ children: "Cancel"
277
+ }, undefined, false, undefined, this),
278
+ /* @__PURE__ */ jsxDEV(Button, {
279
+ onPress: handleArchive,
280
+ disabled: isLoading,
281
+ children: isLoading ? "Archiving..." : "\uD83D\uDCE6 Archive"
282
+ }, undefined, false, undefined, this)
283
+ ]
284
+ }, undefined, true, undefined, this)
285
+ ]
286
+ }, undefined, true, undefined, this),
287
+ mode === "delete" && /* @__PURE__ */ jsxDEV("div", {
288
+ className: "space-y-4",
289
+ children: [
290
+ /* @__PURE__ */ jsxDEV("p", {
291
+ className: "text-muted-foreground",
292
+ children: [
293
+ "Are you sure you want to delete",
294
+ " ",
295
+ /* @__PURE__ */ jsxDEV("span", {
296
+ className: "text-foreground font-medium",
297
+ children: project.name
298
+ }, undefined, false, undefined, this),
299
+ "?"
300
+ ]
301
+ }, undefined, true, undefined, this),
302
+ /* @__PURE__ */ jsxDEV("p", {
303
+ className: "text-destructive text-sm",
304
+ children: "This action cannot be undone."
305
+ }, undefined, false, undefined, this),
306
+ error && /* @__PURE__ */ jsxDEV("div", {
307
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
308
+ children: error
309
+ }, undefined, false, undefined, this),
310
+ /* @__PURE__ */ jsxDEV("div", {
311
+ className: "flex justify-end gap-3 pt-2",
312
+ children: [
313
+ /* @__PURE__ */ jsxDEV(Button, {
314
+ variant: "ghost",
315
+ onPress: () => setMode("menu"),
316
+ disabled: isLoading,
317
+ children: "Cancel"
318
+ }, undefined, false, undefined, this),
319
+ /* @__PURE__ */ jsxDEV(Button, {
320
+ variant: "destructive",
321
+ onPress: handleDelete,
322
+ disabled: isLoading,
323
+ children: isLoading ? "Deleting..." : "\uD83D\uDDD1\uFE0F Delete"
324
+ }, undefined, false, undefined, this)
325
+ ]
326
+ }, undefined, true, undefined, this)
327
+ ]
328
+ }, undefined, true, undefined, this)
329
+ ]
330
+ }, undefined, true, undefined, this)
331
+ ]
332
+ }, undefined, true, undefined, this);
288
333
  }
289
-
290
- //#endregion
291
- export { ProjectActionsModal };
292
- //# sourceMappingURL=ProjectActionsModal.js.map
334
+ export {
335
+ ProjectActionsModal
336
+ };