@paro.io/expert-shared-components 1.10.9 → 1.11.1

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 (75) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +2 -2
  3. package/lib/components/ClientReferencesSection/DeleteButton.js +11 -11
  4. package/lib/components/ClientReferencesSection/ParoError.js +10 -10
  5. package/lib/components/ClientReferencesSection/TagsSection.js +2 -2
  6. package/lib/components/ClientReferencesSection/styles/BrandedTypography.js +2 -2
  7. package/lib/components/ClientReferencesSection/styles/Buttons.js +15 -15
  8. package/lib/components/ClientReferencesSection/styles/Name.js +5 -5
  9. package/lib/components/ClientReferencesSection/styles/NullContentConditionalColor.js +4 -4
  10. package/lib/components/ClientReferencesSection/styles/SectionBody.js +11 -11
  11. package/lib/components/ClientReferencesSection/styles/SectionTitle.js +6 -6
  12. package/lib/components/ClientReferencesSection/styles/Tags.js +2 -2
  13. package/lib/components/DiscussionThread/DiscussionThread.d.ts +25 -0
  14. package/lib/components/DiscussionThread/DiscussionThread.js +115 -0
  15. package/lib/components/DiscussionThread/chat.d.ts +22 -0
  16. package/lib/components/DiscussionThread/chat.js +106 -0
  17. package/lib/components/DiscussionThread/index.d.ts +1 -0
  18. package/lib/components/DiscussionThread/index.js +5 -0
  19. package/lib/components/DocumentCenter/DocumentTable.d.ts +15 -15
  20. package/lib/components/DocumentCenter/DocumentTable.js +350 -350
  21. package/lib/components/DocumentCenter/UploadFilesButton.d.ts +6 -6
  22. package/lib/components/DocumentCenter/UploadFilesButton.js +29 -29
  23. package/lib/components/EarningsTracker/ActiveProjectCard.d.ts +52 -52
  24. package/lib/components/EarningsTracker/ActiveProjectCard.js +161 -161
  25. package/lib/components/EarningsTracker/CenterCardUI.d.ts +13 -13
  26. package/lib/components/EarningsTracker/CenterCardUI.js +134 -134
  27. package/lib/components/EarningsTracker/EarningsTracker.d.ts +52 -52
  28. package/lib/components/EarningsTracker/EarningsTracker.js +508 -508
  29. package/lib/components/EarningsTracker/EditDateModal.d.ts +22 -22
  30. package/lib/components/EarningsTracker/EditDateModal.js +149 -149
  31. package/lib/components/EarningsTracker/EmailModal.d.ts +14 -14
  32. package/lib/components/EarningsTracker/EmailModal.js +79 -79
  33. package/lib/components/EarningsTracker/EndProjectModal.d.ts +56 -56
  34. package/lib/components/EarningsTracker/EndProjectModal.js +221 -221
  35. package/lib/components/EarningsTracker/LeftCardUI.d.ts +18 -18
  36. package/lib/components/EarningsTracker/LeftCardUI.js +189 -189
  37. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.d.ts +52 -52
  38. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.js +358 -358
  39. package/lib/components/EarningsTracker/ProgressBar.d.ts +4 -4
  40. package/lib/components/EarningsTracker/ProgressBar.js +66 -66
  41. package/lib/components/EarningsTracker/ReviewRequestModal.d.ts +17 -17
  42. package/lib/components/EarningsTracker/ReviewRequestModal.js +135 -135
  43. package/lib/components/EarningsTracker/RightCardUI.d.ts +46 -46
  44. package/lib/components/EarningsTracker/RightCardUI.js +231 -231
  45. package/lib/components/EarningsTracker/index.d.ts +1 -1
  46. package/lib/components/EarningsTracker/index.js +5 -5
  47. package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
  48. package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -7
  49. package/lib/components/Invoices/InvoiceCard.d.ts +5 -0
  50. package/lib/components/Invoices/InvoiceCard.js +233 -0
  51. package/lib/components/Invoices/index.d.ts +1 -0
  52. package/lib/components/Invoices/index.js +5 -0
  53. package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
  54. package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
  55. package/lib/components/OrganizationChart/PersonCard.js +5 -5
  56. package/lib/components/OrganizationChart/utils.js +79 -79
  57. package/lib/components/ProjectCard/ActiveProjectCard.js +21 -1
  58. package/lib/components/ProjectCard/ProgressBar.js +4 -4
  59. package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
  60. package/lib/components/ProjectCard/RightCardUI.d.ts +2 -1
  61. package/lib/components/ProjectCard/RightCardUI.js +2 -2
  62. package/lib/components/Reviews/Pagination.js +6 -6
  63. package/lib/components/ReviewsTab/RatingHeader.js +6 -6
  64. package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
  65. package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
  66. package/lib/components/shared/Image.js +13 -13
  67. package/lib/components/shared/ProfileTextField.d.ts +18 -18
  68. package/lib/components/shared/ProfileTextField.js +16 -16
  69. package/lib/components/shared/StyledActionButtons.d.ts +7 -7
  70. package/lib/components/shared/StyledActionButtons.js +15 -15
  71. package/lib/components/shared/ToastNotification.d.ts +10 -10
  72. package/lib/components/shared/ToastNotification.js +63 -63
  73. package/lib/index.d.ts +2 -0
  74. package/lib/index.js +5 -1
  75. package/package.json +61 -61
