@paro.io/expert-shared-components 1.14.22 → 1.14.24

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.
@@ -1,2 +1,18 @@
1
1
  import React from "react";
2
- export declare const HeaderNavBar: ({ setOpenDocumentModal, setOpenServiceLinesTemplate, setOpenExpertWallet, isWalletTester, isClientPortal, setFaqModal, setOpenOrganizationModal, isAIGPEnabled, setOpenImportClients }: any) => React.JSX.Element;
2
+ type HeaderNavBarProps = {
3
+ setOpenDocumentModal: (open: boolean) => void;
4
+ setOpenServiceLinesTemplate: (open: boolean) => void;
5
+ setOpenExpertWallet?: (open: boolean) => void;
6
+ isWalletTester?: boolean;
7
+ isClientPortal?: boolean;
8
+ setFaqModal: (open: boolean) => void;
9
+ setOpenOrganizationModal?: (open: boolean) => void;
10
+ isAIGPEnabled?: boolean;
11
+ setOpenImportClients?: (open: boolean) => void;
12
+ isByob?: boolean;
13
+ featureStatus?: Record<string, any>;
14
+ updateExpert?: (args: any) => Promise<any>;
15
+ expertId?: string;
16
+ };
17
+ export declare const HeaderNavBar: ({ setOpenDocumentModal, setOpenServiceLinesTemplate, setOpenExpertWallet, isWalletTester, isClientPortal, setFaqModal, setOpenOrganizationModal, isAIGPEnabled, setOpenImportClients, isByob, featureStatus, updateExpert, expertId, }: HeaderNavBarProps) => React.JSX.Element;
18
+ export {};
@@ -1,21 +1,133 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
4
24
  };
5
25
  Object.defineProperty(exports, "__esModule", { value: true });
6
26
  exports.HeaderNavBar = void 0;
7
- const react_1 = __importDefault(require("react"));
27
+ const react_1 = __importStar(require("react"));
8
28
  const base_icons_1 = require("@paro.io/base-icons");
9
29
  const base_ui_1 = require("@paro.io/base-ui");
10
30
  const icons_1 = require("@material-ui/icons");
