@contractspec/example.crm-pipeline 1.57.0 → 1.59.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 +39 -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,35 +1,31 @@
1
- import { Deal as Deal$1, ListDealsOutput as ListDealsOutput$1, Stage } from "../../handlers/crm.handlers.js";
2
-
3
- //#region src/ui/hooks/useDealList.d.ts
4
- type Deal = Deal$1;
5
- type ListDealsOutput = ListDealsOutput$1;
6
- interface UseDealListOptions {
7
- pipelineId?: string;
8
- stageId?: string;
9
- status?: 'OPEN' | 'WON' | 'LOST' | 'all';
10
- search?: string;
11
- limit?: number;
1
+ import { type Deal as RuntimeDeal, type ListDealsOutput as RuntimeListDealsOutput, type Stage } from '../../handlers/crm.handlers';
2
+ export type Deal = RuntimeDeal;
3
+ export type ListDealsOutput = RuntimeListDealsOutput;
4
+ export interface UseDealListOptions {
5
+ pipelineId?: string;
6
+ stageId?: string;
7
+ status?: 'OPEN' | 'WON' | 'LOST' | 'all';
8
+ search?: string;
9
+ limit?: number;
12
10
  }
13
- declare function useDealList(options?: UseDealListOptions): {
14
- data: ListDealsOutput$1 | null;
15
- dealsByStage: Record<string, Deal$1[]>;
16
- stages: Stage[];
17
- loading: boolean;
18
- error: Error | null;
19
- stats: {
20
- total: number;
21
- totalValue: number;
22
- openCount: number;
23
- openValue: number;
24
- wonCount: number;
25
- wonValue: number;
26
- lostCount: number;
27
- } | null;
28
- page: number;
29
- refetch: () => Promise<void>;
30
- nextPage: () => void;
31
- prevPage: () => false | void;
11
+ export declare function useDealList(options?: UseDealListOptions): {
12
+ data: RuntimeListDealsOutput | null;
13
+ dealsByStage: Record<string, RuntimeDeal[]>;
14
+ stages: Stage[];
15
+ loading: boolean;
16
+ error: Error | null;
17
+ stats: {
18
+ total: number;
19
+ totalValue: number;
20
+ openCount: number;
21
+ openValue: number;
22
+ wonCount: number;
23
+ wonValue: number;
24
+ lostCount: number;
25
+ } | null;
26
+ page: number;
27
+ refetch: () => Promise<void>;
28
+ nextPage: () => void;
29
+ prevPage: () => false | void;
32
30
  };
33
- //#endregion
34
- export { Deal, ListDealsOutput, UseDealListOptions, useDealList };
35
31
  //# sourceMappingURL=useDealList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDealList.d.ts","names":[],"sources":["../../../src/ui/hooks/useDealList.ts"],"mappings":";;;KAiBY,IAAA,GAAO,MAAA;AAAA,KACP,eAAA,GAAkB,iBAAA;AAAA,UAEb,kBAAA;EACf,UAAA;EACA,OAAA;EACA,MAAA;EACA,MAAA;EACA,KAAA;AAAA;AAAA,iBAGc,WAAA,CAAY,OAAA,GAAS,kBAAA"}
1
+ {"version":3,"file":"useDealList.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useDealList.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,IAAI,IAAI,WAAW,EACxB,KAAK,eAAe,IAAI,sBAAsB,EAC9C,KAAK,KAAK,EACX,MAAM,6BAA6B,CAAC;AAGrC,MAAM,MAAM,IAAI,GAAG,WAAW,CAAC;AAC/B,MAAM,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB;;;;;;;;;;;;;;;;;;;EAoF3D"}
@@ -1,94 +1,85 @@
1
- 'use client';
2
-
3
- import "../../handlers/crm.handlers.js";
1
+ // @bun
2
+ // src/ui/hooks/useDealList.ts
4
3
  import { useCallback, useEffect, useMemo, useState } from "react";
5
4
  import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
6
-
7
- //#region src/ui/hooks/useDealList.ts
8
- /**
9
- * Hook for fetching and managing deal list data
10
- *
11
- * Uses runtime-local database-backed handlers.
12
- */
5
+ "use client";
13
6
  function useDealList(options = {}) {
14
- const { handlers, projectId } = useTemplateRuntime();
15
- const { crm } = handlers;
16
- const [data, setData] = useState(null);
17
- const [dealsByStage, setDealsByStage] = useState({});
18
- const [stages, setStages] = useState([]);
19
- const [loading, setLoading] = useState(true);
20
- const [error, setError] = useState(null);
21
- const [page, setPage] = useState(1);
22
- const pipelineId = options.pipelineId ?? "pipeline-1";
23
- const fetchData = useCallback(async () => {
24
- setLoading(true);
25
- setError(null);
26
- try {
27
- const [dealsResult, stageDealsResult, stagesResult] = await Promise.all([
28
- crm.listDeals({
29
- projectId,
30
- pipelineId,
31
- stageId: options.stageId,
32
- status: options.status === "all" ? void 0 : options.status,
33
- search: options.search,
34
- limit: options.limit ?? 50,
35
- offset: (page - 1) * (options.limit ?? 50)
36
- }),
37
- crm.getDealsByStage({
38
- projectId,
39
- pipelineId
40
- }),
41
- crm.getPipelineStages({ pipelineId })
42
- ]);
43
- setData(dealsResult);
44
- setDealsByStage(stageDealsResult);
45
- setStages(stagesResult);
46
- } catch (err) {
47
- setError(err instanceof Error ? err : /* @__PURE__ */ new Error("Unknown error"));
48
- } finally {
49
- setLoading(false);
50
- }
51
- }, [
52
- crm,
53
- projectId,
54
- pipelineId,
55
- options.stageId,
56
- options.status,
57
- options.search,
58
- options.limit,
59
- page
60
- ]);
61
- useEffect(() => {
62
- fetchData();
63
- }, [fetchData]);
64
- return {
65
- data,
66
- dealsByStage,
67
- stages,
68
- loading,
69
- error,
70
- stats: useMemo(() => {
71
- if (!data) return null;
72
- const open = data.deals.filter((d) => d.status === "OPEN");
73
- const won = data.deals.filter((d) => d.status === "WON");
74
- const lost = data.deals.filter((d) => d.status === "LOST");
75
- return {
76
- total: data.total,
77
- totalValue: data.totalValue,
78
- openCount: open.length,
79
- openValue: open.reduce((sum, d) => sum + d.value, 0),
80
- wonCount: won.length,
81
- wonValue: won.reduce((sum, d) => sum + d.value, 0),
82
- lostCount: lost.length
83
- };
84
- }, [data]),
85
- page,
86
- refetch: fetchData,
87
- nextPage: () => setPage((p) => p + 1),
88
- prevPage: () => page > 1 && setPage((p) => p - 1)
89
- };
7
+ const { handlers, projectId } = useTemplateRuntime();
8
+ const { crm } = handlers;
9
+ const [data, setData] = useState(null);
10
+ const [dealsByStage, setDealsByStage] = useState({});
11
+ const [stages, setStages] = useState([]);
12
+ const [loading, setLoading] = useState(true);
13
+ const [error, setError] = useState(null);
14
+ const [page, setPage] = useState(1);
15
+ const pipelineId = options.pipelineId ?? "pipeline-1";
16
+ const fetchData = useCallback(async () => {
17
+ setLoading(true);
18
+ setError(null);
19
+ try {
20
+ const [dealsResult, stageDealsResult, stagesResult] = await Promise.all([
21
+ crm.listDeals({
22
+ projectId,
23
+ pipelineId,
24
+ stageId: options.stageId,
25
+ status: options.status === "all" ? undefined : options.status,
26
+ search: options.search,
27
+ limit: options.limit ?? 50,
28
+ offset: (page - 1) * (options.limit ?? 50)
29
+ }),
30
+ crm.getDealsByStage({ projectId, pipelineId }),
31
+ crm.getPipelineStages({ pipelineId })
32
+ ]);
33
+ setData(dealsResult);
34
+ setDealsByStage(stageDealsResult);
35
+ setStages(stagesResult);
36
+ } catch (err) {
37
+ setError(err instanceof Error ? err : new Error("Unknown error"));
38
+ } finally {
39
+ setLoading(false);
40
+ }
41
+ }, [
42
+ crm,
43
+ projectId,
44
+ pipelineId,
45
+ options.stageId,
46
+ options.status,
47
+ options.search,
48
+ options.limit,
49
+ page
50
+ ]);
51
+ useEffect(() => {
52
+ fetchData();
53
+ }, [fetchData]);
54
+ const stats = useMemo(() => {
55
+ if (!data)
56
+ return null;
57
+ const open = data.deals.filter((d) => d.status === "OPEN");
58
+ const won = data.deals.filter((d) => d.status === "WON");
59
+ const lost = data.deals.filter((d) => d.status === "LOST");
60
+ return {
61
+ total: data.total,
62
+ totalValue: data.totalValue,
63
+ openCount: open.length,
64
+ openValue: open.reduce((sum, d) => sum + d.value, 0),
65
+ wonCount: won.length,
66
+ wonValue: won.reduce((sum, d) => sum + d.value, 0),
67
+ lostCount: lost.length
68
+ };
69
+ }, [data]);
70
+ return {
71
+ data,
72
+ dealsByStage,
73
+ stages,
74
+ loading,
75
+ error,
76
+ stats,
77
+ page,
78
+ refetch: fetchData,
79
+ nextPage: () => setPage((p) => p + 1),
80
+ prevPage: () => page > 1 && setPage((p) => p - 1)
81
+ };
90
82
  }
91
-
92
- //#endregion
93
- export { useDealList };
94
- //# sourceMappingURL=useDealList.js.map
83
+ export {
84
+ useDealList
85
+ };
@@ -1,26 +1,22 @@
1
- import { CreateDealInput, Deal, LoseDealInput, MoveDealInput, WinDealInput } from "../../handlers/crm.handlers.js";
2
-
3
- //#region src/ui/hooks/useDealMutations.d.ts
4
- interface MutationState<T> {
5
- loading: boolean;
6
- error: Error | null;
7
- data: T | null;
1
+ import type { CreateDealInput, Deal, LoseDealInput, MoveDealInput, WinDealInput } from '../../handlers/crm.handlers';
2
+ export interface MutationState<T> {
3
+ loading: boolean;
4
+ error: Error | null;
5
+ data: T | null;
8
6
  }
9
- interface UseDealMutationsOptions {
10
- onSuccess?: () => void;
11
- onError?: (error: Error) => void;
7
+ export interface UseDealMutationsOptions {
8
+ onSuccess?: () => void;
9
+ onError?: (error: Error) => void;
12
10
  }
13
- declare function useDealMutations(options?: UseDealMutationsOptions): {
14
- createDeal: (input: CreateDealInput) => Promise<Deal | null>;
15
- moveDeal: (input: MoveDealInput) => Promise<Deal | null>;
16
- winDeal: (input: WinDealInput) => Promise<Deal | null>;
17
- loseDeal: (input: LoseDealInput) => Promise<Deal | null>;
18
- createState: MutationState<Deal>;
19
- moveState: MutationState<Deal>;
20
- winState: MutationState<Deal>;
21
- loseState: MutationState<Deal>;
22
- isLoading: boolean;
11
+ export declare function useDealMutations(options?: UseDealMutationsOptions): {
12
+ createDeal: (input: CreateDealInput) => Promise<Deal | null>;
13
+ moveDeal: (input: MoveDealInput) => Promise<Deal | null>;
14
+ winDeal: (input: WinDealInput) => Promise<Deal | null>;
15
+ loseDeal: (input: LoseDealInput) => Promise<Deal | null>;
16
+ createState: MutationState<Deal>;
17
+ moveState: MutationState<Deal>;
18
+ winState: MutationState<Deal>;
19
+ loseState: MutationState<Deal>;
20
+ isLoading: boolean;
23
21
  };
24
- //#endregion
25
- export { MutationState, UseDealMutationsOptions, useDealMutations };
26
22
  //# sourceMappingURL=useDealMutations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDealMutations.d.ts","names":[],"sources":["../../../src/ui/hooks/useDealMutations.ts"],"mappings":";;;UAoBiB,aAAA;EACf,OAAA;EACA,KAAA,EAAO,KAAA;EACP,IAAA,EAAM,CAAA;AAAA;AAAA,UAGS,uBAAA;EACf,SAAA;EACA,OAAA,IAAW,KAAA,EAAO,KAAA;AAAA;AAAA,iBAGJ,gBAAA,CAAiB,OAAA,GAAS,uBAAA;sBAgCxB,eAAA,KAAkB,OAAA,CAAQ,IAAA;oBAyB1B,aAAA,KAAgB,OAAA,CAAQ,IAAA;mBAsBxB,YAAA,KAAe,OAAA,CAAQ,IAAA;oBAsBvB,aAAA,KAAgB,OAAA,CAAQ,IAAA"}
1
+ {"version":3,"file":"useDealMutations.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useDealMutations.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,eAAe,EAEf,IAAI,EACJ,aAAa,EACb,aAAa,EACb,YAAY,EACb,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B;wBAgCpD,eAAe,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;sBAyBtC,aAAa,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;qBAsBpC,YAAY,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;sBAsBnC,aAAa,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;;;;;;EAsCrD"}
@@ -1,159 +1,101 @@
1
+ // @bun
2
+ // src/ui/hooks/useDealMutations.ts
1
3
  import { useCallback, useState } from "react";
2
4
  import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
3
-
4
- //#region src/ui/hooks/useDealMutations.ts
5
- /**
6
- * Hook for CRM deal mutations (commands)
7
- *
8
- * Uses runtime-local database-backed handlers for:
9
- * - CreateDealContract
10
- * - MoveDealContract
11
- * - WinDealContract
12
- * - LoseDealContract
13
- */
14
5
  function useDealMutations(options = {}) {
15
- const { handlers, projectId } = useTemplateRuntime();
16
- const { crm } = handlers;
17
- const [createState, setCreateState] = useState({
18
- loading: false,
19
- error: null,
20
- data: null
21
- });
22
- const [moveState, setMoveState] = useState({
23
- loading: false,
24
- error: null,
25
- data: null
26
- });
27
- const [winState, setWinState] = useState({
28
- loading: false,
29
- error: null,
30
- data: null
31
- });
32
- const [loseState, setLoseState] = useState({
33
- loading: false,
34
- error: null,
35
- data: null
36
- });
37
- return {
38
- createDeal: useCallback(async (input) => {
39
- setCreateState({
40
- loading: true,
41
- error: null,
42
- data: null
43
- });
44
- try {
45
- const result = await crm.createDeal(input, {
46
- projectId,
47
- ownerId: "user-1"
48
- });
49
- setCreateState({
50
- loading: false,
51
- error: null,
52
- data: result
53
- });
54
- options.onSuccess?.();
55
- return result;
56
- } catch (err) {
57
- const error = err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to create deal");
58
- setCreateState({
59
- loading: false,
60
- error,
61
- data: null
62
- });
63
- options.onError?.(error);
64
- return null;
65
- }
66
- }, [
67
- crm,
68
- projectId,
69
- options
70
- ]),
71
- moveDeal: useCallback(async (input) => {
72
- setMoveState({
73
- loading: true,
74
- error: null,
75
- data: null
76
- });
77
- try {
78
- const result = await crm.moveDeal(input);
79
- setMoveState({
80
- loading: false,
81
- error: null,
82
- data: result
83
- });
84
- options.onSuccess?.();
85
- return result;
86
- } catch (err) {
87
- const error = err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to move deal");
88
- setMoveState({
89
- loading: false,
90
- error,
91
- data: null
92
- });
93
- options.onError?.(error);
94
- return null;
95
- }
96
- }, [crm, options]),
97
- winDeal: useCallback(async (input) => {
98
- setWinState({
99
- loading: true,
100
- error: null,
101
- data: null
102
- });
103
- try {
104
- const result = await crm.winDeal(input);
105
- setWinState({
106
- loading: false,
107
- error: null,
108
- data: result
109
- });
110
- options.onSuccess?.();
111
- return result;
112
- } catch (err) {
113
- const error = err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to mark deal as won");
114
- setWinState({
115
- loading: false,
116
- error,
117
- data: null
118
- });
119
- options.onError?.(error);
120
- return null;
121
- }
122
- }, [crm, options]),
123
- loseDeal: useCallback(async (input) => {
124
- setLoseState({
125
- loading: true,
126
- error: null,
127
- data: null
128
- });
129
- try {
130
- const result = await crm.loseDeal(input);
131
- setLoseState({
132
- loading: false,
133
- error: null,
134
- data: result
135
- });
136
- options.onSuccess?.();
137
- return result;
138
- } catch (err) {
139
- const error = err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to mark deal as lost");
140
- setLoseState({
141
- loading: false,
142
- error,
143
- data: null
144
- });
145
- options.onError?.(error);
146
- return null;
147
- }
148
- }, [crm, options]),
149
- createState,
150
- moveState,
151
- winState,
152
- loseState,
153
- isLoading: createState.loading || moveState.loading || winState.loading || loseState.loading
154
- };
6
+ const { handlers, projectId } = useTemplateRuntime();
7
+ const { crm } = handlers;
8
+ const [createState, setCreateState] = useState({
9
+ loading: false,
10
+ error: null,
11
+ data: null
12
+ });
13
+ const [moveState, setMoveState] = useState({
14
+ loading: false,
15
+ error: null,
16
+ data: null
17
+ });
18
+ const [winState, setWinState] = useState({
19
+ loading: false,
20
+ error: null,
21
+ data: null
22
+ });
23
+ const [loseState, setLoseState] = useState({
24
+ loading: false,
25
+ error: null,
26
+ data: null
27
+ });
28
+ const createDeal = useCallback(async (input) => {
29
+ setCreateState({ loading: true, error: null, data: null });
30
+ try {
31
+ const result = await crm.createDeal(input, {
32
+ projectId,
33
+ ownerId: "user-1"
34
+ });
35
+ setCreateState({ loading: false, error: null, data: result });
36
+ options.onSuccess?.();
37
+ return result;
38
+ } catch (err) {
39
+ const error = err instanceof Error ? err : new Error("Failed to create deal");
40
+ setCreateState({ loading: false, error, data: null });
41
+ options.onError?.(error);
42
+ return null;
43
+ }
44
+ }, [crm, projectId, options]);
45
+ const moveDeal = useCallback(async (input) => {
46
+ setMoveState({ loading: true, error: null, data: null });
47
+ try {
48
+ const result = await crm.moveDeal(input);
49
+ setMoveState({ loading: false, error: null, data: result });
50
+ options.onSuccess?.();
51
+ return result;
52
+ } catch (err) {
53
+ const error = err instanceof Error ? err : new Error("Failed to move deal");
54
+ setMoveState({ loading: false, error, data: null });
55
+ options.onError?.(error);
56
+ return null;
57
+ }
58
+ }, [crm, options]);
59
+ const winDeal = useCallback(async (input) => {
60
+ setWinState({ loading: true, error: null, data: null });
61
+ try {
62
+ const result = await crm.winDeal(input);
63
+ setWinState({ loading: false, error: null, data: result });
64
+ options.onSuccess?.();
65
+ return result;
66
+ } catch (err) {
67
+ const error = err instanceof Error ? err : new Error("Failed to mark deal as won");
68
+ setWinState({ loading: false, error, data: null });
69
+ options.onError?.(error);
70
+ return null;
71
+ }
72
+ }, [crm, options]);
73
+ const loseDeal = useCallback(async (input) => {
74
+ setLoseState({ loading: true, error: null, data: null });
75
+ try {
76
+ const result = await crm.loseDeal(input);
77
+ setLoseState({ loading: false, error: null, data: result });
78
+ options.onSuccess?.();
79
+ return result;
80
+ } catch (err) {
81
+ const error = err instanceof Error ? err : new Error("Failed to mark deal as lost");
82
+ setLoseState({ loading: false, error, data: null });
83
+ options.onError?.(error);
84
+ return null;
85
+ }
86
+ }, [crm, options]);
87
+ return {
88
+ createDeal,
89
+ moveDeal,
90
+ winDeal,
91
+ loseDeal,
92
+ createState,
93
+ moveState,
94
+ winState,
95
+ loseState,
96
+ isLoading: createState.loading || moveState.loading || winState.loading || loseState.loading
97
+ };
155
98
  }
156
-
157
- //#endregion
158
- export { useDealMutations };
159
- //# sourceMappingURL=useDealMutations.js.map
99
+ export {
100
+ useDealMutations
101
+ };
@@ -1,14 +1,8 @@
1
- import { CrmDashboard } from "./CrmDashboard.js";
2
- import { UseDealListOptions, useDealList } from "./hooks/useDealList.js";
3
- import { CrmPipelineBoard } from "./CrmPipelineBoard.js";
4
- import { CrmDealCard } from "./CrmDealCard.js";
5
- import { CreateDealModal } from "./modals/CreateDealModal.js";
6
- import { DealActionsModal } from "./modals/DealActionsModal.js";
7
- import "./modals/index.js";
8
- import { UseDealMutationsOptions, useDealMutations } from "./hooks/useDealMutations.js";
9
- import "./hooks/index.js";
10
- import { crmPipelineReactRenderer } from "./renderers/pipeline.renderer.js";
11
- import { crmDashboardMarkdownRenderer, crmPipelineMarkdownRenderer } from "./renderers/pipeline.markdown.js";
12
- import "./renderers/index.js";
13
- import { crmDemoOverlay, crmOverlays, crmSalesRepOverlay } from "./overlays/demo-overlays.js";
14
- export { CreateDealModal, CrmDashboard, CrmDealCard, CrmPipelineBoard, DealActionsModal, UseDealListOptions, UseDealMutationsOptions, crmDashboardMarkdownRenderer, crmDemoOverlay, crmOverlays, crmPipelineMarkdownRenderer, crmPipelineReactRenderer, crmSalesRepOverlay, useDealList, useDealMutations };
1
+ export * from './CrmDashboard';
2
+ export * from './CrmPipelineBoard';
3
+ export * from './CrmDealCard';
4
+ export * from './modals';
5
+ export * from './hooks';
6
+ export * from './renderers';
7
+ export * from './overlays';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAG/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAG9B,cAAc,UAAU,CAAC;AAGzB,cAAc,SAAS,CAAC;AAGxB,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC"}