@contractspec/example.crm-pipeline 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 (259) hide show
  1. package/.turbo/turbo-build.log +148 -164
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +20 -0
  4. package/dist/browser/crm-pipeline.feature.js +75 -0
  5. package/dist/browser/deal/deal.enum.js +18 -0
  6. package/dist/browser/deal/deal.operation.js +396 -0
  7. package/dist/browser/deal/deal.schema.js +141 -0
  8. package/dist/browser/deal/deal.test-spec.js +58 -0
  9. package/dist/browser/deal/index.js +408 -0
  10. package/dist/browser/docs/crm-pipeline.docblock.js +113 -0
  11. package/dist/browser/docs/index.js +113 -0
  12. package/dist/browser/entities/company.entity.js +52 -0
  13. package/dist/browser/entities/contact.entity.js +66 -0
  14. package/dist/browser/entities/deal.entity.js +107 -0
  15. package/dist/browser/entities/index.js +343 -0
  16. package/dist/browser/entities/task.entity.js +99 -0
  17. package/dist/browser/events/contact.event.js +31 -0
  18. package/dist/browser/events/deal.event.js +101 -0
  19. package/dist/browser/events/index.js +158 -0
  20. package/dist/browser/events/task.event.js +28 -0
  21. package/dist/browser/example.js +39 -0
  22. package/dist/browser/handlers/crm.handlers.js +160 -0
  23. package/dist/browser/handlers/deal.handlers.js +293 -0
  24. package/dist/browser/handlers/index.js +456 -0
  25. package/dist/browser/handlers/mock-data.js +165 -0
  26. package/dist/browser/index.js +3279 -0
  27. package/dist/browser/operations/index.js +407 -0
  28. package/dist/browser/presentations/dashboard.presentation.js +52 -0
  29. package/dist/browser/presentations/index.js +284 -0
  30. package/dist/browser/presentations/pipeline.presentation.js +233 -0
  31. package/dist/browser/seeders/index.js +22 -0
  32. package/dist/browser/shared/overlay-types.js +0 -0
  33. package/dist/browser/ui/CrmDashboard.js +1325 -0
  34. package/dist/browser/ui/CrmDealCard.js +50 -0
  35. package/dist/browser/ui/CrmPipelineBoard.js +160 -0
  36. package/dist/browser/ui/hooks/index.js +186 -0
  37. package/dist/browser/ui/hooks/useDealList.js +84 -0
  38. package/dist/browser/ui/hooks/useDealMutations.js +100 -0
  39. package/dist/browser/ui/index.js +1972 -0
  40. package/dist/browser/ui/modals/CreateDealModal.js +211 -0
  41. package/dist/browser/ui/modals/DealActionsModal.js +428 -0
  42. package/dist/browser/ui/modals/index.js +638 -0
  43. package/dist/browser/ui/overlays/demo-overlays.js +55 -0
  44. package/dist/browser/ui/overlays/index.js +55 -0
  45. package/dist/browser/ui/renderers/index.js +827 -0
  46. package/dist/browser/ui/renderers/pipeline.markdown.js +564 -0
  47. package/dist/browser/ui/renderers/pipeline.renderer.js +264 -0
  48. package/dist/crm-pipeline.feature.d.ts +1 -6
  49. package/dist/crm-pipeline.feature.d.ts.map +1 -1
  50. package/dist/crm-pipeline.feature.js +74 -164
  51. package/dist/deal/deal.enum.d.ts +2 -7
  52. package/dist/deal/deal.enum.d.ts.map +1 -1
  53. package/dist/deal/deal.enum.js +16 -22
  54. package/dist/deal/deal.operation.d.ts +444 -450
  55. package/dist/deal/deal.operation.d.ts.map +1 -1
  56. package/dist/deal/deal.operation.js +390 -263
  57. package/dist/deal/deal.schema.d.ts +251 -256
  58. package/dist/deal/deal.schema.d.ts.map +1 -1
  59. package/dist/deal/deal.schema.js +131 -275
  60. package/dist/deal/deal.test-spec.d.ts +2 -7
  61. package/dist/deal/deal.test-spec.d.ts.map +1 -1
  62. package/dist/deal/deal.test-spec.js +56 -62
  63. package/dist/deal/index.d.ts +7 -4
  64. package/dist/deal/index.d.ts.map +1 -0
  65. package/dist/deal/index.js +408 -4
  66. package/dist/docs/crm-pipeline.docblock.d.ts +2 -1
  67. package/dist/docs/crm-pipeline.docblock.d.ts.map +1 -0
  68. package/dist/docs/crm-pipeline.docblock.js +45 -51
  69. package/dist/docs/index.d.ts +2 -1
  70. package/dist/docs/index.d.ts.map +1 -0
  71. package/dist/docs/index.js +114 -1
  72. package/dist/entities/company.entity.d.ts +27 -32
  73. package/dist/entities/company.entity.d.ts.map +1 -1
  74. package/dist/entities/company.entity.js +51 -61
  75. package/dist/entities/contact.entity.d.ts +31 -36
  76. package/dist/entities/contact.entity.d.ts.map +1 -1
  77. package/dist/entities/contact.entity.js +65 -76
  78. package/dist/entities/deal.entity.d.ts +52 -57
  79. package/dist/entities/deal.entity.d.ts.map +1 -1
  80. package/dist/entities/deal.entity.js +104 -116
  81. package/dist/entities/index.d.ts +6 -10
  82. package/dist/entities/index.d.ts.map +1 -1
  83. package/dist/entities/index.js +342 -31
  84. package/dist/entities/task.entity.d.ts +42 -47
  85. package/dist/entities/task.entity.d.ts.map +1 -1
  86. package/dist/entities/task.entity.js +95 -124
  87. package/dist/events/contact.event.d.ts +21 -27
  88. package/dist/events/contact.event.d.ts.map +1 -1
  89. package/dist/events/contact.event.js +29 -42
  90. package/dist/events/deal.event.d.ts +100 -106
  91. package/dist/events/deal.event.d.ts.map +1 -1
  92. package/dist/events/deal.event.js +93 -163
  93. package/dist/events/index.d.ts +4 -4
  94. package/dist/events/index.d.ts.map +1 -0
  95. package/dist/events/index.js +158 -4
  96. package/dist/events/task.event.d.ts +21 -27
  97. package/dist/events/task.event.d.ts.map +1 -1
  98. package/dist/events/task.event.js +26 -42
  99. package/dist/example.d.ts +2 -6
  100. package/dist/example.d.ts.map +1 -1
  101. package/dist/example.js +38 -50
  102. package/dist/handlers/crm.handlers.d.ts +80 -78
  103. package/dist/handlers/crm.handlers.d.ts.map +1 -1
  104. package/dist/handlers/crm.handlers.js +155 -166
  105. package/dist/handlers/deal.handlers.d.ts +58 -63
  106. package/dist/handlers/deal.handlers.d.ts.map +1 -1
  107. package/dist/handlers/deal.handlers.js +279 -105
  108. package/dist/handlers/index.d.ts +10 -4
  109. package/dist/handlers/index.d.ts.map +1 -0
  110. package/dist/handlers/index.js +456 -4
  111. package/dist/handlers/mock-data.d.ts +38 -41
  112. package/dist/handlers/mock-data.d.ts.map +1 -1
  113. package/dist/handlers/mock-data.js +162 -184
  114. package/dist/index.d.ts +13 -42
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +3277 -53
  117. package/dist/node/crm-pipeline.feature.js +75 -0
  118. package/dist/node/deal/deal.enum.js +18 -0
  119. package/dist/node/deal/deal.operation.js +396 -0
  120. package/dist/node/deal/deal.schema.js +141 -0
  121. package/dist/node/deal/deal.test-spec.js +58 -0
  122. package/dist/node/deal/index.js +408 -0
  123. package/dist/node/docs/crm-pipeline.docblock.js +113 -0
  124. package/dist/node/docs/index.js +113 -0
  125. package/dist/node/entities/company.entity.js +52 -0
  126. package/dist/node/entities/contact.entity.js +66 -0
  127. package/dist/node/entities/deal.entity.js +107 -0
  128. package/dist/node/entities/index.js +343 -0
  129. package/dist/node/entities/task.entity.js +99 -0
  130. package/dist/node/events/contact.event.js +31 -0
  131. package/dist/node/events/deal.event.js +101 -0
  132. package/dist/node/events/index.js +158 -0
  133. package/dist/node/events/task.event.js +28 -0
  134. package/dist/node/example.js +39 -0
  135. package/dist/node/handlers/crm.handlers.js +160 -0
  136. package/dist/node/handlers/deal.handlers.js +293 -0
  137. package/dist/node/handlers/index.js +456 -0
  138. package/dist/node/handlers/mock-data.js +165 -0
  139. package/dist/node/index.js +3279 -0
  140. package/dist/node/operations/index.js +407 -0
  141. package/dist/node/presentations/dashboard.presentation.js +52 -0
  142. package/dist/node/presentations/index.js +284 -0
  143. package/dist/node/presentations/pipeline.presentation.js +233 -0
  144. package/dist/node/seeders/index.js +22 -0
  145. package/dist/node/shared/overlay-types.js +0 -0
  146. package/dist/node/ui/CrmDashboard.js +1325 -0
  147. package/dist/node/ui/CrmDealCard.js +50 -0
  148. package/dist/node/ui/CrmPipelineBoard.js +160 -0
  149. package/dist/node/ui/hooks/index.js +186 -0
  150. package/dist/node/ui/hooks/useDealList.js +84 -0
  151. package/dist/node/ui/hooks/useDealMutations.js +100 -0
  152. package/dist/node/ui/index.js +1972 -0
  153. package/dist/node/ui/modals/CreateDealModal.js +211 -0
  154. package/dist/node/ui/modals/DealActionsModal.js +428 -0
  155. package/dist/node/ui/modals/index.js +638 -0
  156. package/dist/node/ui/overlays/demo-overlays.js +55 -0
  157. package/dist/node/ui/overlays/index.js +55 -0
  158. package/dist/node/ui/renderers/index.js +827 -0
  159. package/dist/node/ui/renderers/pipeline.markdown.js +564 -0
  160. package/dist/node/ui/renderers/pipeline.renderer.js +264 -0
  161. package/dist/operations/index.d.ts +2 -5
  162. package/dist/operations/index.d.ts.map +1 -0
  163. package/dist/operations/index.js +407 -5
  164. package/dist/presentations/dashboard.presentation.d.ts +2 -7
  165. package/dist/presentations/dashboard.presentation.d.ts.map +1 -1
  166. package/dist/presentations/dashboard.presentation.js +51 -60
  167. package/dist/presentations/index.d.ts +3 -3
  168. package/dist/presentations/index.d.ts.map +1 -0
  169. package/dist/presentations/index.js +284 -3
  170. package/dist/presentations/pipeline.presentation.d.ts +4 -9
  171. package/dist/presentations/pipeline.presentation.d.ts.map +1 -1
  172. package/dist/presentations/pipeline.presentation.js +228 -116
  173. package/dist/seeders/index.d.ts +4 -8
  174. package/dist/seeders/index.d.ts.map +1 -1
  175. package/dist/seeders/index.js +21 -45
  176. package/dist/shared/overlay-types.d.ts +25 -28
  177. package/dist/shared/overlay-types.d.ts.map +1 -1
  178. package/dist/shared/overlay-types.js +1 -0
  179. package/dist/ui/CrmDashboard.d.ts +1 -6
  180. package/dist/ui/CrmDashboard.d.ts.map +1 -1
  181. package/dist/ui/CrmDashboard.js +1318 -296
  182. package/dist/ui/CrmDealCard.d.ts +8 -12
  183. package/dist/ui/CrmDealCard.d.ts.map +1 -1
  184. package/dist/ui/CrmDealCard.js +47 -45
  185. package/dist/ui/CrmPipelineBoard.d.ts +11 -20
  186. package/dist/ui/CrmPipelineBoard.d.ts.map +1 -1
  187. package/dist/ui/CrmPipelineBoard.js +157 -94
  188. package/dist/ui/hooks/index.d.ts +3 -3
  189. package/dist/ui/hooks/index.d.ts.map +1 -0
  190. package/dist/ui/hooks/index.js +185 -4
  191. package/dist/ui/hooks/useDealList.d.ts +28 -32
  192. package/dist/ui/hooks/useDealList.d.ts.map +1 -1
  193. package/dist/ui/hooks/useDealList.js +81 -90
  194. package/dist/ui/hooks/useDealMutations.d.ts +18 -22
  195. package/dist/ui/hooks/useDealMutations.d.ts.map +1 -1
  196. package/dist/ui/hooks/useDealMutations.js +97 -155
  197. package/dist/ui/index.d.ts +8 -14
  198. package/dist/ui/index.d.ts.map +1 -0
  199. package/dist/ui/index.js +1973 -15
  200. package/dist/ui/modals/CreateDealModal.d.ts +19 -29
  201. package/dist/ui/modals/CreateDealModal.d.ts.map +1 -1
  202. package/dist/ui/modals/CreateDealModal.js +209 -180
  203. package/dist/ui/modals/DealActionsModal.d.ts +31 -44
  204. package/dist/ui/modals/DealActionsModal.d.ts.map +1 -1
  205. package/dist/ui/modals/DealActionsModal.js +424 -367
  206. package/dist/ui/modals/index.d.ts +3 -3
  207. package/dist/ui/modals/index.d.ts.map +1 -0
  208. package/dist/ui/modals/index.js +638 -3
  209. package/dist/ui/overlays/demo-overlays.d.ts +10 -8
  210. package/dist/ui/overlays/demo-overlays.d.ts.map +1 -1
  211. package/dist/ui/overlays/demo-overlays.js +54 -66
  212. package/dist/ui/overlays/index.d.ts +2 -2
  213. package/dist/ui/overlays/index.d.ts.map +1 -0
  214. package/dist/ui/overlays/index.js +56 -3
  215. package/dist/ui/renderers/index.d.ts +3 -3
  216. package/dist/ui/renderers/index.d.ts.map +1 -0
  217. package/dist/ui/renderers/index.js +827 -3
  218. package/dist/ui/renderers/pipeline.markdown.d.ts +12 -11
  219. package/dist/ui/renderers/pipeline.markdown.d.ts.map +1 -1
  220. package/dist/ui/renderers/pipeline.markdown.js +560 -114
  221. package/dist/ui/renderers/pipeline.renderer.d.ts +9 -7
  222. package/dist/ui/renderers/pipeline.renderer.d.ts.map +1 -1
  223. package/dist/ui/renderers/pipeline.renderer.js +261 -24
  224. package/package.json +476 -90
  225. package/tsdown.config.js +1 -2
  226. package/.turbo/turbo-build$colon$bundle.log +0 -164
  227. package/dist/crm-pipeline.feature.js.map +0 -1
  228. package/dist/deal/deal.enum.js.map +0 -1
  229. package/dist/deal/deal.operation.js.map +0 -1
  230. package/dist/deal/deal.schema.js.map +0 -1
  231. package/dist/deal/deal.test-spec.js.map +0 -1
  232. package/dist/docs/crm-pipeline.docblock.js.map +0 -1
  233. package/dist/entities/company.entity.js.map +0 -1
  234. package/dist/entities/contact.entity.js.map +0 -1
  235. package/dist/entities/deal.entity.js.map +0 -1
  236. package/dist/entities/index.js.map +0 -1
  237. package/dist/entities/task.entity.js.map +0 -1
  238. package/dist/events/contact.event.js.map +0 -1
  239. package/dist/events/deal.event.js.map +0 -1
  240. package/dist/events/task.event.js.map +0 -1
  241. package/dist/example.js.map +0 -1
  242. package/dist/handlers/crm.handlers.js.map +0 -1
  243. package/dist/handlers/deal.handlers.js.map +0 -1
  244. package/dist/handlers/mock-data.js.map +0 -1
  245. package/dist/index.js.map +0 -1
  246. package/dist/presentations/dashboard.presentation.js.map +0 -1
  247. package/dist/presentations/pipeline.presentation.js.map +0 -1
  248. package/dist/seeders/index.js.map +0 -1
  249. package/dist/ui/CrmDashboard.js.map +0 -1
  250. package/dist/ui/CrmDealCard.js.map +0 -1
  251. package/dist/ui/CrmPipelineBoard.js.map +0 -1
  252. package/dist/ui/hooks/useDealList.js.map +0 -1
  253. package/dist/ui/hooks/useDealMutations.js.map +0 -1
  254. package/dist/ui/modals/CreateDealModal.js.map +0 -1
  255. package/dist/ui/modals/DealActionsModal.js.map +0 -1
  256. package/dist/ui/overlays/demo-overlays.js.map +0 -1
  257. package/dist/ui/renderers/pipeline.markdown.js.map +0 -1
  258. package/dist/ui/renderers/pipeline.renderer.js.map +0 -1
  259. package/tsconfig.tsbuildinfo +0 -1