11
- const HeaderNavBar = ({ setOpenDocumentModal, setOpenServiceLinesTemplate, setOpenExpertWallet, isWalletTester, isClientPortal = false, setFaqModal, setOpenOrganizationModal, isAIGPEnabled = false, setOpenImportClients }) => {
31
+ const core_1 = require("@material-ui/core");
32
+ const ReviewsTab_1 = require("../ReviewsTab/ReviewsTab");
33
+ const react_hot_toast_1 = require("react-hot-toast");
34
+ const CustomSwitch = (0, core_1.styled)(core_1.Switch)(({ theme }) => ({
35
+ width: 44,
36
+ height: 24,
37
+ padding: 0,
38
+ '& .MuiSwitch-switchBase': {
39
+ padding: '2px',
40
+ transitionDuration: '300ms',
41
+ position: 'absolute',
42
+ '&.Mui-checked': {
43
+ color: '#FFFFFF',
44
+ '& + .MuiSwitch-track': {
45
+ backgroundColor: '#248384',
46
+ opacity: 1,
47
+ border: 10,
48
+ },
49
+ '&.Mui-disabled + .MuiSwitch-track': {
50
+ opacity: 1,
51
+ backgroundColor: '#E2E2E2',
52
+ },
53
+ },
54
+ },
55
+ '& .MuiSwitch-track': {
56
+ borderRadius: 12,
57
+ border: '1px solid #CBD5E1',
58
+ backgroundColor: '#F1F5F9',
59
+ opacity: 1,
60
+ transition: theme.transitions.create(['background-color'], {
61
+ duration: 500,
62
+ }),
63
+ },
64
+ '& .MuiSwitch-thumb': {
65
+ width: 20,
66
+ height: 20,
67
+ borderRadius: '50%',
68
+ backgroundColor: '#FFFFFF',
69
+ },
70
+ }));
71
+ const HeaderNavBar = ({ setOpenDocumentModal, setOpenServiceLinesTemplate, setOpenExpertWallet, isWalletTester = false, isClientPortal = false, setFaqModal, setOpenOrganizationModal, isAIGPEnabled = false, setOpenImportClients, isByob = false, featureStatus = {}, updateExpert, expertId, }) => {
72
+ const [value, setValue] = (0, react_1.useState)('');
73
+ const [updating, setUpdtaing] = (0, react_1.useState)(false);
74
+ (0, react_1.useEffect)(() => {
75
+ if (featureStatus.hasOwnProperty('byobDashboardView')) {
76
+ featureStatus.hasOwnProperty('byobDashboardView') && featureStatus.byobDashboardView === 'aigp' ? setValue('aigp') : setValue('marketPlace');
77
+ }
78
+ }, [featureStatus]);
79
+ const updateFeatureStatus = (status) => {
80
+ const updateFeatureStatus = Object.assign(Object.assign({}, featureStatus), { byobDashboardView: status });
81
+ setUpdtaing(true);
82
+ updateExpert && updateExpert({
83
+ variables: {
84
+ expertId: expertId,
85
+ input: {
86
+ featureStatus: updateFeatureStatus
87
+ }
88
+ },
89
+ }).then(() => {
90
+ (0, ReviewsTab_1.toastNotification)({
91
+ position: 'top-center',
92
+ color: 'success',
93
+ message: 'Updated successfully!',
94
+ icon: 'success',
95
+ });
96
+ setValue(status);
97
+ }).catch(() => {
98
+ (0, ReviewsTab_1.toastNotification)({
99
+ position: 'top-center',
100
+ color: 'warning',
101
+ message: 'Update failed!',
102
+ icon: 'warning'
103
+ });
104
+ }).finally(() => {
105
+ setUpdtaing(false);
106
+ });
107
+ };
12
108
  return (react_1.default.createElement("div", { className: "flex w-full bg-white p-2 shadow-sm justify-start" },
13
109
  react_1.default.createElement("div", { style: { display: 'flex', justifyContent: 'flex-end', gap: '8px' } },
14
- !isClientPortal && isAIGPEnabled && (react_1.default.createElement(base_ui_1.Button, { onClick: () => { setOpenImportClients(true); }, label: "AI Growth Platform", iconLeft: react_1.default.createElement(icons_1.Android, { fontSize: "medium", className: "text-black" }), size: "sm", id: "aigp_button", color: "primary", iconRight: react_1.default.createElement(base_ui_1.Tag, { color: "danger", label: "New!", variant: "subtle" }) })),
15
- !isClientPortal && (react_1.default.createElement(base_ui_1.Button, { id: "reactour__inviteToFirmButton", onClick: () => { setOpenOrganizationModal(true); }, label: "Manage Firm", iconLeft: react_1.default.createElement(icons_1.GroupAdd, { fontSize: "medium", className: "text-black" }), size: "sm" })),
16
- !isClientPortal && isWalletTester && (react_1.default.createElement(base_ui_1.Button, { id: "expert_wallet_button", onClick: () => setOpenExpertWallet(true), label: "Wallet", iconLeft: react_1.default.createElement(base_icons_1.IconCash, { size: "md" }), size: "sm" })),
110
+ !isClientPortal && isAIGPEnabled && react_1.default.createElement(react_1.default.Fragment, null, isByob && featureStatus.hasOwnProperty('byobDashboardView')
111
+ ?
112
+ react_1.default.createElement("div", { className: "flex flex-row justify-start items-center space-x-2" },
113
+ react_1.default.createElement("p", { className: `${value === "marketPlace" && "font-bold text-success"}` }, "Market Place"),
114
+ updating
115
+ ?
116
+ react_1.default.createElement(core_1.CircularProgress, { size: 18 })
117
+ :
118
+ react_1.default.createElement(CustomSwitch, { checked: value === "aigp", onChange: (e) => { updateFeatureStatus(e.target.checked ? 'aigp' : 'marketPlace'); } }),
119
+ react_1.default.createElement("p", { className: `${value === 'aigp' && "font-bold text-success"}` }, "AIGP Growth Platform"))
120
+ : react_1.default.createElement(base_ui_1.Button, { onClick: () => { setOpenImportClients && setOpenImportClients(true); }, label: "AI Growth Platform", iconLeft: react_1.default.createElement(icons_1.Android, { fontSize: "medium", className: "text-black" }), size: "sm", id: "aigp_button", color: "primary", iconRight: react_1.default.createElement(base_ui_1.Tag, { color: "danger", label: "New!", variant: "subtle" }) })),
121
+ !isClientPortal && (react_1.default.createElement(base_ui_1.Button, { id: "reactour__inviteToFirmButton", onClick: () => { setOpenOrganizationModal && setOpenOrganizationModal(true); }, label: "Manage Firm", iconLeft: react_1.default.createElement(icons_1.GroupAdd, { fontSize: "medium", className: "text-black" }), size: "sm" })),
122
+ !isClientPortal && isWalletTester && setOpenExpertWallet && (react_1.default.createElement(base_ui_1.Button, { id: "expert_wallet_button", onClick: () => setOpenExpertWallet(true), label: "Wallet", iconLeft: react_1.default.createElement(base_icons_1.IconCash, { size: "md" }), size: "sm" })),
17
123
  !isClientPortal && (react_1.default.createElement(base_ui_1.Button, { id: "service_lines_button", onClick: () => setOpenServiceLinesTemplate(true), label: "Service Lines", iconLeft: react_1.default.createElement(base_icons_1.IconBriefcase, { size: "md" }), size: "sm" })),
18
124
  react_1.default.createElement(base_ui_1.Button, { id: "document_center_button", onClick: () => setOpenDocumentModal(true), label: "Document Center", iconLeft: react_1.default.createElement(base_icons_1.IconDocumentText, { size: "md" }), size: "sm" }),
19
- react_1.default.createElement(base_ui_1.Button, { id: "reactour__faqbutton", onClick: () => { setFaqModal(true); }, label: "FAQ", iconLeft: react_1.default.createElement(icons_1.ForumOutlined, { fontSize: "medium", className: "text-black" }), size: "sm" }))));
125
+ react_1.default.createElement(base_ui_1.Button, { id: "reactour__faqbutton", onClick: () => { setFaqModal(true); }, label: "FAQ", iconLeft: react_1.default.createElement(icons_1.ForumOutlined, { fontSize: "medium", className: "text-black" }), size: "sm" })),
126
+ react_1.default.createElement(react_hot_toast_1.Toaster, { position: "top-center", toastOptions: {
127
+ style: {
128
+ zIndex: 9999,
129
+ backgroundColor: 'transparent'
130
+ },
131
+ } })));
20
132
  };
