@contractspec/example.crm-pipeline 3.7.7 → 3.7.10

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 (53) hide show
  1. package/.turbo/turbo-build.log +45 -42
  2. package/CHANGELOG.md +36 -0
  3. package/README.md +2 -1
  4. package/dist/browser/docs/crm-pipeline.docblock.js +1 -1
  5. package/dist/browser/docs/index.js +1 -1
  6. package/dist/browser/handlers/crm.handlers.js +13 -2
  7. package/dist/browser/handlers/index.js +13 -2
  8. package/dist/browser/index.js +392 -159
  9. package/dist/browser/ui/CrmDashboard.js +366 -144
  10. package/dist/browser/ui/hooks/index.js +19 -8
  11. package/dist/browser/ui/hooks/useDealList.js +19 -8
  12. package/dist/browser/ui/index.js +391 -158
  13. package/dist/browser/ui/renderers/index.js +32 -10
  14. package/dist/browser/ui/renderers/pipeline.markdown.js +13 -2
  15. package/dist/browser/ui/renderers/pipeline.renderer.js +19 -8
  16. package/dist/browser/ui/tables/DealListTab.js +390 -0
  17. package/dist/docs/crm-pipeline.docblock.js +1 -1
  18. package/dist/docs/index.js +1 -1
  19. package/dist/handlers/crm.handlers.d.ts +2 -0
  20. package/dist/handlers/crm.handlers.js +13 -2
  21. package/dist/handlers/index.js +13 -2
  22. package/dist/index.js +392 -159
  23. package/dist/node/docs/crm-pipeline.docblock.js +1 -1
  24. package/dist/node/docs/index.js +1 -1
  25. package/dist/node/handlers/crm.handlers.js +13 -2
  26. package/dist/node/handlers/index.js +13 -2
  27. package/dist/node/index.js +392 -159
  28. package/dist/node/ui/CrmDashboard.js +366 -144
  29. package/dist/node/ui/hooks/index.js +19 -8
  30. package/dist/node/ui/hooks/useDealList.js +19 -8
  31. package/dist/node/ui/index.js +391 -158
  32. package/dist/node/ui/renderers/index.js +32 -10
  33. package/dist/node/ui/renderers/pipeline.markdown.js +13 -2
  34. package/dist/node/ui/renderers/pipeline.renderer.js +19 -8
  35. package/dist/node/ui/tables/DealListTab.js +390 -0
  36. package/dist/ui/CrmDashboard.js +366 -144
  37. package/dist/ui/hooks/index.js +19 -8
  38. package/dist/ui/hooks/useDealList.d.ts +8 -2
  39. package/dist/ui/hooks/useDealList.js +19 -8
  40. package/dist/ui/index.js +391 -158
  41. package/dist/ui/renderers/index.js +32 -10
  42. package/dist/ui/renderers/pipeline.markdown.js +13 -2
  43. package/dist/ui/renderers/pipeline.renderer.js +19 -8
  44. package/dist/ui/tables/DealListTab.d.ts +20 -0
  45. package/dist/ui/tables/DealListTab.js +391 -0
  46. package/dist/ui/tables/DealListTab.smoke.test.d.ts +1 -0
  47. package/package.json +27 -12
  48. package/src/docs/crm-pipeline.docblock.ts +1 -1
  49. package/src/handlers/crm.handlers.ts +18 -1
  50. package/src/ui/CrmDashboard.tsx +2 -71
  51. package/src/ui/hooks/useDealList.ts +36 -8
  52. package/src/ui/tables/DealListTab.smoke.test.tsx +149 -0
  53. package/src/ui/tables/DealListTab.tsx +276 -0
