@paro.io/expert-shared-components 1.14.62 → 1.14.63
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/lib/tax-axis/components/dashboard/TaxAxisDashboard.d.ts +2 -1
- package/lib/tax-axis/components/dashboard/TaxAxisDashboard.js +74 -9
- package/lib/tax-axis/components/documents/DocumentCard.d.ts +3 -1
- package/lib/tax-axis/components/documents/DocumentCard.js +15 -3
- package/lib/tax-axis/components/documents/DocumentReviewModal.d.ts +1 -3
- package/lib/tax-axis/components/documents/DocumentReviewModal.js +263 -113
- package/lib/tax-axis/components/documents/DocumentTier.d.ts +3 -1
- package/lib/tax-axis/components/documents/DocumentTier.js +2 -2
- package/lib/tax-axis/components/documents/TaxAxisDocuments.js +21 -2
- package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.js +17 -17
- package/lib/tax-axis/index.d.ts +2 -0
- package/lib/tax-axis/index.js +5 -1
- package/package.json +1 -1
- package/lib/tax-axis/components/documents/qbo/QboAvailableReportsModal.d.ts +0 -13
- package/lib/tax-axis/components/documents/qbo/QboAvailableReportsModal.js +0 -180
- package/lib/tax-axis/components/documents/qbo/QboClientSelectorModal.d.ts +0 -10
- package/lib/tax-axis/components/documents/qbo/QboClientSelectorModal.js +0 -155
- package/lib/tax-axis/components/documents/qbo/QboConnectBanner.d.ts +0 -9
- package/lib/tax-axis/components/documents/qbo/QboConnectBanner.js +0 -55
- package/lib/tax-axis/components/documents/qbo/QboDocumentMappingModal.d.ts +0 -10
- package/lib/tax-axis/components/documents/qbo/QboDocumentMappingModal.js +0 -202
- package/lib/tax-axis/components/documents/qbo/QboImportingModal.d.ts +0 -8
- package/lib/tax-axis/components/documents/qbo/QboImportingModal.js +0 -75
- package/lib/tax-axis/components/documents/qbo/QboPermissionsModal.d.ts +0 -8
- package/lib/tax-axis/components/documents/qbo/QboPermissionsModal.js +0 -126
- package/lib/tax-axis/components/documents/qbo/index.d.ts +0 -8
- package/lib/tax-axis/components/documents/qbo/index.js +0 -17
- package/lib/tax-axis/components/documents/qbo/qboConstants.d.ts +0 -24
- package/lib/tax-axis/components/documents/qbo/qboConstants.js +0 -71
- package/lib/tax-axis/components/documents/qbo/types.d.ts +0 -43
- package/lib/tax-axis/components/documents/qbo/types.js +0 -3
- package/lib/tax-axis/components/documents/qbo/useQboFlow.d.ts +0 -19
- package/lib/tax-axis/components/documents/qbo/useQboFlow.js +0 -207
|
@@ -10,5 +10,6 @@ export interface TaxAxisDashboardProps extends TaxAxisScreenProps {
|
|
|
10
10
|
onReviewData?: () => void;
|
|
11
11
|
llmResult?: any;
|
|
12
12
|
parsedDocuments?: any[];
|
|
13
|
+
onUploadMore?: () => void;
|
|
13
14
|
}
|
|
14
|
-
export declare function TaxAxisDashboard({ profile, onDownloadClient, onDownloadPreparer, onPresent, onSend, onReset, onReviewData, userContext: _userContext, }: TaxAxisDashboardProps): React.JSX.Element;
|
|
15
|
+
export declare function TaxAxisDashboard({ profile, onDownloadClient, onDownloadPreparer, onPresent, onSend, onReset, onReviewData, onUploadMore, userContext: _userContext, }: TaxAxisDashboardProps): React.JSX.Element;
|
|
@@ -42,7 +42,7 @@ const BUCKETS = [
|
|
|
42
42
|
{ key: "30d", label: "Within 30 Days", desc: "Documentation or payroll changes" },
|
|
43
43
|
{ key: "90d", label: "Within 90 Days", desc: "Structural changes — new accounts or plan setup" },
|
|
44
44
|
];
|
|
45
|
-
function TaxAxisDashboard({ profile, onDownloadClient, onDownloadPreparer, onPresent, onSend, onReset, onReviewData, userContext: _userContext = "expert", }) {
|
|
45
|
+
function TaxAxisDashboard({ profile, onDownloadClient, onDownloadPreparer, onPresent, onSend, onReset, onReviewData, onUploadMore, userContext: _userContext = "expert", }) {
|
|
46
46
|
// ─── Derived data ──────────────────────────────────────────────
|
|
47
47
|
const computed = (0, react_1.useMemo)(() => (0, compute_1.computeAllStrategies)(profile), [profile]);
|
|
48
48
|
const dashEligible = (0, react_1.useMemo)(() => (0, compute_1.filterEligibleStrategies)(profile), [profile]);
|
|
@@ -77,8 +77,23 @@ function TaxAxisDashboard({ profile, onDownloadClient, onDownloadPreparer, onPre
|
|
|
77
77
|
const c = computed.get(selected.rank);
|
|
78
78
|
return Object.assign(Object.assign({}, selected), { lo: (_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : selected.lo, hi: (_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : selected.hi, sources: (_c = c === null || c === void 0 ? void 0 : c.sources) !== null && _c !== void 0 ? _c : selected.sources, trace: (_d = c === null || c === void 0 ? void 0 : c.trace) !== null && _d !== void 0 ? _d : selected.trace });
|
|
79
79
|
}, [selected, computed]);
|
|
80
|
-
//
|
|
81
|
-
const
|
|
80
|
+
// Split eligible strategies into calculable (hi > 0) vs uncalculated ($0K)
|
|
81
|
+
const calculable = (0, react_1.useMemo)(() => dashEligible.filter((s) => { var _a, _b; return ((_b = (_a = computed.get(s.rank)) === null || _a === void 0 ? void 0 : _a.hi) !== null && _b !== void 0 ? _b : s.hi) > 0; }), [dashEligible, computed]);
|
|
82
|
+
const uncalculated = (0, react_1.useMemo)(() => dashEligible.filter((s) => { var _a, _b; return ((_b = (_a = computed.get(s.rank)) === null || _a === void 0 ? void 0 : _a.hi) !== null && _b !== void 0 ? _b : s.hi) === 0; }), [dashEligible, computed]);
|
|
83
|
+
// Sorted calculable strategies for impact distribution
|
|
84
|
+
const sortedByImpact = (0, react_1.useMemo)(() => [...calculable].sort((a, b) => { var _a, _b, _c, _d; return ((_b = (_a = computed.get(b.rank)) === null || _a === void 0 ? void 0 : _a.hi) !== null && _b !== void 0 ? _b : b.hi) - ((_d = (_c = computed.get(a.rank)) === null || _c === void 0 ? void 0 : _c.hi) !== null && _d !== void 0 ? _d : a.hi); }), [calculable, computed]);
|
|
85
|
+
// Reverse-map: strategy name → document names needed (from DOC_SPECS_BASE)
|
|
86
|
+
const strategyDocNeeds = (0, react_1.useMemo)(() => {
|
|
87
|
+
const map = new Map();
|
|
88
|
+
uncalculated.forEach((s) => {
|
|
89
|
+
const docs = data_1.DOC_SPECS_BASE
|
|
90
|
+
.filter((d) => d.strategies.some((st) => s.name.includes(st) || st.includes(s.code)))
|
|
91
|
+
.map((d) => d.name);
|
|
92
|
+
map.set(s.name, docs.length > 0 ? docs : ["Upload additional documents"]);
|
|
93
|
+
});
|
|
94
|
+
return map;
|
|
95
|
+
}, [uncalculated]);
|
|
96
|
+
const [uncalcExpanded, setUncalcExpanded] = (0, react_1.useState)(false);
|
|
82
97
|
return (react_1.default.createElement("div", null,
|
|
83
98
|
react_1.default.createElement(DashboardSummary_1.DashboardSummary, { profile: profile, dashEligible: dashEligible, computed: computed, dataConfirmed: dataConfirmed, reviewUnreviewed: reviewStatus.unreviewed }),
|
|
84
99
|
react_1.default.createElement(DashboardTopBar_1.DashboardTopBar, { topTab: topTab, setTopTab: setTopTab, dataConfirmed: dataConfirmed, reviewUnreviewed: reviewStatus.unreviewed }),
|
|
@@ -139,6 +154,23 @@ function TaxAxisDashboard({ profile, onDownloadClient, onDownloadPreparer, onPre
|
|
|
139
154
|
marginBottom: "-1px",
|
|
140
155
|
} }, lbl)))),
|
|
141
156
|
reportTab === "report" ? (react_1.default.createElement("div", null,
|
|
157
|
+
reviewStatus.unreviewed > 0 && (react_1.default.createElement("div", { className: "rounded-[14px] mb-4 flex items-center gap-3", style: {
|
|
158
|
+
background: "rgba(251,154,29,0.06)",
|
|
159
|
+
border: "1px solid rgba(251,154,29,0.20)",
|
|
160
|
+
borderLeft: "4px solid #FB9A1D",
|
|
161
|
+
padding: "14px 20px",
|
|
162
|
+
} },
|
|
163
|
+
react_1.default.createElement("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", className: "flex-shrink-0" },
|
|
164
|
+
react_1.default.createElement("path", { d: "M8 1.5l6.5 12H1.5L8 1.5z", stroke: "#FB9A1D", strokeWidth: "1.3", fill: "none" }),
|
|
165
|
+
react_1.default.createElement("path", { d: "M8 6.5v3M8 11h.005", stroke: "#FB9A1D", strokeWidth: "1.3", strokeLinecap: "round" })),
|
|
166
|
+
react_1.default.createElement("div", { className: "flex-1" },
|
|
167
|
+
react_1.default.createElement("span", { className: "text-[13px] font-semibold text-white font-tax-axis-body" },
|
|
168
|
+
reviewStatus.unreviewed,
|
|
169
|
+
" extracted value",
|
|
170
|
+
reviewStatus.unreviewed > 1 ? "s" : "",
|
|
171
|
+
" flagged for review"),
|
|
172
|
+
react_1.default.createElement("span", { className: "text-[12px] text-tax-axis-text-2 font-tax-axis-body ml-2" }, "\u2014 strategy savings may shift after corrections")),
|
|
173
|
+
onReviewData && (react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { variant: "secondary", onClick: onReviewData, className: "flex-shrink-0" }, "Review Extracted Values")))),
|
|
142
174
|
react_1.default.createElement("div", { className: "rounded-[14px] mb-4", style: {
|
|
143
175
|
background: "#0E1132",
|
|
144
176
|
border: "1px solid rgba(36,131,132,0.12)",
|
|
@@ -154,7 +186,7 @@ function TaxAxisDashboard({ profile, onDownloadClient, onDownloadPreparer, onPre
|
|
|
154
186
|
color: "#9498B8",
|
|
155
187
|
} }, chartExpanded ? "Collapse \u2191" : "Expand \u2193")),
|
|
156
188
|
sortedByImpact
|
|
157
|
-
.slice(0, chartExpanded ?
|
|
189
|
+
.slice(0, chartExpanded ? calculable.length : 12)
|
|
158
190
|
.map((s, i) => {
|
|
159
191
|
var _a, _b, _c, _d;
|
|
160
192
|
const chi = (_b = (_a = computed.get(s.rank)) === null || _a === void 0 ? void 0 : _a.hi) !== null && _b !== void 0 ? _b : s.hi;
|
|
@@ -179,24 +211,57 @@ function TaxAxisDashboard({ profile, onDownloadClient, onDownloadPreparer, onPre
|
|
|
179
211
|
"\u2013",
|
|
180
212
|
fmtK(chi))));
|
|
181
213
|
}),
|
|
182
|
-
!chartExpanded &&
|
|
214
|
+
!chartExpanded && calculable.length > 12 && (react_1.default.createElement("div", { onClick: () => setChartExpanded(true), className: "text-[11px] text-tax-axis-teal-light font-tax-axis-mono mt-1 cursor-pointer hover:underline" },
|
|
183
215
|
"+ ",
|
|
184
|
-
|
|
216
|
+
calculable.length - 12,
|
|
185
217
|
" more strategies \u2014 click to view all")),
|
|
186
218
|
chartExpanded && (react_1.default.createElement("div", { onClick: () => setChartExpanded(false), className: "text-[11px] text-tax-axis-text-3 font-tax-axis-mono mt-1 cursor-pointer hover:text-tax-axis-teal" },
|
|
187
219
|
"Showing all ",
|
|
188
|
-
|
|
220
|
+
calculable.length,
|
|
189
221
|
" strategies \u2014 click to collapse"))),
|
|
190
222
|
react_1.default.createElement("div", { className: "text-[13px] font-bold text-white uppercase tracking-widest mb-2.5 font-tax-axis-head flex justify-between items-center" },
|
|
191
223
|
react_1.default.createElement("span", null,
|
|
192
|
-
|
|
224
|
+
calculable.length,
|
|
193
225
|
" Strategies"),
|
|
194
226
|
react_1.default.createElement("span", { className: "font-normal normal-case tracking-normal text-tax-axis-text-2 text-xs font-tax-axis-body" }, "Click to explore")),
|
|
195
|
-
react_1.default.createElement("div", { className: "grid grid-cols-2 gap-2.5 mb-4" },
|
|
227
|
+
react_1.default.createElement("div", { className: "grid grid-cols-2 gap-2.5 mb-4" }, calculable.map((s, i) => {
|
|
196
228
|
var _a, _b;
|
|
197
229
|
const c = computed.get(s.rank);
|
|
198
230
|
return (react_1.default.createElement(StrategyTile_1.StrategyTile, { key: s.rank, s: Object.assign(Object.assign({}, s), { lo: (_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : s.lo, hi: (_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : s.hi }), delay: 0.2 + i * 0.06, onClick: () => setSelected(s), maxSavings: maxSavings }));
|
|
199
231
|
})),
|
|
232
|
+
uncalculated.length > 0 && (react_1.default.createElement("div", { className: "rounded-[14px] overflow-hidden mb-4", style: {
|
|
233
|
+
background: "#0E1132",
|
|
234
|
+
border: "1px solid rgba(251,154,29,0.15)",
|
|
235
|
+
boxShadow: "0 2px 8px rgba(6,8,33,0.3)",
|
|
236
|
+
} },
|
|
237
|
+
react_1.default.createElement("div", { onClick: () => setUncalcExpanded((p) => !p), className: "px-5 py-3.5 flex items-center gap-3 cursor-pointer" },
|
|
238
|
+
react_1.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", className: "flex-shrink-0" },
|
|
239
|
+
react_1.default.createElement("circle", { cx: "7", cy: "7", r: "5.5", stroke: "#FB9A1D", strokeWidth: "1.2" }),
|
|
240
|
+
react_1.default.createElement("path", { d: "M7 4.5v3M7 9.5h.005", stroke: "#FB9A1D", strokeWidth: "1.2", strokeLinecap: "round" })),
|
|
241
|
+
react_1.default.createElement("span", { className: "text-[13px] font-semibold text-white font-tax-axis-body flex-1" },
|
|
242
|
+
uncalculated.length,
|
|
243
|
+
" strateg",
|
|
244
|
+
uncalculated.length > 1 ? "ies" : "y",
|
|
245
|
+
" need more data to calculate savings"),
|
|
246
|
+
react_1.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", style: {
|
|
247
|
+
transform: uncalcExpanded ? "rotate(180deg)" : "none",
|
|
248
|
+
transition: "transform .2s",
|
|
249
|
+
} },
|
|
250
|
+
react_1.default.createElement("path", { d: "M3 4.5l3 3 3-3", stroke: "#9498B8", strokeWidth: "1.5", strokeLinecap: "round" }))),
|
|
251
|
+
uncalcExpanded && (react_1.default.createElement("div", { style: { borderTop: "1px solid rgba(251,154,29,0.12)", padding: "12px 20px" } },
|
|
252
|
+
uncalculated.map((s, i) => (react_1.default.createElement("div", { key: s.rank, className: "py-2.5", style: {
|
|
253
|
+
borderBottom: i < uncalculated.length - 1
|
|
254
|
+
? "1px solid rgba(36,131,132,0.08)"
|
|
255
|
+
: "none",
|
|
256
|
+
} },
|
|
257
|
+
react_1.default.createElement("div", { className: "flex items-center gap-2.5 mb-1" },
|
|
258
|
+
react_1.default.createElement("span", { className: "text-[11px] font-tax-axis-mono px-2 py-0.5 rounded", style: { color: "#FB9A1D", background: "rgba(251,154,29,0.08)", border: "1px solid rgba(251,154,29,0.15)" } }, s.code),
|
|
259
|
+
react_1.default.createElement("span", { className: "text-[13px] text-white font-tax-axis-body font-semibold" }, s.name)),
|
|
260
|
+
react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-2 font-tax-axis-body pl-0.5" },
|
|
261
|
+
"Needs: ",
|
|
262
|
+
(strategyDocNeeds.get(s.name) || ["Upload additional documents"]).join(", "))))),
|
|
263
|
+
onUploadMore && (react_1.default.createElement("div", { className: "pt-3 mt-1", style: { borderTop: "1px solid rgba(251,154,29,0.12)" } },
|
|
264
|
+
react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { variant: "secondary", onClick: onUploadMore }, "Upload Documents"))))))),
|
|
200
265
|
react_1.default.createElement("div", { className: "rounded-[14px] overflow-hidden mb-4", style: {
|
|
201
266
|
background: "#0E1132",
|
|
202
267
|
border: "1px solid rgba(36,131,132,0.12)",
|
|
@@ -11,8 +11,10 @@ interface DocumentCardProps {
|
|
|
11
11
|
tierBadgeColor: "red" | "orange" | "neutral";
|
|
12
12
|
tierBadgeText: string;
|
|
13
13
|
helpOverride?: string;
|
|
14
|
+
fieldCount?: number;
|
|
14
15
|
onUpload: () => void;
|
|
15
16
|
onClear: () => void;
|
|
17
|
+
onReview?: () => void;
|
|
16
18
|
}
|
|
17
|
-
export declare function DocumentCard({ doc, tierBorderColor, tierBadgeColor, tierBadgeText, helpOverride, onUpload, onClear, }: DocumentCardProps): React.JSX.Element;
|
|
19
|
+
export declare function DocumentCard({ doc, tierBorderColor, tierBadgeColor, tierBadgeText, helpOverride, fieldCount, onUpload, onClear, onReview, }: DocumentCardProps): React.JSX.Element;
|
|
18
20
|
export {};
|
|
@@ -25,7 +25,7 @@ const STATUS_STYLES = {
|
|
|
25
25
|
cardBorder: "rgba(15,110,86,0.25)",
|
|
26
26
|
},
|
|
27
27
|
};
|
|
28
|
-
function DocumentCard({ doc, tierBorderColor, tierBadgeColor, tierBadgeText, helpOverride, onUpload, onClear, }) {
|
|
28
|
+
function DocumentCard({ doc, tierBorderColor, tierBadgeColor, tierBadgeText, helpOverride, fieldCount, onUpload, onClear, onReview, }) {
|
|
29
29
|
var _a;
|
|
30
30
|
const ss = STATUS_STYLES[doc.status];
|
|
31
31
|
const leftBorder = doc.status === "valid" ? "rgba(15,110,86,0.6)" : tierBorderColor;
|
|
@@ -49,10 +49,22 @@ function DocumentCard({ doc, tierBorderColor, tierBadgeColor, tierBadgeText, hel
|
|
|
49
49
|
react_1.default.createElement("div", { className: "flex items-center gap-1.5" },
|
|
50
50
|
react_1.default.createElement("span", { className: "text-[13px] font-medium text-white font-tax-axis-body" }, doc.name),
|
|
51
51
|
doc.status === "empty" && (react_1.default.createElement(TaxAxisBadge_1.TaxAxisBadge, { color: tierBadgeColor, size: "xs" }, tierBadgeText))),
|
|
52
|
-
react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-3 font-tax-axis-body mt-0.5" },
|
|
52
|
+
react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-3 font-tax-axis-body mt-0.5" }, doc.status === "valid" && doc.fileName
|
|
53
|
+
? `${doc.fileName}${fieldCount ? ` \u00b7 ${fieldCount} fields extracted` : ""}`
|
|
54
|
+
: ((_a = doc.fileName) !== null && _a !== void 0 ? _a : (helpOverride !== null && helpOverride !== void 0 ? helpOverride : doc.help)))),
|
|
53
55
|
react_1.default.createElement("div", { className: "flex items-center gap-2 flex-shrink-0" },
|
|
54
56
|
doc.status === "valid" && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
55
|
-
react_1.default.createElement("
|
|
57
|
+
react_1.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none" },
|
|
58
|
+
react_1.default.createElement("path", { d: "M2.5 7l3.5 3.5 5.5-6", stroke: "#0F6E56", strokeWidth: "2", strokeLinecap: "round" })),
|
|
59
|
+
react_1.default.createElement("button", { onClick: onReview, className: "rounded-md px-3 py-1 text-[11px] font-semibold font-tax-axis-mono cursor-pointer flex items-center gap-1.5", style: {
|
|
60
|
+
background: "rgba(99,102,241,0.12)",
|
|
61
|
+
border: "1px solid rgba(99,102,241,0.30)",
|
|
62
|
+
color: "#a5b4fc",
|
|
63
|
+
} },
|
|
64
|
+
react_1.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none" },
|
|
65
|
+
react_1.default.createElement("rect", { x: "2", y: "1.5", width: "8", height: "9", rx: "1.5", stroke: "#a5b4fc", strokeWidth: "1.2" }),
|
|
66
|
+
react_1.default.createElement("path", { d: "M4 4.5h4M4 6.5h4M4 8.5h2", stroke: "#a5b4fc", strokeWidth: "0.9", strokeLinecap: "round" })),
|
|
67
|
+
"Review"),
|
|
56
68
|
react_1.default.createElement("button", { onClick: onClear, className: "bg-transparent border-none p-1 text-tax-axis-text-4 text-sm cursor-pointer" }, "\u00D7"))),
|
|
57
69
|
doc.status === "empty" && (react_1.default.createElement("button", { onClick: onUpload, className: "rounded-md px-3.5 py-1.5 text-[11px] font-semibold text-tax-axis-teal-light font-tax-axis-mono cursor-pointer", style: {
|
|
58
70
|
background: "rgba(36,131,132,0.10)",
|
|
@@ -6,8 +6,6 @@ export interface DocumentReviewModalProps {
|
|
|
6
6
|
documentName: string;
|
|
7
7
|
fileName: string;
|
|
8
8
|
jobId: string;
|
|
9
|
-
parsedData?: Record<string, unknown> | null;
|
|
10
|
-
onSaveReviewedData?: (fields: Record<string, string>) => Promise<void>;
|
|
11
9
|
onClose: () => void;
|
|
12
10
|
}
|
|
13
|
-
export declare function DocumentReviewModal({ documentId, documentName, fileName, jobId: _jobId,
|
|
11
|
+
export declare function DocumentReviewModal({ documentId, documentName, fileName, jobId: _jobId, onClose, }: DocumentReviewModalProps): React.JSX.Element;
|