21
133
  exports.HeaderNavBar = HeaderNavBar;
@@ -46,6 +46,7 @@ const DecisionSection = ({ dispute, onUpdateDispute, updateInvoiceMutation, upda
46
46
  var _a, _b, _c, _d;
47
47
  const totalDisputeHours = (_a = dispute === null || dispute === void 0 ? void 0 : dispute.disputeProjects) === null || _a === void 0 ? void 0 : _a.reduce((acc, project) => acc + (project === null || project === void 0 ? void 0 : project.disputeHours), 0);
48
48
  const [resolution, setResolution] = (0, react_1.useState)('');
49
+ const [internalNote, setInternalNote] = (0, react_1.useState)((dispute === null || dispute === void 0 ? void 0 : dispute.internalNote) || '');
49
50
  const [approvedHours, setApprovedHours] = (0, react_1.useState)(totalDisputeHours);
50
51
  const [projectApprovedHours, setProjectApprovedHours] = (0, react_1.useState)({});
51
52
  const [isSubmitting, setIsSubmitting] = (0, react_1.useState)(false);
@@ -165,6 +166,7 @@ const DecisionSection = ({ dispute, onUpdateDispute, updateInvoiceMutation, upda
165
166
  const updateData = {
166
167
  disputeId: dispute.disputeId,
167
168
  status: "Resolved",
169
+ internalNote: internalNote,
168
170
  approvedAmount: calculatedApprovedAmount,
169
171
  finalDecisionOwnerId: (user === null || user === void 0 ? void 0 : user.userId) || null,
170
172
  projectDisputes: disputeProjectUpdates
@@ -254,8 +256,10 @@ const DecisionSection = ({ dispute, onUpdateDispute, updateInvoiceMutation, upda
254
256
  `Total Approved Hours: ${getTotalApprovedHours().toFixed(2)} / ${totalDisputeHours} hours`) : (
255
257
  // All non-hourly disputes
256
258
  `Total Approved Amount: $${getTotalApprovedHours().toFixed(2)} / $${dispute.disputeProjects.reduce((sum, p) => sum + p.disputeAmount, 0).toFixed(2)}`)))),
259
+ react_1.default.createElement("div", { className: "w-full" },
260
+ react_1.default.createElement(base_ui_1.Input, { value: internalNote, onChange: (e) => setInternalNote(e.target.value), placeholder: "Provide details...", label: "Internal Note", isRequired: true })),
257
261
  react_1.default.createElement("div", { className: "flex justify-end space-x-4" },
258
- react_1.default.createElement(base_ui_1.Button, { label: "Approve & Resolve", color: "primary", onClick: handleApproveClick, isLoading: isSubmitting, disabled: !resolution || (resolution === 'PARTIAL' && !isValidPartialApproval()), size: "md" }))),
262
+ react_1.default.createElement(base_ui_1.Button, { label: "Approve & Resolve", color: "primary", onClick: handleApproveClick, isLoading: isSubmitting, disabled: !resolution || (resolution === 'PARTIAL' && !isValidPartialApproval()) || internalNote === '', size: "md" }))),
259
263
  react_1.default.createElement(ProjectHoursAdjustmentModal_1.ProjectHoursAdjustmentModal, { isOpen: showHoursModal, onClose: () => setShowHoursModal(false), disputeProjects: (dispute === null || dispute === void 0 ? void 0 : dispute.disputeProjects) || [], dispute: dispute, onSubmit: handleHoursSubmit, isSubmitting: isSubmitting, getClientInvoiceSummaryByMonth: getClientInvoiceSummaryByMonth, getClientPendingPayouts: getClientPendingPayouts, invoiceSummary: invoiceSummary, approvedHours: resolution === 'PARTIAL' ? getTotalApprovedHours() : totalDisputeHours, projectApprovedHours: isPartialWithMultipleProjects ? projectApprovedHours : {}, user: user })));
260
264
  };
261
265
  exports.DecisionSection = DecisionSection;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paro.io/expert-shared-components",
3
- "version": "1.14.22",
3
+ "version": "1.14.24",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -64,4 +64,4 @@
64
64
  "directories": {
65
65
  "lib": "lib"
66
66
  }
67
- }
67
+ }