@@ -11,8 +11,13 @@ function useDealList(options = {}) {
11
11
  const [stages, setStages] = useState([]);
12
12
  const [loading, setLoading] = useState(true);
13
13
  const [error, setError] = useState(null);
14
- const [page, setPage] = useState(1);
14
+ const [internalPage, setInternalPage] = useState(0);
15
15
  const pipelineId = options.pipelineId ?? "pipeline-1";
16
+ const pageIndex = options.pageIndex ?? internalPage;
17
+ const pageSize = options.pageSize ?? options.limit ?? 50;
18
+ const [sort] = options.sorting ?? [];
19
+ const sortBy = sort?.id;
20
+ const sortDirection = sort ? sort.desc ? "desc" : "asc" : undefined;
16
21
  const fetchData = useCallback(async () => {
17
22
  setLoading(true);
18
23
  setError(null);
@@ -24,8 +29,10 @@ function useDealList(options = {}) {
24
29
  stageId: options.stageId,
25
30
  status: options.status === "all" ? undefined : options.status,
26
31
  search: options.search,
27
- limit: options.limit ?? 50,
28
- offset: (page - 1) * (options.limit ?? 50)
32
+ limit: pageSize,
33
+ offset: pageIndex * pageSize,
34
+ sortBy: sortBy === "name" || sortBy === "value" || sortBy === "status" || sortBy === "expectedCloseDate" || sortBy === "updatedAt" ? sortBy : undefined,
35
+ sortDirection
29
36
  }),
30
37
  crm.getDealsByStage({ projectId, pipelineId }),
31
38
  crm.getPipelineStages({ pipelineId })
@@ -45,8 +52,10 @@ function useDealList(options = {}) {
45
52
  options.stageId,
46
53
  options.status,
47
54
  options.search,
48
- options.limit,
49
- page
55
+ pageIndex,
56
+ pageSize,
57
+ sortBy,
58
+ sortDirection
50
59
  ]);
51
60
  useEffect(() => {
52
61
  fetchData();
@@ -74,10 +83,12 @@ function useDealList(options = {}) {
74
83
  loading,
75
84
  error,
76
85
  stats,
77
- page,
86
+ page: pageIndex + 1,
87
+ pageIndex,
88
+ pageSize,
78
89
  refetch: fetchData,
79
- nextPage: () => setPage((p) => p + 1),
80
- prevPage: () => page > 1 && setPage((p) => p - 1)
90
+ nextPage: options.pageIndex === undefined ? () => setInternalPage((page) => page + 1) : undefined,
91
+ prevPage: options.pageIndex === undefined ? () => pageIndex > 0 && setInternalPage((page) => page - 1) : undefined
81
92
  };
82
93
  }
83
94
 
@@ -1,3 +1,4 @@
1
+ import type { ContractTableSort } from '@contractspec/lib.presentation-runtime-core';
1
2
  import { type Deal as RuntimeDeal, type ListDealsOutput as RuntimeListDealsOutput, type Stage } from '../../handlers/crm.handlers';
2
3
  export type Deal = RuntimeDeal;
3
4
  export type ListDealsOutput = RuntimeListDealsOutput;
@@ -7,6 +8,9 @@ export interface UseDealListOptions {
7
8
  status?: 'OPEN' | 'WON' | 'LOST' | 'all';
8
9
  search?: string;
9
10
  limit?: number;
11
+ pageIndex?: number;
12
+ pageSize?: number;
13
+ sorting?: ContractTableSort[];
10
14
  }
11
15
  export declare function useDealList(options?: UseDealListOptions): {
12
16
  data: RuntimeListDealsOutput | null;
@@ -24,7 +28,9 @@ export declare function useDealList(options?: UseDealListOptions): {
24
28
  lostCount: number;
25
29
  } | null;
26
30
  page: number;
31
+ pageIndex: number;
32
+ pageSize: number;
27
33
  refetch: () => Promise<void>;
28
- nextPage: () => void;
29
- prevPage: () => false | void;
34
+ nextPage: (() => void) | undefined;
35
+ prevPage: (() => false | void) | undefined;
30
36
  };
@@ -11,8 +11,13 @@ function useDealList(options = {}) {
11
11
  const [stages, setStages] = useState([]);
12
12
  const [loading, setLoading] = useState(true);
13
13
  const [error, setError] = useState(null);
14
- const [page, setPage] = useState(1);
14
+ const [internalPage, setInternalPage] = useState(0);
15
15
  const pipelineId = options.pipelineId ?? "pipeline-1";
16
+ const pageIndex = options.pageIndex ?? internalPage;
17
+ const pageSize = options.pageSize ?? options.limit ?? 50;
18
+ const [sort] = options.sorting ?? [];
19
+ const sortBy = sort?.id;
20
+ const sortDirection = sort ? sort.desc ? "desc" : "asc" : undefined;
16
21
  const fetchData = useCallback(async () => {
17
22
  setLoading(true);
18
23
  setError(null);
@@ -24,8 +29,10 @@ function useDealList(options = {}) {
24
29
  stageId: options.stageId,
25
30
  status: options.status === "all" ? undefined : options.status,
26
31
  search: options.search,
27
- limit: options.limit ?? 50,
28
- offset: (page - 1) * (options.limit ?? 50)
32
+ limit: pageSize,
33
+ offset: pageIndex * pageSize,
34
+ sortBy: sortBy === "name" || sortBy === "value" || sortBy === "status" || sortBy === "expectedCloseDate" || sortBy === "updatedAt" ? sortBy : undefined,
35
+ sortDirection
29
36
  }),
30
37
  crm.getDealsByStage({ projectId, pipelineId }),
31
38
  crm.getPipelineStages({ pipelineId })
@@ -45,8 +52,10 @@ function useDealList(options = {}) {
45
52
  options.stageId,
46
53
  options.status,
47
54
  options.search,
48
- options.limit,
49
- page
55
+ pageIndex,
56
+ pageSize,
57
+ sortBy,
58
+ sortDirection
50
59
  ]);
51
60
  useEffect(() => {
52
61
  fetchData();
@@ -74,10 +83,12 @@ function useDealList(options = {}) {
74
83
  loading,
75
84
  error,
76
85
  stats,
77
- page,
86
+ page: pageIndex + 1,
87
+ pageIndex,
88
+ pageSize,
78
89
  refetch: fetchData,
79
- nextPage: () => setPage((p) => p + 1),
80
- prevPage: () => page > 1 && setPage((p) => p - 1)
90
+ nextPage: options.pageIndex === undefined ? () => setInternalPage((page) => page + 1) : undefined,
91
+ prevPage: options.pageIndex === undefined ? () => pageIndex > 0 && setInternalPage((page) => page - 1) : undefined
81
92
  };
82
93
  }
83
94
  export {