@contractspec/example.crm-pipeline 3.7.6 → 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.
- package/.turbo/turbo-build.log +45 -42
- package/AGENTS.md +51 -33
- package/CHANGELOG.md +36 -0
- package/README.md +67 -148
- package/dist/browser/docs/crm-pipeline.docblock.js +1 -1
- package/dist/browser/docs/index.js +1 -1
- package/dist/browser/events/contact.event.js +1 -1
- package/dist/browser/events/deal.event.js +1 -1
- package/dist/browser/events/index.js +3 -3
- package/dist/browser/events/task.event.js +1 -1
- package/dist/browser/handlers/crm.handlers.js +13 -2
- package/dist/browser/handlers/index.js +13 -2
- package/dist/browser/index.js +680 -447
- package/dist/browser/ui/CrmDashboard.js +574 -352
- package/dist/browser/ui/CrmDealCard.js +5 -5
- package/dist/browser/ui/CrmPipelineBoard.js +13 -13
- package/dist/browser/ui/hooks/index.js +21 -10
- package/dist/browser/ui/hooks/useDealList.js +20 -9
- package/dist/browser/ui/hooks/useDealMutations.js +1 -1
- package/dist/browser/ui/index.js +683 -450
- package/dist/browser/ui/modals/CreateDealModal.js +12 -12
- package/dist/browser/ui/modals/DealActionsModal.js +21 -21
- package/dist/browser/ui/modals/index.js +33 -33
- package/dist/browser/ui/renderers/index.js +140 -118
- package/dist/browser/ui/renderers/pipeline.markdown.js +13 -2
- package/dist/browser/ui/renderers/pipeline.renderer.js +108 -97
- package/dist/browser/ui/tables/DealListTab.js +390 -0
- package/dist/deal/index.d.ts +2 -2
- package/dist/docs/crm-pipeline.docblock.js +1 -1
- package/dist/docs/index.js +1 -1
- package/dist/events/contact.event.js +1 -1
- package/dist/events/deal.event.js +1 -1
- package/dist/events/index.js +3 -3
- package/dist/events/task.event.js +1 -1
- package/dist/handlers/crm.handlers.d.ts +2 -0
- package/dist/handlers/crm.handlers.js +13 -2
- package/dist/handlers/index.d.ts +2 -2
- package/dist/handlers/index.js +13 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +680 -447
- package/dist/node/docs/crm-pipeline.docblock.js +1 -1
- package/dist/node/docs/index.js +1 -1
- package/dist/node/events/contact.event.js +1 -1
- package/dist/node/events/deal.event.js +1 -1
- package/dist/node/events/index.js +3 -3
- package/dist/node/events/task.event.js +1 -1
- package/dist/node/handlers/crm.handlers.js +13 -2
- package/dist/node/handlers/index.js +13 -2
- package/dist/node/index.js +680 -447
- package/dist/node/ui/CrmDashboard.js +574 -352
- package/dist/node/ui/CrmDealCard.js +5 -5
- package/dist/node/ui/CrmPipelineBoard.js +13 -13
- package/dist/node/ui/hooks/index.js +21 -10
- package/dist/node/ui/hooks/useDealList.js +20 -9
- package/dist/node/ui/hooks/useDealMutations.js +1 -1
- package/dist/node/ui/index.js +683 -450
- package/dist/node/ui/modals/CreateDealModal.js +12 -12
- package/dist/node/ui/modals/DealActionsModal.js +21 -21
- package/dist/node/ui/modals/index.js +33 -33
- package/dist/node/ui/renderers/index.js +140 -118
- package/dist/node/ui/renderers/pipeline.markdown.js +13 -2
- package/dist/node/ui/renderers/pipeline.renderer.js +108 -97
- package/dist/node/ui/tables/DealListTab.js +390 -0
- package/dist/operations/index.d.ts +1 -1
- package/dist/ui/CrmDashboard.js +574 -352
- package/dist/ui/CrmDealCard.js +5 -5
- package/dist/ui/CrmPipelineBoard.js +13 -13
- package/dist/ui/hooks/index.d.ts +2 -2
- package/dist/ui/hooks/index.js +21 -10
- package/dist/ui/hooks/useDealList.d.ts +8 -2
- package/dist/ui/hooks/useDealList.js +20 -9
- package/dist/ui/hooks/useDealMutations.d.ts +9 -0
- package/dist/ui/hooks/useDealMutations.js +1 -1
- package/dist/ui/index.d.ts +3 -3
- package/dist/ui/index.js +683 -450
- package/dist/ui/modals/CreateDealModal.js +12 -12
- package/dist/ui/modals/DealActionsModal.js +21 -21
- package/dist/ui/modals/index.js +33 -33
- package/dist/ui/renderers/index.d.ts +1 -1
- package/dist/ui/renderers/index.js +140 -118
- package/dist/ui/renderers/pipeline.markdown.js +13 -2
- package/dist/ui/renderers/pipeline.renderer.d.ts +1 -1
- package/dist/ui/renderers/pipeline.renderer.js +108 -97
- package/dist/ui/tables/DealListTab.d.ts +20 -0
- package/dist/ui/tables/DealListTab.js +391 -0
- package/dist/ui/tables/DealListTab.smoke.test.d.ts +1 -0
- package/package.json +29 -14
- package/src/crm-pipeline.feature.ts +86 -86
- package/src/deal/deal.enum.ts +8 -8
- package/src/deal/deal.operation.ts +255 -255
- package/src/deal/deal.schema.ts +92 -92
- package/src/deal/deal.test-spec.ts +48 -48
- package/src/deal/index.ts +17 -19
- package/src/docs/crm-pipeline.docblock.ts +44 -44
- package/src/entities/company.entity.ts +52 -52
- package/src/entities/contact.entity.ts +67 -67
- package/src/entities/deal.entity.ts +134 -134
- package/src/entities/index.ts +27 -27
- package/src/entities/task.entity.ts +105 -105
- package/src/events/contact.event.ts +22 -22
- package/src/events/deal.event.ts +77 -77
- package/src/events/task.event.ts +19 -19
- package/src/example.ts +32 -32
- package/src/handlers/crm.handlers.ts +375 -357
- package/src/handlers/deal.handlers.ts +179 -179
- package/src/handlers/index.ts +18 -19
- package/src/handlers/mock-data.ts +167 -167
- package/src/index.ts +11 -11
- package/src/operations/index.ts +16 -16
- package/src/presentations/dashboard.presentation.ts +45 -45
- package/src/presentations/pipeline.presentation.ts +90 -90
- package/src/seeders/index.ts +26 -26
- package/src/shared/overlay-types.ts +23 -23
- package/src/ui/CrmDashboard.tsx +210 -279
- package/src/ui/CrmDealCard.tsx +64 -64
- package/src/ui/CrmPipelineBoard.tsx +105 -105
- package/src/ui/hooks/index.ts +3 -3
- package/src/ui/hooks/useDealList.ts +113 -85
- package/src/ui/hooks/useDealMutations.ts +151 -150
- package/src/ui/index.ts +5 -10
- package/src/ui/modals/CreateDealModal.tsx +217 -217
- package/src/ui/modals/DealActionsModal.tsx +390 -390
- package/src/ui/overlays/demo-overlays.ts +43 -43
- package/src/ui/renderers/index.ts +4 -3
- package/src/ui/renderers/pipeline.markdown.ts +165 -165
- package/src/ui/renderers/pipeline.renderer.tsx +17 -16
- package/src/ui/tables/DealListTab.smoke.test.tsx +149 -0
- package/src/ui/tables/DealListTab.tsx +276 -0
- package/tsconfig.json +7 -8
- package/tsdown.config.js +7 -3
|
@@ -13,7 +13,7 @@ function CrmDealCard({ deal, onClick }) {
|
|
|
13
13
|
const daysUntilClose = deal.expectedCloseDate ? Math.ceil((deal.expectedCloseDate.getTime() - Date.now()) / (1000 * 60 * 60 * 24)) : null;
|
|
14
14
|
return /* @__PURE__ */ jsxDEV("div", {
|
|
15
15
|
onClick,
|
|
16
|
-
className: "
|
|
16
|
+
className: "cursor-pointer rounded-lg border border-border bg-card p-3 shadow-sm transition-shadow hover:shadow-md",
|
|
17
17
|
role: "button",
|
|
18
18
|
tabIndex: 0,
|
|
19
19
|
onKeyDown: (e) => {
|
|
@@ -22,22 +22,22 @@ function CrmDealCard({ deal, onClick }) {
|
|
|
22
22
|
},
|
|
23
23
|
children: [
|
|
24
24
|
/* @__PURE__ */ jsxDEV("h4", {
|
|
25
|
-
className: "leading-snug
|
|
25
|
+
className: "font-medium leading-snug",
|
|
26
26
|
children: deal.name
|
|
27
27
|
}, undefined, false, undefined, this),
|
|
28
28
|
/* @__PURE__ */ jsxDEV("div", {
|
|
29
|
-
className: "
|
|
29
|
+
className: "mt-2 font-semibold text-lg text-primary",
|
|
30
30
|
children: formatCurrency(deal.value, deal.currency)
|
|
31
31
|
}, undefined, false, undefined, this),
|
|
32
32
|
/* @__PURE__ */ jsxDEV("div", {
|
|
33
|
-
className: "
|
|
33
|
+
className: "mt-3 flex items-center justify-between text-muted-foreground text-xs",
|
|
34
34
|
children: [
|
|
35
35
|
daysUntilClose !== null && /* @__PURE__ */ jsxDEV("span", {
|
|
36
36
|
className: daysUntilClose < 0 ? "text-red-500" : daysUntilClose <= 7 ? "text-yellow-600 dark:text-yellow-500" : "",
|
|
37
37
|
children: daysUntilClose < 0 ? `${Math.abs(daysUntilClose)}d overdue` : daysUntilClose === 0 ? "Due today" : `${daysUntilClose}d left`
|
|
38
38
|
}, undefined, false, undefined, this),
|
|
39
39
|
/* @__PURE__ */ jsxDEV("span", {
|
|
40
|
-
className: `rounded px-1.5 py-0.5 text-xs
|
|
40
|
+
className: `rounded px-1.5 py-0.5 font-medium text-xs ${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"}`,
|
|
41
41
|
children: deal.status
|
|
42
42
|
}, undefined, false, undefined, this)
|
|
43
43
|
]
|
|
@@ -13,7 +13,7 @@ function CrmDealCard({ deal, onClick }) {
|
|
|
13
13
|
const daysUntilClose = deal.expectedCloseDate ? Math.ceil((deal.expectedCloseDate.getTime() - Date.now()) / (1000 * 60 * 60 * 24)) : null;
|
|
14
14
|
return /* @__PURE__ */ jsxDEV("div", {
|
|
15
15
|
onClick,
|
|
16
|
-
className: "
|
|
16
|
+
className: "cursor-pointer rounded-lg border border-border bg-card p-3 shadow-sm transition-shadow hover:shadow-md",
|
|
17
17
|
role: "button",
|
|
18
18
|
tabIndex: 0,
|
|
19
19
|
onKeyDown: (e) => {
|
|
@@ -22,22 +22,22 @@ function CrmDealCard({ deal, onClick }) {
|
|
|
22
22
|
},
|
|
23
23
|
children: [
|
|
24
24
|
/* @__PURE__ */ jsxDEV("h4", {
|
|
25
|
-
className: "leading-snug
|
|
25
|
+
className: "font-medium leading-snug",
|
|
26
26
|
children: deal.name
|
|
27
27
|
}, undefined, false, undefined, this),
|
|
28
28
|
/* @__PURE__ */ jsxDEV("div", {
|
|
29
|
-
className: "
|
|
29
|
+
className: "mt-2 font-semibold text-lg text-primary",
|
|
30
30
|
children: formatCurrency(deal.value, deal.currency)
|
|
31
31
|
}, undefined, false, undefined, this),
|
|
32
32
|
/* @__PURE__ */ jsxDEV("div", {
|
|
33
|
-
className: "
|
|
33
|
+
className: "mt-3 flex items-center justify-between text-muted-foreground text-xs",
|
|
34
34
|
children: [
|
|
35
35
|
daysUntilClose !== null && /* @__PURE__ */ jsxDEV("span", {
|
|
36
36
|
className: daysUntilClose < 0 ? "text-red-500" : daysUntilClose <= 7 ? "text-yellow-600 dark:text-yellow-500" : "",
|
|
37
37
|
children: daysUntilClose < 0 ? `${Math.abs(daysUntilClose)}d overdue` : daysUntilClose === 0 ? "Due today" : `${daysUntilClose}d left`
|
|
38
38
|
}, undefined, false, undefined, this),
|
|
39
39
|
/* @__PURE__ */ jsxDEV("span", {
|
|
40
|
-
className: `rounded px-1.5 py-0.5 text-xs
|
|
40
|
+
className: `rounded px-1.5 py-0.5 font-medium text-xs ${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"}`,
|
|
41
41
|
children: deal.status
|
|
42
42
|
}, undefined, false, undefined, this)
|
|
43
43
|
]
|
|
@@ -75,10 +75,10 @@ function CrmPipelineBoard({
|
|
|
75
75
|
const deals = dealsByStage[stage.id] ?? [];
|
|
76
76
|
const stageValue = deals.reduce((sum, d) => sum + d.value, 0);
|
|
77
77
|
return /* @__PURE__ */ jsxDEV2("div", {
|
|
78
|
-
className: "
|
|
78
|
+
className: "flex w-72 flex-shrink-0 flex-col rounded-lg bg-muted/30",
|
|
79
79
|
children: [
|
|
80
80
|
/* @__PURE__ */ jsxDEV2("div", {
|
|
81
|
-
className: "
|
|
81
|
+
className: "flex items-center justify-between border-border border-b px-3 py-2",
|
|
82
82
|
children: [
|
|
83
83
|
/* @__PURE__ */ jsxDEV2("div", {
|
|
84
84
|
children: [
|
|
@@ -97,7 +97,7 @@ function CrmPipelineBoard({
|
|
|
97
97
|
]
|
|
98
98
|
}, undefined, true, undefined, this),
|
|
99
99
|
/* @__PURE__ */ jsxDEV2("span", {
|
|
100
|
-
className: "
|
|
100
|
+
className: "flex h-6 w-6 items-center justify-center rounded-full bg-muted font-medium text-xs",
|
|
101
101
|
children: deals.length
|
|
102
102
|
}, undefined, false, undefined, this)
|
|
103
103
|
]
|
|
@@ -105,7 +105,7 @@ function CrmPipelineBoard({
|
|
|
105
105
|
/* @__PURE__ */ jsxDEV2("div", {
|
|
106
106
|
className: "flex flex-1 flex-col gap-2 p-2",
|
|
107
107
|
children: deals.length === 0 ? /* @__PURE__ */ jsxDEV2("div", {
|
|
108
|
-
className: "
|
|
108
|
+
className: "flex h-24 items-center justify-center rounded-md border-2 border-muted-foreground/20 border-dashed text-muted-foreground text-xs",
|
|
109
109
|
children: "No deals"
|
|
110
110
|
}, undefined, false, undefined, this) : deals.map((deal) => /* @__PURE__ */ jsxDEV2("div", {
|
|
111
111
|
className: "group relative",
|
|
@@ -123,15 +123,15 @@ function CrmPipelineBoard({
|
|
|
123
123
|
e.stopPropagation();
|
|
124
124
|
setQuickMoveOpen(quickMoveOpen === deal.id ? null : deal.id);
|
|
125
125
|
},
|
|
126
|
-
className: "
|
|
126
|
+
className: "flex h-6 w-6 items-center justify-center rounded border border-border bg-background text-xs shadow-sm hover:bg-muted",
|
|
127
127
|
title: "Quick move",
|
|
128
128
|
children: "➡️"
|
|
129
129
|
}, undefined, false, undefined, this),
|
|
130
130
|
quickMoveOpen === deal.id && /* @__PURE__ */ jsxDEV2("div", {
|
|
131
|
-
className: "
|
|
131
|
+
className: "absolute top-7 right-0 z-20 min-w-[140px] rounded-lg border border-border bg-card py-1 shadow-lg",
|
|
132
132
|
children: [
|
|
133
133
|
/* @__PURE__ */ jsxDEV2("p", {
|
|
134
|
-
className: "
|
|
134
|
+
className: "px-3 py-1 font-medium text-muted-foreground text-xs",
|
|
135
135
|
children: "Move to:"
|
|
136
136
|
}, undefined, false, undefined, this),
|
|
137
137
|
sortedStages.filter((s) => s.id !== deal.stageId).map((s) => /* @__PURE__ */ jsxDEV2("button", {
|
|
@@ -140,7 +140,7 @@ function CrmPipelineBoard({
|
|
|
140
140
|
e.stopPropagation();
|
|
141
141
|
handleQuickMove(deal.id, s.id);
|
|
142
142
|
},
|
|
143
|
-
className: "
|
|
143
|
+
className: "w-full px-3 py-1.5 text-left text-sm hover:bg-muted",
|
|
144
144
|
children: s.name
|
|
145
145
|
}, s.id, false, undefined, this))
|
|
146
146
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/ui/hooks/useDealList.ts
|
|
2
|
-
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
2
|
import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
4
4
|
"use client";
|
|
5
5
|
function useDealList(options = {}) {
|
|
6
6
|
const { handlers, projectId } = useTemplateRuntime();
|
|
@@ -10,8 +10,13 @@ function useDealList(options = {}) {
|
|
|
10
10
|
const [stages, setStages] = useState([]);
|
|
11
11
|
const [loading, setLoading] = useState(true);
|
|
12
12
|
const [error, setError] = useState(null);
|
|
13
|
-
const [
|
|
13
|
+
const [internalPage, setInternalPage] = useState(0);
|
|
14
14
|
const pipelineId = options.pipelineId ?? "pipeline-1";
|
|
15
|
+
const pageIndex = options.pageIndex ?? internalPage;
|
|
16
|
+
const pageSize = options.pageSize ?? options.limit ?? 50;
|
|
17
|
+
const [sort] = options.sorting ?? [];
|
|
18
|
+
const sortBy = sort?.id;
|
|
19
|
+
const sortDirection = sort ? sort.desc ? "desc" : "asc" : undefined;
|
|
15
20
|
const fetchData = useCallback(async () => {
|
|
16
21
|
setLoading(true);
|
|
17
22
|
setError(null);
|
|
@@ -23,8 +28,10 @@ function useDealList(options = {}) {
|
|
|
23
28
|
stageId: options.stageId,
|
|
24
29
|
status: options.status === "all" ? undefined : options.status,
|
|
25
30
|
search: options.search,
|
|
26
|
-
limit:
|
|
27
|
-
offset:
|
|
31
|
+
limit: pageSize,
|
|
32
|
+
offset: pageIndex * pageSize,
|
|
33
|
+
sortBy: sortBy === "name" || sortBy === "value" || sortBy === "status" || sortBy === "expectedCloseDate" || sortBy === "updatedAt" ? sortBy : undefined,
|
|
34
|
+
sortDirection
|
|
28
35
|
}),
|
|
29
36
|
crm.getDealsByStage({ projectId, pipelineId }),
|
|
30
37
|
crm.getPipelineStages({ pipelineId })
|
|
@@ -44,8 +51,10 @@ function useDealList(options = {}) {
|
|
|
44
51
|
options.stageId,
|
|
45
52
|
options.status,
|
|
46
53
|
options.search,
|
|
47
|
-
|
|
48
|
-
|
|
54
|
+
pageIndex,
|
|
55
|
+
pageSize,
|
|
56
|
+
sortBy,
|
|
57
|
+
sortDirection
|
|
49
58
|
]);
|
|
50
59
|
useEffect(() => {
|
|
51
60
|
fetchData();
|
|
@@ -73,16 +82,18 @@ function useDealList(options = {}) {
|
|
|
73
82
|
loading,
|
|
74
83
|
error,
|
|
75
84
|
stats,
|
|
76
|
-
page,
|
|
85
|
+
page: pageIndex + 1,
|
|
86
|
+
pageIndex,
|
|
87
|
+
pageSize,
|
|
77
88
|
refetch: fetchData,
|
|
78
|
-
nextPage: () =>
|
|
79
|
-
prevPage: () =>
|
|
89
|
+
nextPage: options.pageIndex === undefined ? () => setInternalPage((page) => page + 1) : undefined,
|
|
90
|
+
prevPage: options.pageIndex === undefined ? () => pageIndex > 0 && setInternalPage((page) => page - 1) : undefined
|
|
80
91
|
};
|
|
81
92
|
}
|
|
82
93
|
|
|
83
94
|
// src/ui/hooks/useDealMutations.ts
|
|
84
|
-
import { useCallback as useCallback2, useState as useState2 } from "react";
|
|
85
95
|
import { useTemplateRuntime as useTemplateRuntime2 } from "@contractspec/lib.example-shared-ui";
|
|
96
|
+
import { useCallback as useCallback2, useState as useState2 } from "react";
|
|
86
97
|
function useDealMutations(options = {}) {
|
|
87
98
|
const { handlers, projectId } = useTemplateRuntime2();
|
|
88
99
|
const { crm } = handlers;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/ui/hooks/useDealList.ts
|
|
2
|
-
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
2
|
import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
4
4
|
"use client";
|
|
5
5
|
function useDealList(options = {}) {
|
|
6
6
|
const { handlers, projectId } = useTemplateRuntime();
|
|
@@ -10,8 +10,13 @@ function useDealList(options = {}) {
|
|
|
10
10
|
const [stages, setStages] = useState([]);
|
|
11
11
|
const [loading, setLoading] = useState(true);
|
|
12
12
|
const [error, setError] = useState(null);
|
|
13
|
-
const [
|
|
13
|
+
const [internalPage, setInternalPage] = useState(0);
|
|
14
14
|
const pipelineId = options.pipelineId ?? "pipeline-1";
|
|
15
|
+
const pageIndex = options.pageIndex ?? internalPage;
|
|
16
|
+
const pageSize = options.pageSize ?? options.limit ?? 50;
|
|
17
|
+
const [sort] = options.sorting ?? [];
|
|
18
|
+
const sortBy = sort?.id;
|
|
19
|
+
const sortDirection = sort ? sort.desc ? "desc" : "asc" : undefined;
|
|
15
20
|
const fetchData = useCallback(async () => {
|
|
16
21
|
setLoading(true);
|
|
17
22
|
setError(null);
|
|
@@ -23,8 +28,10 @@ function useDealList(options = {}) {
|
|
|
23
28
|
stageId: options.stageId,
|
|
24
29
|
status: options.status === "all" ? undefined : options.status,
|
|
25
30
|
search: options.search,
|
|
26
|
-
limit:
|
|
27
|
-
offset:
|
|
31
|
+
limit: pageSize,
|
|
32
|
+
offset: pageIndex * pageSize,
|
|
33
|
+
sortBy: sortBy === "name" || sortBy === "value" || sortBy === "status" || sortBy === "expectedCloseDate" || sortBy === "updatedAt" ? sortBy : undefined,
|
|
34
|
+
sortDirection
|
|
28
35
|
}),
|
|
29
36
|
crm.getDealsByStage({ projectId, pipelineId }),
|
|
30
37
|
crm.getPipelineStages({ pipelineId })
|
|
@@ -44,8 +51,10 @@ function useDealList(options = {}) {
|
|
|
44
51
|
options.stageId,
|
|
45
52
|
options.status,
|
|
46
53
|
options.search,
|
|
47
|
-
|
|
48
|
-
|
|
54
|
+
pageIndex,
|
|
55
|
+
pageSize,
|
|
56
|
+
sortBy,
|
|
57
|
+
sortDirection
|
|
49
58
|
]);
|
|
50
59
|
useEffect(() => {
|
|
51
60
|
fetchData();
|
|
@@ -73,10 +82,12 @@ function useDealList(options = {}) {
|
|
|
73
82
|
loading,
|
|
74
83
|
error,
|
|
75
84
|
stats,
|
|
76
|
-
page,
|
|
85
|
+
page: pageIndex + 1,
|
|
86
|
+
pageIndex,
|
|
87
|
+
pageSize,
|
|
77
88
|
refetch: fetchData,
|
|
78
|
-
nextPage: () =>
|
|
79
|
-
prevPage: () =>
|
|
89
|
+
nextPage: options.pageIndex === undefined ? () => setInternalPage((page) => page + 1) : undefined,
|
|
90
|
+
prevPage: options.pageIndex === undefined ? () => pageIndex > 0 && setInternalPage((page) => page - 1) : undefined
|
|
80
91
|
};
|
|
81
92
|
}
|
|
82
93
|
export {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/ui/hooks/useDealMutations.ts
|
|
2
|
-
import { useCallback, useState } from "react";
|
|
3
2
|
import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
|
|
3
|
+
import { useCallback, useState } from "react";
|
|
4
4
|
function useDealMutations(options = {}) {
|
|
5
5
|
const { handlers, projectId } = useTemplateRuntime();
|
|
6
6
|
const { crm } = handlers;
|