@@ -1,372 +1,429 @@
1
- 'use client';
2
-
1
+ // @bun
2
+ // src/ui/modals/DealActionsModal.tsx
3
3
  import { useState } from "react";
4
4
  import { Button } from "@contractspec/lib.design-system";
5
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
-
7
- //#region src/ui/modals/DealActionsModal.tsx
8
- /**
9
- * DealActionsModal - Actions for a specific deal (Win, Lose, Move)
10
- *
11
- * Wires to WinDealContract, LoseDealContract, MoveDealContract
12
- * via useDealMutations hook.
13
- */
5
+ import { jsxDEV, Fragment } from "react/jsx-dev-runtime";
6
+ "use client";
14
7
  function formatCurrency(value, currency) {
15
- return new Intl.NumberFormat("en-US", {
16
- style: "currency",
17
- currency,
18
- minimumFractionDigits: 0,
19
- maximumFractionDigits: 0
20
- }).format(value);
8
+ return new Intl.NumberFormat("en-US", {
9
+ style: "currency",
10
+ currency,
11
+ minimumFractionDigits: 0,
12
+ maximumFractionDigits: 0
13
+ }).format(value);
21
14
  }
22
- function DealActionsModal({ isOpen, deal, stages, onClose, onWin, onLose, onMove, isLoading = false }) {
23
- const [mode, setMode] = useState("menu");
24
- const [wonSource, setWonSource] = useState("");
25
- const [lostReason, setLostReason] = useState("");
26
- const [notes, setNotes] = useState("");
27
- const [selectedStageId, setSelectedStageId] = useState("");
28
- const [error, setError] = useState(null);
29
- const resetForm = () => {
30
- setMode("menu");
31
- setWonSource("");
32
- setLostReason("");
33
- setNotes("");
34
- setSelectedStageId("");
35
- setError(null);
36
- };
37
- const handleClose = () => {
38
- resetForm();
39
- onClose();
40
- };
41
- const handleWin = async () => {
42
- if (!deal) return;
43
- setError(null);
44
- try {
45
- await onWin({
46
- dealId: deal.id,
47
- wonSource: wonSource.trim() || void 0,
48
- notes: notes.trim() || void 0
49
- });
50
- handleClose();
51
- } catch (err) {
52
- setError(err instanceof Error ? err.message : "Failed to mark deal as won");
53
- }
54
- };
55
- const handleLose = async () => {
56
- if (!deal) return;
57
- setError(null);
58
- if (!lostReason.trim()) {
59
- setError("Please provide a reason for losing the deal");
60
- return;
61
- }
62
- try {
63
- await onLose({
64
- dealId: deal.id,
65
- lostReason: lostReason.trim(),
66
- notes: notes.trim() || void 0
67
- });
68
- handleClose();
69
- } catch (err) {
70
- setError(err instanceof Error ? err.message : "Failed to mark deal as lost");
71
- }
72
- };
73
- const handleMove = async () => {
74
- if (!deal) return;
75
- setError(null);
76
- if (!selectedStageId) {
77
- setError("Please select a stage");
78
- return;
79
- }
80
- if (selectedStageId === deal.stageId) {
81
- setError("Deal is already in this stage");
82
- return;
83
- }
84
- try {
85
- await onMove({
86
- dealId: deal.id,
87
- stageId: selectedStageId
88
- });
89
- handleClose();
90
- } catch (err) {
91
- setError(err instanceof Error ? err.message : "Failed to move deal");
92
- }
93
- };
94
- if (!isOpen || !deal) return null;
95
- return /* @__PURE__ */ jsxs("div", {
96
- className: "fixed inset-0 z-50 flex items-center justify-center",
97
- children: [/* @__PURE__ */ jsx("div", {
98
- className: "bg-background/80 absolute inset-0 backdrop-blur-sm",
99
- onClick: handleClose,
100
- role: "button",
101
- tabIndex: 0,
102
- onKeyDown: (e) => {
103
- if (e.key === "Enter" || e.key === " ") handleClose();
104
- },
105
- "aria-label": "Close modal"
106
- }), /* @__PURE__ */ jsxs("div", {
107
- className: "bg-card border-border relative z-10 w-full max-w-md rounded-xl border p-6 shadow-xl",
108
- children: [
109
- /* @__PURE__ */ jsxs("div", {
110
- className: "border-border mb-4 border-b pb-4",
111
- children: [
112
- /* @__PURE__ */ jsx("h2", {
113
- className: "text-xl font-semibold",
114
- children: deal.name
115
- }),
116
- /* @__PURE__ */ jsx("p", {
117
- className: "text-primary text-lg font-medium",
118
- children: formatCurrency(deal.value, deal.currency)
119
- }),
120
- /* @__PURE__ */ jsx("span", {
121
- className: `mt-2 inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${deal.status === "WON" ? "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400" : deal.status === "LOST" ? "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400" : "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"}`,
122
- children: deal.status
123
- })
124
- ]
125
- }),
126
- mode === "menu" && /* @__PURE__ */ jsxs("div", {
127
- className: "space-y-3",
128
- children: [
129
- deal.status === "OPEN" && /* @__PURE__ */ jsxs(Fragment, { children: [
130
- /* @__PURE__ */ jsxs(Button, {
131
- className: "w-full justify-start",
132
- variant: "ghost",
133
- onPress: () => setMode("win"),
134
- children: [/* @__PURE__ */ jsx("span", {
135
- className: "mr-2",
136
- children: "🏆"
137
- }), " Mark as Won"]
138
- }),
139
- /* @__PURE__ */ jsxs(Button, {
140
- className: "w-full justify-start",
141
- variant: "ghost",
142
- onPress: () => setMode("lose"),
143
- children: [/* @__PURE__ */ jsx("span", {
144
- className: "mr-2",
145
- children: ""
146
- }), " Mark as Lost"]
147
- }),
148
- /* @__PURE__ */ jsxs(Button, {
149
- className: "w-full justify-start",
150
- variant: "ghost",
151
- onPress: () => {
152
- setSelectedStageId(deal.stageId);
153
- setMode("move");
154
- },
155
- children: [/* @__PURE__ */ jsx("span", {
156
- className: "mr-2",
157
- children: "➡️"
158
- }), " Move to Stage"]
159
- })
160
- ] }),
161
- deal.status !== "OPEN" && /* @__PURE__ */ jsxs("p", {
162
- className: "text-muted-foreground py-4 text-center",
163
- children: [
164
- "This deal is already ",
165
- deal.status.toLowerCase(),
166
- ". No actions available."
167
- ]
168
- }),
169
- /* @__PURE__ */ jsx("div", {
170
- className: "border-border border-t pt-3",
171
- children: /* @__PURE__ */ jsx(Button, {
172
- className: "w-full",
173
- variant: "outline",
174
- onPress: handleClose,
175
- children: "Close"
176
- })
177
- })
178
- ]
179
- }),
180
- mode === "win" && /* @__PURE__ */ jsxs("div", {
181
- className: "space-y-4",
182
- children: [
183
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("label", {
184
- htmlFor: "won-source",
185
- className: "text-muted-foreground mb-1 block text-sm font-medium",
186
- children: "How did you win this deal?"
187
- }), /* @__PURE__ */ jsxs("select", {
188
- id: "won-source",
189
- value: wonSource,
190
- onChange: (e) => setWonSource(e.target.value),
191
- className: "border-input bg-background focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none",
192
- children: [
193
- /* @__PURE__ */ jsx("option", {
194
- value: "",
195
- children: "Select a source..."
196
- }),
197
- /* @__PURE__ */ jsx("option", {
198
- value: "referral",
199
- children: "Referral"
200
- }),
201
- /* @__PURE__ */ jsx("option", {
202
- value: "cold_outreach",
203
- children: "Cold Outreach"
204
- }),
205
- /* @__PURE__ */ jsx("option", {
206
- value: "inbound",
207
- children: "Inbound Lead"
208
- }),
209
- /* @__PURE__ */ jsx("option", {
210
- value: "upsell",
211
- children: "Upsell"
212
- }),
213
- /* @__PURE__ */ jsx("option", {
214
- value: "other",
215
- children: "Other"
216
- })
217
- ]
218
- })] }),
219
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("label", {
220
- htmlFor: "win-notes",
221
- className: "text-muted-foreground mb-1 block text-sm font-medium",
222
- children: "Notes (optional)"
223
- }), /* @__PURE__ */ jsx("textarea", {
224
- id: "win-notes",
225
- value: notes,
226
- onChange: (e) => setNotes(e.target.value),
227
- placeholder: "Any additional notes about the win...",
228
- rows: 3,
229
- 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"
230
- })] }),
231
- error && /* @__PURE__ */ jsx("div", {
232
- className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
233
- children: error
234
- }),
235
- /* @__PURE__ */ jsxs("div", {
236
- className: "flex justify-end gap-3 pt-2",
237
- children: [/* @__PURE__ */ jsx(Button, {
238
- variant: "ghost",
239
- onPress: () => setMode("menu"),
240
- disabled: isLoading,
241
- children: "Back"
242
- }), /* @__PURE__ */ jsx(Button, {
243
- onPress: handleWin,
244
- disabled: isLoading,
245
- children: isLoading ? "Processing..." : "🏆 Confirm Win"
246
- })]
247
- })
248
- ]
249
- }),
250
- mode === "lose" && /* @__PURE__ */ jsxs("div", {
251
- className: "space-y-4",
252
- children: [
253
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("label", {
254
- htmlFor: "lost-reason",
255
- className: "text-muted-foreground mb-1 block text-sm font-medium",
256
- children: "Why was this deal lost? *"
257
- }), /* @__PURE__ */ jsxs("select", {
258
- id: "lost-reason",
259
- value: lostReason,
260
- onChange: (e) => setLostReason(e.target.value),
261
- className: "border-input bg-background focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none",
262
- children: [
263
- /* @__PURE__ */ jsx("option", {
264
- value: "",
265
- children: "Select a reason..."
266
- }),
267
- /* @__PURE__ */ jsx("option", {
268
- value: "price",
269
- children: "Price too high"
270
- }),
271
- /* @__PURE__ */ jsx("option", {
272
- value: "competitor",
273
- children: "Lost to competitor"
274
- }),
275
- /* @__PURE__ */ jsx("option", {
276
- value: "no_budget",
277
- children: "No budget"
278
- }),
279
- /* @__PURE__ */ jsx("option", {
280
- value: "no_decision",
281
- children: "No decision made"
282
- }),
283
- /* @__PURE__ */ jsx("option", {
284
- value: "timing",
285
- children: "Bad timing"
286
- }),
287
- /* @__PURE__ */ jsx("option", {
288
- value: "product_fit",
289
- children: "Product not a fit"
290
- }),
291
- /* @__PURE__ */ jsx("option", {
292
- value: "other",
293
- children: "Other"
294
- })
295
- ]
296
- })] }),
297
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("label", {
298
- htmlFor: "lose-notes",
299
- className: "text-muted-foreground mb-1 block text-sm font-medium",
300
- children: "Notes (optional)"
301
- }), /* @__PURE__ */ jsx("textarea", {
302
- id: "lose-notes",
303
- value: notes,
304
- onChange: (e) => setNotes(e.target.value),
305
- placeholder: "Any additional details...",
306
- rows: 3,
307
- 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"
308
- })] }),
309
- error && /* @__PURE__ */ jsx("div", {
310
- className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
311
- children: error
312
- }),
313
- /* @__PURE__ */ jsxs("div", {
314
- className: "flex justify-end gap-3 pt-2",
315
- children: [/* @__PURE__ */ jsx(Button, {
316
- variant: "ghost",
317
- onPress: () => setMode("menu"),
318
- disabled: isLoading,
319
- children: "Back"
320
- }), /* @__PURE__ */ jsx(Button, {
321
- variant: "destructive",
322
- onPress: handleLose,
323
- disabled: isLoading,
324
- children: isLoading ? "Processing..." : "❌ Confirm Loss"
325
- })]
326
- })
327
- ]
328
- }),
329
- mode === "move" && /* @__PURE__ */ jsxs("div", {
330
- className: "space-y-4",
331
- children: [
332
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("label", {
333
- htmlFor: "move-stage",
334
- className: "text-muted-foreground mb-1 block text-sm font-medium",
335
- children: "Move to Stage"
336
- }), /* @__PURE__ */ jsx("select", {
337
- id: "move-stage",
338
- value: selectedStageId,
339
- onChange: (e) => setSelectedStageId(e.target.value),
340
- className: "border-input bg-background focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none",
341
- children: stages.map((stage) => /* @__PURE__ */ jsxs("option", {
342
- value: stage.id,
343
- children: [stage.name, stage.id === deal.stageId ? " (current)" : ""]
344
- }, stage.id))
345
- })] }),
346
- error && /* @__PURE__ */ jsx("div", {
347
- className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
348
- children: error
349
- }),
350
- /* @__PURE__ */ jsxs("div", {
351
- className: "flex justify-end gap-3 pt-2",
352
- children: [/* @__PURE__ */ jsx(Button, {
353
- variant: "ghost",
354
- onPress: () => setMode("menu"),
355
- disabled: isLoading,
356
- children: "Back"
357
- }), /* @__PURE__ */ jsx(Button, {
358
- onPress: handleMove,
359
- disabled: isLoading,
360
- children: isLoading ? "Moving..." : "➡️ Move Deal"
361
- })]
362
- })
363
- ]
364
- })
365
- ]
366
- })]
367
- });
15
+ function DealActionsModal({
16
+ isOpen,
17
+ deal,
18
+ stages,
19
+ onClose,
20
+ onWin,
21
+ onLose,
22
+ onMove,
23
+ isLoading = false
24
+ }) {
25
+ const [mode, setMode] = useState("menu");
26
+ const [wonSource, setWonSource] = useState("");
27
+ const [lostReason, setLostReason] = useState("");
28
+ const [notes, setNotes] = useState("");
29
+ const [selectedStageId, setSelectedStageId] = useState("");
30
+ const [error, setError] = useState(null);
31
+ const resetForm = () => {
32
+ setMode("menu");
33
+ setWonSource("");
34
+ setLostReason("");
35
+ setNotes("");
36
+ setSelectedStageId("");
37
+ setError(null);
38
+ };
39
+ const handleClose = () => {
40
+ resetForm();
41
+ onClose();
42
+ };
43
+ const handleWin = async () => {
44
+ if (!deal)
45
+ return;
46
+ setError(null);
47
+ try {
48
+ await onWin({
49
+ dealId: deal.id,
50
+ wonSource: wonSource.trim() || undefined,
51
+ notes: notes.trim() || undefined
52
+ });
53
+ handleClose();
54
+ } catch (err) {
55
+ setError(err instanceof Error ? err.message : "Failed to mark deal as won");
56
+ }
57
+ };
58
+ const handleLose = async () => {
59
+ if (!deal)
60
+ return;
61
+ setError(null);
62
+ if (!lostReason.trim()) {
63
+ setError("Please provide a reason for losing the deal");
64
+ return;
65
+ }
66
+ try {
67
+ await onLose({
68
+ dealId: deal.id,
69
+ lostReason: lostReason.trim(),
70
+ notes: notes.trim() || undefined
71
+ });
72
+ handleClose();
73
+ } catch (err) {
74
+ setError(err instanceof Error ? err.message : "Failed to mark deal as lost");
75
+ }
76
+ };
77
+ const handleMove = async () => {
78
+ if (!deal)
79
+ return;
80
+ setError(null);
81
+ if (!selectedStageId) {
82
+ setError("Please select a stage");
83
+ return;
84
+ }
85
+ if (selectedStageId === deal.stageId) {
86
+ setError("Deal is already in this stage");
87
+ return;
88
+ }
89
+ try {
90
+ await onMove({
91
+ dealId: deal.id,
92
+ stageId: selectedStageId
93
+ });
94
+ handleClose();
95
+ } catch (err) {
96
+ setError(err instanceof Error ? err.message : "Failed to move deal");
97
+ }
98
+ };
99
+ if (!isOpen || !deal)
100
+ return null;
101
+ return /* @__PURE__ */ jsxDEV("div", {
102
+ className: "fixed inset-0 z-50 flex items-center justify-center",
103
+ children: [
104
+ /* @__PURE__ */ jsxDEV("div", {
105
+ className: "bg-background/80 absolute inset-0 backdrop-blur-sm",
106
+ onClick: handleClose,
107
+ role: "button",
108
+ tabIndex: 0,
109
+ onKeyDown: (e) => {
110
+ if (e.key === "Enter" || e.key === " ")
111
+ handleClose();
112
+ },
113
+ "aria-label": "Close modal"
114
+ }, undefined, false, undefined, this),
115
+ /* @__PURE__ */ jsxDEV("div", {
116
+ className: "bg-card border-border relative z-10 w-full max-w-md rounded-xl border p-6 shadow-xl",
117
+ children: [
118
+ /* @__PURE__ */ jsxDEV("div", {
119
+ className: "border-border mb-4 border-b pb-4",
120
+ children: [
121
+ /* @__PURE__ */ jsxDEV("h2", {
122
+ className: "text-xl font-semibold",
123
+ children: deal.name
124
+ }, undefined, false, undefined, this),
125
+ /* @__PURE__ */ jsxDEV("p", {
126
+ className: "text-primary text-lg font-medium",
127
+ children: formatCurrency(deal.value, deal.currency)
128
+ }, undefined, false, undefined, this),
129
+ /* @__PURE__ */ jsxDEV("span", {
130
+ className: `mt-2 inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${deal.status === "WON" ? "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400" : deal.status === "LOST" ? "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400" : "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"}`,
131
+ children: deal.status
132
+ }, undefined, false, undefined, this)
133
+ ]
134
+ }, undefined, true, undefined, this),
135
+ mode === "menu" && /* @__PURE__ */ jsxDEV("div", {
136
+ className: "space-y-3",
137
+ children: [
138
+ deal.status === "OPEN" && /* @__PURE__ */ jsxDEV(Fragment, {
139
+ children: [
140
+ /* @__PURE__ */ jsxDEV(Button, {
141
+ className: "w-full justify-start",
142
+ variant: "ghost",
143
+ onPress: () => setMode("win"),
144
+ children: [
145
+ /* @__PURE__ */ jsxDEV("span", {
146
+ className: "mr-2",
147
+ children: "\uD83C\uDFC6"
148
+ }, undefined, false, undefined, this),
149
+ " Mark as Won"
150
+ ]
151
+ }, undefined, true, undefined, this),
152
+ /* @__PURE__ */ jsxDEV(Button, {
153
+ className: "w-full justify-start",
154
+ variant: "ghost",
155
+ onPress: () => setMode("lose"),
156
+ children: [
157
+ /* @__PURE__ */ jsxDEV("span", {
158
+ className: "mr-2",
159
+ children: "\u274C"
160
+ }, undefined, false, undefined, this),
161
+ " Mark as Lost"
162
+ ]
163
+ }, undefined, true, undefined, this),
164
+ /* @__PURE__ */ jsxDEV(Button, {
165
+ className: "w-full justify-start",
166
+ variant: "ghost",
167
+ onPress: () => {
168
+ setSelectedStageId(deal.stageId);
169
+ setMode("move");
170
+ },
171
+ children: [
172
+ /* @__PURE__ */ jsxDEV("span", {
173
+ className: "mr-2",
174
+ children: "\u27A1\uFE0F"
175
+ }, undefined, false, undefined, this),
176
+ " Move to Stage"
177
+ ]
178
+ }, undefined, true, undefined, this)
179
+ ]
180
+ }, undefined, true, undefined, this),
181
+ deal.status !== "OPEN" && /* @__PURE__ */ jsxDEV("p", {
182
+ className: "text-muted-foreground py-4 text-center",
183
+ children: [
184
+ "This deal is already ",
185
+ deal.status.toLowerCase(),
186
+ ". No actions available."
187
+ ]
188
+ }, undefined, true, undefined, this),
189
+ /* @__PURE__ */ jsxDEV("div", {
190
+ className: "border-border border-t pt-3",
191
+ children: /* @__PURE__ */ jsxDEV(Button, {
192
+ className: "w-full",
193
+ variant: "outline",
194
+ onPress: handleClose,
195
+ children: "Close"
196
+ }, undefined, false, undefined, this)
197
+ }, undefined, false, undefined, this)
198
+ ]
199
+ }, undefined, true, undefined, this),
200
+ mode === "win" && /* @__PURE__ */ jsxDEV("div", {
201
+ className: "space-y-4",
202
+ children: [
203
+ /* @__PURE__ */ jsxDEV("div", {
204
+ children: [
205
+ /* @__PURE__ */ jsxDEV("label", {
206
+ htmlFor: "won-source",
207
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
208
+ children: "How did you win this deal?"
209
+ }, undefined, false, undefined, this),
210
+ /* @__PURE__ */ jsxDEV("select", {
211
+ id: "won-source",
212
+ value: wonSource,
213
+ onChange: (e) => setWonSource(e.target.value),
214
+ className: "border-input bg-background focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none",
215
+ children: [
216
+ /* @__PURE__ */ jsxDEV("option", {
217
+ value: "",
218
+ children: "Select a source..."
219
+ }, undefined, false, undefined, this),
220
+ /* @__PURE__ */ jsxDEV("option", {
221
+ value: "referral",
222
+ children: "Referral"
223
+ }, undefined, false, undefined, this),
224
+ /* @__PURE__ */ jsxDEV("option", {
225
+ value: "cold_outreach",
226
+ children: "Cold Outreach"
227
+ }, undefined, false, undefined, this),
228
+ /* @__PURE__ */ jsxDEV("option", {
229
+ value: "inbound",
230
+ children: "Inbound Lead"
231
+ }, undefined, false, undefined, this),
232
+ /* @__PURE__ */ jsxDEV("option", {
233
+ value: "upsell",
234
+ children: "Upsell"
235
+ }, undefined, false, undefined, this),
236
+ /* @__PURE__ */ jsxDEV("option", {
237
+ value: "other",
238
+ children: "Other"
239
+ }, undefined, false, undefined, this)
240
+ ]
241
+ }, undefined, true, undefined, this)
242
+ ]
243
+ }, undefined, true, undefined, this),
244
+ /* @__PURE__ */ jsxDEV("div", {
245
+ children: [
246
+ /* @__PURE__ */ jsxDEV("label", {
247
+ htmlFor: "win-notes",
248
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
249
+ children: "Notes (optional)"
250
+ }, undefined, false, undefined, this),
251
+ /* @__PURE__ */ jsxDEV("textarea", {
252
+ id: "win-notes",
253
+ value: notes,
254
+ onChange: (e) => setNotes(e.target.value),
255
+ placeholder: "Any additional notes about the win...",
256
+ rows: 3,
257
+ 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"
258
+ }, undefined, false, undefined, this)
259
+ ]
260
+ }, undefined, true, undefined, this),
261
+ error && /* @__PURE__ */ jsxDEV("div", {
262
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
263
+ children: error
264
+ }, undefined, false, undefined, this),
265
+ /* @__PURE__ */ jsxDEV("div", {
266
+ className: "flex justify-end gap-3 pt-2",
267
+ children: [
268
+ /* @__PURE__ */ jsxDEV(Button, {
269
+ variant: "ghost",
270
+ onPress: () => setMode("menu"),
271
+ disabled: isLoading,
272
+ children: "Back"
273
+ }, undefined, false, undefined, this),
274
+ /* @__PURE__ */ jsxDEV(Button, {
275
+ onPress: handleWin,
276
+ disabled: isLoading,
277
+ children: isLoading ? "Processing..." : "\uD83C\uDFC6 Confirm Win"
278
+ }, undefined, false, undefined, this)
279
+ ]
280
+ }, undefined, true, undefined, this)
281
+ ]
282
+ }, undefined, true, undefined, this),
283
+ mode === "lose" && /* @__PURE__ */ jsxDEV("div", {
284
+ className: "space-y-4",
285
+ children: [
286
+ /* @__PURE__ */ jsxDEV("div", {
287
+ children: [
288
+ /* @__PURE__ */ jsxDEV("label", {
289
+ htmlFor: "lost-reason",
290
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
291
+ children: "Why was this deal lost? *"
292
+ }, undefined, false, undefined, this),
293
+ /* @__PURE__ */ jsxDEV("select", {
294
+ id: "lost-reason",
295
+ value: lostReason,
296
+ onChange: (e) => setLostReason(e.target.value),
297
+ className: "border-input bg-background focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none",
298
+ children: [
299
+ /* @__PURE__ */ jsxDEV("option", {
300
+ value: "",
301
+ children: "Select a reason..."
302
+ }, undefined, false, undefined, this),
303
+ /* @__PURE__ */ jsxDEV("option", {
304
+ value: "price",
305
+ children: "Price too high"
306
+ }, undefined, false, undefined, this),
307
+ /* @__PURE__ */ jsxDEV("option", {
308
+ value: "competitor",
309
+ children: "Lost to competitor"
310
+ }, undefined, false, undefined, this),
311
+ /* @__PURE__ */ jsxDEV("option", {
312
+ value: "no_budget",
313
+ children: "No budget"
314
+ }, undefined, false, undefined, this),
315
+ /* @__PURE__ */ jsxDEV("option", {
316
+ value: "no_decision",
317
+ children: "No decision made"
318
+ }, undefined, false, undefined, this),
319
+ /* @__PURE__ */ jsxDEV("option", {
320
+ value: "timing",
321
+ children: "Bad timing"
322
+ }, undefined, false, undefined, this),
323
+ /* @__PURE__ */ jsxDEV("option", {
324
+ value: "product_fit",
325
+ children: "Product not a fit"
326
+ }, undefined, false, undefined, this),
327
+ /* @__PURE__ */ jsxDEV("option", {
328
+ value: "other",
329
+ children: "Other"
330
+ }, undefined, false, undefined, this)
331
+ ]
332
+ }, undefined, true, undefined, this)
333
+ ]
334
+ }, undefined, true, undefined, this),
335
+ /* @__PURE__ */ jsxDEV("div", {
336
+ children: [
337
+ /* @__PURE__ */ jsxDEV("label", {
338
+ htmlFor: "lose-notes",
339
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
340
+ children: "Notes (optional)"
341
+ }, undefined, false, undefined, this),
342
+ /* @__PURE__ */ jsxDEV("textarea", {
343
+ id: "lose-notes",
344
+ value: notes,
345
+ onChange: (e) => setNotes(e.target.value),
346
+ placeholder: "Any additional details...",
347
+ rows: 3,
348
+ 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"
349
+ }, undefined, false, undefined, this)
350
+ ]
351
+ }, undefined, true, undefined, this),
352
+ error && /* @__PURE__ */ jsxDEV("div", {
353
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
354
+ children: error
355
+ }, undefined, false, undefined, this),
356
+ /* @__PURE__ */ jsxDEV("div", {
357
+ className: "flex justify-end gap-3 pt-2",
358
+ children: [
359
+ /* @__PURE__ */ jsxDEV(Button, {
360
+ variant: "ghost",
361
+ onPress: () => setMode("menu"),
362
+ disabled: isLoading,
363
+ children: "Back"
364
+ }, undefined, false, undefined, this),
365
+ /* @__PURE__ */ jsxDEV(Button, {
366
+ variant: "destructive",
367
+ onPress: handleLose,
368
+ disabled: isLoading,
369
+ children: isLoading ? "Processing..." : "\u274C Confirm Loss"
370
+ }, undefined, false, undefined, this)
371
+ ]
372
+ }, undefined, true, undefined, this)
373
+ ]
374
+ }, undefined, true, undefined, this),
375
+ mode === "move" && /* @__PURE__ */ jsxDEV("div", {
376
+ className: "space-y-4",
377
+ children: [
378
+ /* @__PURE__ */ jsxDEV("div", {
379
+ children: [
380
+ /* @__PURE__ */ jsxDEV("label", {
381
+ htmlFor: "move-stage",
382
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
383
+ children: "Move to Stage"
384
+ }, undefined, false, undefined, this),
385
+ /* @__PURE__ */ jsxDEV("select", {
386
+ id: "move-stage",
387
+ value: selectedStageId,
388
+ onChange: (e) => setSelectedStageId(e.target.value),
389
+ className: "border-input bg-background focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none",
390
+ children: stages.map((stage) => /* @__PURE__ */ jsxDEV("option", {
391
+ value: stage.id,
392
+ children: [
393
+ stage.name,
394
+ stage.id === deal.stageId ? " (current)" : ""
395
+ ]
396
+ }, stage.id, true, undefined, this))
397
+ }, undefined, false, undefined, this)
398
+ ]
399
+ }, undefined, true, undefined, this),
400
+ error && /* @__PURE__ */ jsxDEV("div", {
401
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
402
+ children: error
403
+ }, undefined, false, undefined, this),
404
+ /* @__PURE__ */ jsxDEV("div", {
405
+ className: "flex justify-end gap-3 pt-2",
406
+ children: [
407
+ /* @__PURE__ */ jsxDEV(Button, {
408
+ variant: "ghost",
409
+ onPress: () => setMode("menu"),
410
+ disabled: isLoading,
411
+ children: "Back"
412
+ }, undefined, false, undefined, this),
413
+ /* @__PURE__ */ jsxDEV(Button, {
414
+ onPress: handleMove,
415
+ disabled: isLoading,
416
+ children: isLoading ? "Moving..." : "\u27A1\uFE0F Move Deal"
417
+ }, undefined, false, undefined, this)
418
+ ]
419
+ }, undefined, true, undefined, this)
420
+ ]
421
+ }, undefined, true, undefined, this)
422
+ ]
423
+ }, undefined, true, undefined, this)
424
+ ]
425
+ }, undefined, true, undefined, this);
368
426
  }
369
-
370
- //#endregion
371
- export { DealActionsModal };
372
- //# sourceMappingURL=DealActionsModal.js.map
427
+ export {
428
+ DealActionsModal
429
+ };