@@ -0,0 +1,233 @@
1
+ "use strict";
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;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.InvoiceCard = void 0;
27
+ const react_1 = __importStar(require("react"));
28
+ const base_ui_1 = require("@paro.io/base-ui");
29
+ const base_ui_2 = require("@paro.io/base-ui");
30
+ const core_1 = require("@material-ui/core");
31
+ const base_icons_1 = require("@paro.io/base-icons");
32
+ const DiscussionThread_1 = require("../DiscussionThread");
33
+ const useStyles = (0, core_1.makeStyles)((theme) => ({
34
+ root: {
35
+ width: "100%",
36
+ },
37
+ paper: {
38
+ width: "100%",
39
+ },
40
+ table: {
41
+ minWidth: '95%',
42
+ border: "1px solid",
43
+ borderColor: "#E2E8F0",
44
+ },
45
+ visuallyHidden: {
46
+ border: 0,
47
+ clip: "rect(0 0 0 0)",
48
+ height: 1,
49
+ margin: -1,
50
+ overflow: "hidden",
51
+ padding: 0,
52
+ position: "absolute",
53
+ top: 20,
54
+ width: 1,
55
+ },
56
+ tableCell: {
57
+ width: "auto",
58
+ },
59
+ collapse: {
60
+ backgroundColor: "#FFFFFF",
61
+ width: "100%",
62
+ borderRadius: 6,
63
+ marginLeft: 12,
64
+ marginTop: 12,
65
+ },
66
+ tableHead: {
67
+ backgroundColor: "#F1F5F9",
68
+ borderRadius: 6,
69
+ width: "100%",
70
+ },
71
+ }));
72
+ const headCells = [
73
+ { id: 'project', label: 'Project' },
74
+ { id: 'projectType', label: 'Project Type' },
75
+ { id: 'hours', label: 'Hours' },
76
+ { id: 'amount', label: 'Amount' },
77
+ { id: 'reason', label: 'Reason' },
78
+ ];
79
+ const ACCEPTED_FILE_TYPES = [
80
+ 'application/pdf',
81
+ 'application/msword',
82
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
83
+ ];
84
+ const validateFileUpload = (file) => {
85
+ if (!file) {
86
+ return false;
87
+ }
88
+ if (!ACCEPTED_FILE_TYPES.includes(file.type)) {
89
+ return false;
90
+ }
91
+ if (file.size > 5242880) { //5MB size
92
+ return false;
93
+ }
94
+ return true;
95
+ };
96
+ const InvoiceCard = ({ clientInvoice, createDisputeChatMessage, user }) => {
97
+ const [expandRow, setExpandRow] = (0, react_1.useState)(null);
98
+ const classes = useStyles();
99
+ const [projects, setProjects] = (0, react_1.useState)(clientInvoice.disputeProjects);
100
+ const [editingRowId, setEditingRowId] = (0, react_1.useState)(null);
101
+ const [editedExplanation, setEditedExplanation] = (0, react_1.useState)('');
102
+ const [discussion, setDiscussion] = (0, react_1.useState)('');
103
+ const fileInputRef = (0, react_1.useRef)(null);
104
+ const handleChange = (e, field) => {
105
+ const updatedProject = field === "clientDocumentLinks" ? projects.map((project) => {
106
+ if (project.projectId === expandRow) {
107
+ return Object.assign(Object.assign({}, project), { clientDocumentLinks: [...project.clientDocumentLinks, ...e.filter((name) => !project.clientDocumentLinks.includes(name))] });
108
+ }
109
+ return project;
110
+ }) : projects.map((project) => {
111
+ return Object.assign(Object.assign({}, project), { [field]: e.target.value });
112
+ });
113
+ //upload files mutation
114
+ setProjects(updatedProject);
115
+ };
116
+ const handleUpload = (event) => {
117
+ const selectedFiles = event.target.files;
118
+ if (!selectedFiles)
119
+ return;
120
+ const validFiles = Array.from(selectedFiles)
121
+ .filter(file => validateFileUpload(file))
122
+ .map(file => file.name);
123
+ if (validFiles.length === 0)
124
+ return;
125
+ handleChange(validFiles, "clientDocumentLinks");
126
+ if (fileInputRef.current) {
127
+ fileInputRef.current.value = '';
128
+ }
129
+ };
130
+ return (react_1.default.createElement(base_ui_1.Card, { className: `mx-2 my-4 md:mx-8 flex md:flex items-center justify-between rounded flex-col` },
131
+ react_1.default.createElement("div", { key: clientInvoice.invoice.id, className: "bg-[#0F172A] text-white mb-1 p-4 relative top-0 left-0 w-full rounded flex flex-row justify-evenly" },
132
+ react_1.default.createElement("b", null,
133
+ "Dispute Invoice #",
134
+ clientInvoice.invoice.id),
135
+ react_1.default.createElement("p", null,
136
+ "Disputed: ",
137
+ clientInvoice.disputeDate),
138
+ react_1.default.createElement("p", null,
139
+ "Invoice Date: ",
140
+ clientInvoice.invoice.dateGenerated)),
141
+ react_1.default.createElement("div", { className: "flex flex-row justify-start items-center gap-2" },
142
+ clientInvoice && // for in progress
143
+ react_1.default.createElement(base_ui_1.Tag, { color: "warning", label: "In Progress", variant: "subtle" }),
144
+ clientInvoice && // for resolved
145
+ react_1.default.createElement(base_ui_1.Tag, { color: "success", label: "Resolved", variant: "subtle" }),
146
+ clientInvoice && // for submitted
147
+ react_1.default.createElement(base_ui_1.Tag, { color: "danger", label: "Submitted", variant: "subtle" }),
148
+ clientInvoice && // for acion taken
149
+ react_1.default.createElement(base_ui_1.Tag, { color: "success", label: "Invoice reduced", variant: "subtle" }),
150
+ clientInvoice && // for editable upto
151
+ react_1.default.createElement(base_ui_1.Tag, { color: "warning", label: "Editable until May 30", variant: "subtle" }),
152
+ clientInvoice && // for under review
153
+ react_1.default.createElement(base_ui_1.Tag, { color: "info", label: "Under Review", variant: "subtle" }),
154
+ react_1.default.createElement("div", { className: "flex ml-2 items-center" }, "Last updated: date")),
155
+ react_1.default.createElement("div", { className: "w-[95%] m-2" },
156
+ react_1.default.createElement(core_1.Table, { className: classes.table, "aria-labelledby": "tableTitle", size: 'medium', "aria-label": "enhanced table" },
157
+ react_1.default.createElement(core_1.TableHead, { className: classes.tableHead },
158
+ react_1.default.createElement(core_1.TableRow, null,
159
+ headCells.map((headcell) => {
160
+ return react_1.default.createElement(core_1.TableCell, { key: headcell.id, className: classes.tableCell }, headcell.label);
161
+ }),
162
+ react_1.default.createElement(core_1.TableCell, { className: classes.tableCell }))),
163
+ projects.map((row) => (react_1.default.createElement(react_1.default.Fragment, null,
164
+ react_1.default.createElement(core_1.TableRow, { key: row.projectId },
165
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.project.name),
166
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.disputeType),
167
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.hours),
168
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.disputeAmount),
169
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.disputeReasonCode),
170
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell },
171
+ react_1.default.createElement(core_1.IconButton, { onClick: () => { setExpandRow(expandRow === row.projectId ? null : row.projectId); } }, expandRow === row.projectId ? react_1.default.createElement(base_icons_1.IconChevronUp, null) : react_1.default.createElement(base_icons_1.IconChevronDown, null)))),
172
+ expandRow &&
173
+ react_1.default.createElement(core_1.TableRow, null,
174
+ react_1.default.createElement(core_1.TableCell, { colSpan: headCells.length + 1, style: { paddingBottom: 0, paddingTop: 0 } },
175
+ react_1.default.createElement(core_1.Collapse, { in: expandRow === row.projectId, timeout: "auto", unmountOnExit: true },
176
+ react_1.default.createElement(react_1.default.Fragment, null,
177
+ react_1.default.createElement(base_ui_1.Card, { className: `bg-[#F8F9FA] m-2 md:mx-8 flex md:flex items-start justify-between rounded flex-col w-[95%] p-6` },
178
+ react_1.default.createElement("b", { className: "mb-2 flex flex-row justify-start items-center" },
179
+ "Explanation:",
180
+ editingRowId === row.projectId ? (react_1.default.createElement(react_1.default.Fragment, null,
181
+ react_1.default.createElement(base_ui_2.Input, { label: "", type: "text", className: "w-96 mx-4 overflow-ellipsis", value: editedExplanation, onChange: (e) => setEditedExplanation(e.target.value), placeholder: "Please provide an explanation", isInvalid: !editedExplanation, isInvalidText: "Please provide an explanation" }),
182
+ react_1.default.createElement(base_ui_2.Button, { label: "Save", size: "md", color: "success", className: "ml-2 mt-1", onClick: () => {
183
+ setProjects((prev) => prev.map((p) => p.projectId === row.projectId
184
+ ? Object.assign(Object.assign({}, p), { clientExplanation: editedExplanation }) : p));
185
+ setEditingRowId(null);
186
+ } }))) : (react_1.default.createElement(base_ui_2.Button, { label: "Edit", iconLeft: react_1.default.createElement(base_icons_1.IconPencil, { size: 'sm' }), onClick: () => {
187
+ setEditedExplanation(row.clientExplanation);
188
+ setEditingRowId(row.projectId);
189
+ }, size: "sm", color: "info", className: "ml-6" }))),
190
+ react_1.default.createElement("p", null, row.clientExplanation),
191
+ react_1.default.createElement("b", { className: "flex flex-row flex-wrap justify-start items-center mt-2" },
192
+ "Supporting Documents:",
193
+ react_1.default.createElement("input", { id: "upload-file", type: "file", multiple: true, accept: ".pdf,.doc,.docx", style: { display: 'none' }, ref: fileInputRef, onChange: handleUpload }),
194
+ react_1.default.createElement(base_ui_2.Button, { label: "Add File", iconLeft: react_1.default.createElement(base_icons_1.IconPlus, { size: 'sm' }), onClick: () => { fileInputRef.current && fileInputRef.current.click(); }, size: 'sm', color: "info", className: "mx-2" }),
195
+ row.clientDocumentLinks.map((f) => {
196
+ return react_1.default.createElement("div", { className: "mx-2" },
197
+ react_1.default.createElement(base_ui_1.Tag, { variant: "subtle", color: "success", label: f, iconRight: react_1.default.createElement(base_icons_1.IconXCircle, null), onClick: () => {
198
+ const updatedFiles = projects.map((p) => {
199
+ const updatedFiles = p.files.filter((file) => file !== f);
200
+ return Object.assign(Object.assign({}, p), { files: updatedFiles });
201
+ });
202
+ setProjects(updatedFiles);
203
+ } }));
204
+ }))),
205
+ react_1.default.createElement("b", { className: "ml-8 mt-4 mr-auto" }, "Discussion: "),
206
+ react_1.default.createElement(base_ui_1.Card, { className: `bg-[#EFF6FF] m-2 md:mx-8 flex md:flex justify-start rounded flex-col w-[95%] p-4` }, row.discussion.map((obj) => {
207
+ return obj.paroSupport ?
208
+ react_1.default.createElement("div", { className: "flex flex-row w-[80%] justify-start" },
209
+ react_1.default.createElement("div", { className: "flex justify-center items-center bg-[#26A69A] h-12 w-12 rounded-full text-2xl text-white" }, "PS"),
210
+ react_1.default.createElement("div", { className: "flex flex-col items-start ml-4" },
211
+ react_1.default.createElement("b", null,
212
+ "Paro Support: ",
213
+ react_1.default.createElement("span", null, "Apr 3, 2025")),
214
+ " ",
215
+ react_1.default.createElement("p", null, "We've received your dispute and are reviewing the timesheet discrepancies."),
216
+ react_1.default.createElement("p", null, "We'll follow up with the expert and update you by Apr 5."),
217
+ react_1.default.createElement("p", null, obj.paroSupport)))
218
+ :
219
+ react_1.default.createElement("div", { className: "flex flex-row-reverse w-[85%] justify-items-end items-center ml-auto my-1" },
220
+ react_1.default.createElement("div", { className: "flex justify-center items-center bg-[#4cbaff] h-12 w-12 rounded-full text-2xl text-white ml-4" }, "A"),
221
+ react_1.default.createElement("p", null, obj.you));
222
+ })),
223
+ react_1.default.createElement("div", { className: "flex flex-row w-[95%] m-2 ml-4 justify-start" },
224
+ react_1.default.createElement(DiscussionThread_1.DiscussionThread, { currentUser: user, initialThreads: clientInvoice.chatMessages, createDisputeChatMessage: createDisputeChatMessage }),
225
+ react_1.default.createElement(base_ui_2.Input, { label: "", type: "text", className: "w-[60vw] mx-4 overflow-ellipsis", value: discussion, onChange: (e) => setDiscussion(e.target.value), placeholder: "Type your reply here..." }),
226
+ react_1.default.createElement(base_ui_2.Button, { label: "Save", size: "md", color: "success", className: "ml-2 mt-1 w-full", disabled: !discussion, onClick: () => {
227
+ setProjects((prev) => prev.map((p) => p.projectId === row.projectId
228
+ ? Object.assign(Object.assign({}, p), { discussion: [...p.discussion, { you: discussion }] }) : p));
229
+ setEditingRowId(null);
230
+ setDiscussion('');
231
+ } })))))))))))));
232
+ };
233
+ exports.InvoiceCard = InvoiceCard;
@@ -0,0 +1 @@
1
+ export { InvoiceCard } from './InvoiceCard';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InvoiceCard = void 0;
4
+ var InvoiceCard_1 = require("./InvoiceCard");
5
+ Object.defineProperty(exports, "InvoiceCard", { enumerable: true, get: function () { return InvoiceCard_1.InvoiceCard; } });
@@ -1,15 +1,15 @@
1
- interface OrgChartProps {
2
- openModal: boolean;
3
- setOpenModal: (openModal: boolean) => void;
4
- expertFirms: any;
5
- firstName: string;
6
- lastName: string;
7
- imageUrl?: string;
8
- primaryServiceLine: string;
9
- city: string;
10
- stateAbbreviation: string;
11
- paroTenure?: string;
12
- isPublicProfile?: boolean;
13
- }
14
- export declare const OrganizationChart: ({ openModal, setOpenModal, expertFirms, firstName, lastName, imageUrl, primaryServiceLine, city, stateAbbreviation, paroTenure, isPublicProfile }: OrgChartProps) => JSX.Element;
15
- export {};
1
+ interface OrgChartProps {
2
+ openModal: boolean;
3
+ setOpenModal: (openModal: boolean) => void;
4
+ expertFirms: any;
5
+ firstName: string;
6
+ lastName: string;
7
+ imageUrl?: string;
8
+ primaryServiceLine: string;
9
+ city: string;
10
+ stateAbbreviation: string;
11
+ paroTenure?: string;
12
+ isPublicProfile?: boolean;
13
+ }
14
+ export declare const OrganizationChart: ({ openModal, setOpenModal, expertFirms, firstName, lastName, imageUrl, primaryServiceLine, city, stateAbbreviation, paroTenure, isPublicProfile }: OrgChartProps) => JSX.Element;
15
+ export {};