@paro.io/expert-shared-components 1.12.5 → 1.12.7

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 (73) 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/chat.d.ts +22 -22
  14. package/lib/components/DiscussionThread/chat.js +106 -106
  15. package/lib/components/DocumentCenter/DocumentTable.d.ts +15 -15
  16. package/lib/components/DocumentCenter/DocumentTable.js +350 -350
  17. package/lib/components/DocumentCenter/UploadFilesButton.d.ts +6 -6
  18. package/lib/components/DocumentCenter/UploadFilesButton.js +29 -29
  19. package/lib/components/EarningsTracker/ActiveProjectCard.d.ts +52 -52
  20. package/lib/components/EarningsTracker/ActiveProjectCard.js +161 -161
  21. package/lib/components/EarningsTracker/CenterCardUI.d.ts +13 -13
  22. package/lib/components/EarningsTracker/CenterCardUI.js +134 -134
  23. package/lib/components/EarningsTracker/EarningsTracker.d.ts +52 -52
  24. package/lib/components/EarningsTracker/EarningsTracker.js +508 -508
  25. package/lib/components/EarningsTracker/EditDateModal.d.ts +22 -22
  26. package/lib/components/EarningsTracker/EditDateModal.js +149 -149
  27. package/lib/components/EarningsTracker/EmailModal.d.ts +14 -14
  28. package/lib/components/EarningsTracker/EmailModal.js +79 -79
  29. package/lib/components/EarningsTracker/EndProjectModal.d.ts +56 -56
  30. package/lib/components/EarningsTracker/EndProjectModal.js +221 -221
  31. package/lib/components/EarningsTracker/LeftCardUI.d.ts +18 -18
  32. package/lib/components/EarningsTracker/LeftCardUI.js +189 -189
  33. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.d.ts +52 -52
  34. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.js +358 -358
  35. package/lib/components/EarningsTracker/ProgressBar.d.ts +4 -4
  36. package/lib/components/EarningsTracker/ProgressBar.js +66 -66
  37. package/lib/components/EarningsTracker/ReviewRequestModal.d.ts +17 -17
  38. package/lib/components/EarningsTracker/ReviewRequestModal.js +135 -135
  39. package/lib/components/EarningsTracker/RightCardUI.d.ts +46 -46
  40. package/lib/components/EarningsTracker/RightCardUI.js +231 -231
  41. package/lib/components/EarningsTracker/index.d.ts +1 -1
  42. package/lib/components/EarningsTracker/index.js +5 -5
  43. package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
  44. package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -7
  45. package/lib/components/FileDownloader/index.d.ts +2 -1
  46. package/lib/components/FileDownloader/index.js +2 -1
  47. package/lib/components/Invoices/ClientDisputeProjectCard.d.ts +3 -1
  48. package/lib/components/Invoices/ClientDisputeProjectCard.js +55 -34
  49. package/lib/components/Invoices/DiscussionSection.js +5 -12
  50. package/lib/components/Invoices/DisputeSection.d.ts +3 -1
  51. package/lib/components/Invoices/DisputeSection.js +22 -12
  52. package/lib/components/Invoices/InvoiceCard.d.ts +2 -1
  53. package/lib/components/Invoices/InvoiceCard.js +3 -3
  54. package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
  55. package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
  56. package/lib/components/OrganizationChart/PersonCard.js +5 -5
  57. package/lib/components/OrganizationChart/utils.js +79 -79
  58. package/lib/components/ProjectCard/ProgressBar.js +4 -4
  59. package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
  60. package/lib/components/Reviews/Pagination.js +6 -6
  61. package/lib/components/ReviewsTab/RatingHeader.js +6 -6
  62. package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
  63. package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
  64. package/lib/components/shared/DownloadClient.d.ts +1 -0
  65. package/lib/components/shared/DownloadClient.js +2 -1
  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/package.json +61 -61
@@ -32,7 +32,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
32
32
  });
33
33
  };
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.ClientDisputeProjectCard = void 0;
35
+ exports.ClientDisputeProjectCard = exports.handleDownloadDocument = void 0;
36
36
  const react_1 = __importStar(require("react"));
37
37
  const base_ui_1 = require("@paro.io/base-ui");
38
38
  const base_ui_2 = require("@paro.io/base-ui");
@@ -94,7 +94,58 @@ const ACCEPTED_FILE_TYPES = [
94
94
  'image/png',
95
95
  'text/csv',
96
96
  ];
97
- const ClientDisputeProjectCard = ({ clientInvoice, updateClientInvoiceDisputeMutation, documentUploadUrl, downloadDocumentUrl, }) => {
97
+ const handleFileDownload = ({ fileData, downloadFilename, streamData, fileType = 'pdf' }) => {
98
+ var _a, _b, _c;
99
+ let byteArray = streamData ? fileData : new Uint8Array();
100
+ if (!streamData) {
101
+ const byteCharacters = atob((_b = (_a = fileData === null || fileData === void 0 ? void 0 : fileData.data) === null || _a === void 0 ? void 0 : _a.getFile) === null || _b === void 0 ? void 0 : _b.data);
102
+ const byteNumbers = new Array(byteCharacters.length);
103
+ for (let i = 0; i < byteCharacters.length; i++) {
104
+ byteNumbers[i] = byteCharacters.charCodeAt(i);
105
+ }
106
+ byteArray = new Uint8Array(byteNumbers);
107
+ }
108
+ // Map file extensions to MIME types
109
+ const mimeTypes = {
110
+ 'pdf': 'application/pdf',
111
+ 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
112
+ 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
113
+ 'csv': 'text/csv',
114
+ 'doc': 'application/msword',
115
+ 'xls': 'application/vnd.ms-excel',
116
+ 'txt': 'text/plain',
117
+ 'png': 'image/png',
118
+ 'jpg': 'image/jpeg',
119
+ 'jpeg': 'image/jpeg'
120
+ };
121
+ // Get the file extension from the filename or use the provided fileType
122
+ const fileExtension = ((_c = downloadFilename.split('.').pop()) === null || _c === void 0 ? void 0 : _c.toLowerCase()) || fileType;
123
+ const mimeType = mimeTypes[fileExtension] || 'application/octet-stream';
124
+ const blob = new Blob([byteArray], { type: mimeType });
125
+ const blobUrl = URL.createObjectURL(blob);
126
+ const downloadLink = document.createElement('a');
127
+ downloadLink.href = blobUrl;
128
+ downloadLink.download = downloadFilename;
129
+ document.body.appendChild(downloadLink);
130
+ downloadLink.click();
131
+ document.body.removeChild(downloadLink);
132
+ URL.revokeObjectURL(blobUrl);
133
+ };
134
+ const handleDownloadDocument = (projectId, fileName, downloadDocumentUrl, bucketName) => __awaiter(void 0, void 0, void 0, function* () {
135
+ var _a;
136
+ // Decode the filename from URL encoding if needed
137
+ const decodedFileName = decodeURIComponent(fileName);
138
+ const downloadFileName = `project-${projectId}/${decodedFileName}`;
139
+ const downloadData = yield (0, FileDownloader_1.fileDownloader)({ downloadDocumentUrl: downloadDocumentUrl, fileKey: downloadFileName, bucketName: bucketName });
140
+ handleFileDownload({
141
+ fileData: downloadData,
142
+ downloadFilename: decodedFileName,
143
+ streamData: true,
144
+ fileType: (_a = decodedFileName.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()
145
+ });
146
+ });
147
+ exports.handleDownloadDocument = handleDownloadDocument;
148
+ const ClientDisputeProjectCard = ({ clientInvoice, updateClientInvoiceDisputeMutation, documentUploadUrl, downloadDocumentUrl, bucketName }) => {
98
149
  const [expandRow, setExpandRow] = (0, react_1.useState)(null);
99
150
  const classes = useStyles();
100
151
  const [projects, setProjects] = (0, react_1.useState)(clientInvoice === null || clientInvoice === void 0 ? void 0 : clientInvoice.disputeProjects);
@@ -104,36 +155,6 @@ const ClientDisputeProjectCard = ({ clientInvoice, updateClientInvoiceDisputeMut
104
155
  const [updatingDispute, setUpdatingDispute] = (0, react_1.useState)(false);
105
156
  const [uploadingFile, setUploadingFile] = (0, react_1.useState)(false);
106
157
  const fileInputRef = (0, react_1.useRef)(null);
107
- const handleDownloadPdf = ({ fileData, downloadFilename, streamData }) => {
108
- var _a, _b;
109
- let byteArray = streamData ? fileData : new Uint8Array();
110
- if (!streamData) {
111
- const byteCharacters = atob((_b = (_a = fileData === null || fileData === void 0 ? void 0 : fileData.data) === null || _a === void 0 ? void 0 : _a.getFile) === null || _b === void 0 ? void 0 : _b.data);
112
- const byteNumbers = new Array(byteCharacters.length);
113
- for (let i = 0; i < byteCharacters.length; i++) {
114
- byteNumbers[i] = byteCharacters.charCodeAt(i);
115
- }
116
- byteArray = new Uint8Array(byteNumbers);
117
- }
118
- const blob = new Blob([byteArray], { type: 'application/pdf' });
119
- const blobUrl = URL.createObjectURL(blob);
120
- const newTab = window.open(blobUrl, '_blank');
121
- const downloadLink = document.createElement('a');
122
- downloadLink.href = blobUrl;
123
- downloadLink.download = downloadFilename;
124
- document.body.appendChild(downloadLink);
125
- downloadLink.click();
126
- document.body.removeChild(downloadLink);
127
- URL.revokeObjectURL(blobUrl);
128
- if (newTab) {
129
- newTab.focus();
130
- }
131
- };
132
- const handleDownloadDocument = (projectId, fileName) => __awaiter(void 0, void 0, void 0, function* () {
133
- const downloadFileName = `project-${projectId}/${fileName}`;
134
- const downloadData = yield (0, FileDownloader_1.fileDownloader)({ downloadDocumentUrl: downloadDocumentUrl, fileKey: downloadFileName });
135
- handleDownloadPdf({ fileData: downloadData, downloadFilename: fileName, streamData: true });
136
- });
137
158
  (0, react_1.useEffect)(() => {
138
159
  if (JSON.stringify(clientInvoice === null || clientInvoice === void 0 ? void 0 : clientInvoice.disputeProjects) !== JSON.stringify(projects)) {
139
160
  setUpdateDispute(true);
@@ -274,8 +295,8 @@ const ClientDisputeProjectCard = ({ clientInvoice, updateClientInvoiceDisputeMut
274
295
  ((row === null || row === void 0 ? void 0 : row.clientDocumentLinks)
275
296
  ? (typeof (row === null || row === void 0 ? void 0 : row.clientDocumentLinks) === 'string' ? (_b = row === null || row === void 0 ? void 0 : row.clientDocumentLinks) === null || _b === void 0 ? void 0 : _b.split(',') : [...row === null || row === void 0 ? void 0 : row.clientDocumentLinks])
276
297
  : []).map((f, index) => (react_1.default.createElement("div", { key: index, className: "m-1" },
277
- react_1.default.createElement(base_ui_1.Tag, { variant: "subtle", color: "success", label: f.split('%2F')[1], iconRight: react_1.default.createElement(base_icons_1.IconXCircle, null), onClick: () => {
278
- handleDownloadDocument(row === null || row === void 0 ? void 0 : row.projectId, f.split('%2F')[1]);
298
+ react_1.default.createElement(base_ui_1.Tag, { variant: "subtle", color: "success", label: f.split('%2F')[1], onClick: () => {
299
+ (0, exports.handleDownloadDocument)(row === null || row === void 0 ? void 0 : row.projectId, f.split('%2F')[1], downloadDocumentUrl, bucketName);
279
300
  } })))))))))))));
280
301
  })),
281
302
  updatedDispute && react_1.default.createElement("div", { className: "flex justify-end ml-auto mt-2" },
@@ -51,7 +51,6 @@ const DiscussionSection = ({ disputeId, currentUser, messages, onCreateMessage,
51
51
  return uniqueUsers;
52
52
  }, [messages]);
53
53
  const handleSendMessage = () => __awaiter(void 0, void 0, void 0, function* () {
54
- var _a;
55
54
  if (!newMessage.trim())
56
55
  return;
57
56
  try {
@@ -62,7 +61,7 @@ const DiscussionSection = ({ disputeId, currentUser, messages, onCreateMessage,
62
61
  disputeId,
63
62
  messageText: newMessage,
64
63
  visibility,
65
- senderId: isInternal ? (_a = currentUser === null || currentUser === void 0 ? void 0 : currentUser.app_metadata) === null || _a === void 0 ? void 0 : _a.userId : currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId,
64
+ senderId: currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId,
66
65
  },
67
66
  },
68
67
  });
@@ -105,19 +104,13 @@ const DiscussionSection = ({ disputeId, currentUser, messages, onCreateMessage,
105
104
  }
106
105
  };
107
106
  const getMessageAlignment = (userTypeId) => {
108
- // First user in sequence is left-aligned, second is right-aligned
109
- const userIndex = userSequence.indexOf(userTypeId);
110
- return userIndex === 0 ? 'mr-auto' : 'ml-auto';
107
+ return userTypeId !== currentUser.userTypeId ? 'mr-auto' : 'ml-auto';
111
108
  };
112
109
  const getMessageOrder = (userTypeId) => {
113
- // First user in sequence shows avatar on left, second on right
114
- const userIndex = userSequence.indexOf(userTypeId);
115
- return userIndex === 0 ? 'flex-row' : 'flex-row-reverse';
110
+ return userTypeId !== currentUser.userTypeId ? 'flex-row' : 'flex-row-reverse';
116
111
  };
117
112
  const getHeaderAlignment = (userTypeId) => {
118
- // First user in sequence aligns text left, second aligns right
119
- const userIndex = userSequence.indexOf(userTypeId);
120
- return userIndex === 0 ? 'justify-start' : 'justify-end';
113
+ return userTypeId !== currentUser.userTypeId ? 'justify-start' : 'justify-end';
121
114
  };
122
115
  return (react_1.default.createElement("div", { className: "space-y-6" },
123
116
  react_1.default.createElement("div", { className: "flex items-center justify-between" },
@@ -146,7 +139,7 @@ const DiscussionSection = ({ disputeId, currentUser, messages, onCreateMessage,
146
139
  }, className: "w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0" },
147
140
  react_1.default.createElement("span", { className: "text-sm font-bold" }, getSenderInitial(message.sender))),
148
141
  react_1.default.createElement("div", { className: "flex-1" },
149
- react_1.default.createElement("div", { className: `flex items-center ${getHeaderAlignment(message.sender.userTypeId)} space-x-2` },
142
+ react_1.default.createElement("div", { className: `flex items-center ${getHeaderAlignment(message.sender.userTypeId)} space-x-2 mr-1` },
150
143
  react_1.default.createElement("span", { className: "text-sm font-bold text-[#333333]" },
151
144
  message.sender.firstName,
152
145
  " ",
@@ -1,7 +1,9 @@
1
1
  interface DisputeSectionProps {
2
2
  dispute: any;
3
3
  documentUploadUrl: string;
4
+ downloadDocumentUrl: string;
5
+ bucketName: string;
4
6
  updateClientInvoiceDisputeMutation: (variables: any) => Promise<any>;
5
7
  }
6
- export declare const DisputeSection: ({ dispute, documentUploadUrl, updateClientInvoiceDisputeMutation, }: DisputeSectionProps) => JSX.Element;
8
+ export declare const DisputeSection: ({ dispute, documentUploadUrl, downloadDocumentUrl, bucketName, updateClientInvoiceDisputeMutation, }: DisputeSectionProps) => JSX.Element;
7
9
  export {};
@@ -38,6 +38,7 @@ const base_ui_1 = require("@paro.io/base-ui");
38
38
  const base_icons_1 = require("@paro.io/base-icons");
39
39
  const FileUploader_1 = require("../FileUploader");
40
40
  const core_1 = require("@material-ui/core");
41
+ const ClientDisputeProjectCard_1 = require("./ClientDisputeProjectCard");
41
42
  const ACCEPTED_FILE_TYPES = [
42
43
  'application/pdf',
43
44
  'application/msword',
@@ -46,12 +47,14 @@ const ACCEPTED_FILE_TYPES = [
46
47
  'image/png',
47
48
  'text/csv',
48
49
  ];
49
- const DisputeSection = ({ dispute, documentUploadUrl, updateClientInvoiceDisputeMutation, }) => {
50
+ const DisputeSection = ({ dispute, documentUploadUrl, downloadDocumentUrl, bucketName, updateClientInvoiceDisputeMutation, }) => {
50
51
  var _a, _b, _c;
51
- const fileInputRef = (0, react_1.useRef)(null);
52
+ const expertFileInputRef = (0, react_1.useRef)(null);
53
+ const clientFileInputRef = (0, react_1.useRef)(null);
52
54
  const disputeProject = (_a = dispute === null || dispute === void 0 ? void 0 : dispute.disputeProjects) === null || _a === void 0 ? void 0 : _a[0];
53
55
  const clientDocumentLinks = (_b = disputeProject === null || disputeProject === void 0 ? void 0 : disputeProject.clientDocumentLinks) === null || _b === void 0 ? void 0 : _b.split(',');
54
56
  const expertDocumentLinks = (_c = disputeProject === null || disputeProject === void 0 ? void 0 : disputeProject.expertDocumentLinks) === null || _c === void 0 ? void 0 : _c.split(',');
57
+ const projectId = disputeProject === null || disputeProject === void 0 ? void 0 : disputeProject.projectId;
55
58
  const validateFileUpload = (file) => {
56
59
  return ACCEPTED_FILE_TYPES.includes(file.type);
57
60
  };
@@ -86,8 +89,11 @@ const DisputeSection = ({ dispute, documentUploadUrl, updateClientInvoiceDispute
86
89
  reader.readAsDataURL(selectedFile);
87
90
  });
88
91
  }
89
- if (fileInputRef.current) {
90
- fileInputRef.current.value = '';
92
+ if (expertFileInputRef.current) {
93
+ expertFileInputRef.current.value = '';
94
+ }
95
+ if (clientFileInputRef.current) {
96
+ clientFileInputRef.current.value = '';
91
97
  }
92
98
  };
93
99
  return (react_1.default.createElement("div", { className: "grid grid-cols-2 gap-6" },
@@ -104,17 +110,19 @@ const DisputeSection = ({ dispute, documentUploadUrl, updateClientInvoiceDispute
104
110
  react_1.default.createElement("div", null,
105
111
  react_1.default.createElement("div", { className: "text-sm font-bold text-[#333333] mb-2" }, "Supporting Documents:"),
106
112
  react_1.default.createElement("div", { className: "flex flex-wrap gap-2" },
107
- react_1.default.createElement("input", { ref: fileInputRef, type: "file", multiple: true, accept: ACCEPTED_FILE_TYPES.join(','), className: "hidden", onChange: (e) => handleUpload(e, false) }),
108
- react_1.default.createElement("div", { className: "flex flex-wrap gap-2" }, expertDocumentLinks === null || expertDocumentLinks === void 0 ? void 0 : expertDocumentLinks.map((file, index) => (
113
+ react_1.default.createElement("input", { ref: clientFileInputRef, type: "file", multiple: true, accept: ACCEPTED_FILE_TYPES.join(','), className: "hidden", onChange: (e) => handleUpload(e, false) }),
114
+ react_1.default.createElement("div", { className: "flex flex-wrap gap-2" }, clientDocumentLinks === null || clientDocumentLinks === void 0 ? void 0 : clientDocumentLinks.map((file, index) => (
109
115
  // @ts-ignore
110
- react_1.default.createElement(core_1.Chip, { key: index, label: file.split('%2F').pop(), variant: "outlined", onClick: () => { window.open(file, '_blank'); }, sx: {
116
+ react_1.default.createElement(core_1.Chip, { key: index, label: file.split('%2F').pop(), variant: "outlined", onClick: () => {
117
+ (0, ClientDisputeProjectCard_1.handleDownloadDocument)(projectId, file.split('%2F')[1], downloadDocumentUrl, bucketName);
118
+ }, sx: {
111
119
  '&:hover': {
112
120
  cursor: 'pointer',
113
121
  backgroundColor: 'rgba(76, 175, 80, 0.1)'
114
122
  }
115
123
  } })))),
116
124
  react_1.default.createElement("div", { className: "w-full mt-2" },
117
- react_1.default.createElement(base_ui_1.Button, { label: "Add File", iconLeft: react_1.default.createElement(base_icons_1.IconPlus, { size: "sm" }), onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, size: "sm", color: "info", className: "bg-white border border-[#248384] text-[#248384]" })))))),
125
+ react_1.default.createElement(base_ui_1.Button, { label: "Add File", iconLeft: react_1.default.createElement(base_icons_1.IconPlus, { size: "sm" }), onClick: () => { var _a; return (_a = clientFileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, size: "sm", color: "info", className: "bg-white border border-[#248384] text-[#248384]" })))))),
118
126
  react_1.default.createElement("div", { className: "space-y-4" },
119
127
  react_1.default.createElement("div", { className: "flex items-center justify-between" },
120
128
  react_1.default.createElement("div", { className: "text-lg font-bold text-[#333333]" }, "Expert Rebuttal")),
@@ -125,16 +133,18 @@ const DisputeSection = ({ dispute, documentUploadUrl, updateClientInvoiceDispute
125
133
  react_1.default.createElement("div", null,
126
134
  react_1.default.createElement("div", { className: "text-sm font-bold text-[#333333] mb-2" }, "Supporting Documents:"),
127
135
  react_1.default.createElement("div", { className: "flex flex-wrap gap-2" },
128
- react_1.default.createElement("input", { ref: fileInputRef, type: "file", multiple: true, accept: ACCEPTED_FILE_TYPES.join(','), className: "hidden", onChange: (e) => handleUpload(e, true) }),
129
- react_1.default.createElement("div", { className: "flex flex-wrap gap-2" }, clientDocumentLinks === null || clientDocumentLinks === void 0 ? void 0 : clientDocumentLinks.map((file, index) => (
136
+ react_1.default.createElement("input", { ref: expertFileInputRef, type: "file", multiple: true, accept: ACCEPTED_FILE_TYPES.join(','), className: "hidden", onChange: (e) => handleUpload(e, true) }),
137
+ react_1.default.createElement("div", { className: "flex flex-wrap gap-2" }, expertDocumentLinks === null || expertDocumentLinks === void 0 ? void 0 : expertDocumentLinks.map((file, index) => (
130
138
  // @ts-ignore
131
- react_1.default.createElement(core_1.Chip, { key: index, label: file.split('%2F').pop(), variant: "outlined", onClick: () => { window.open(file, '_blank'); }, sx: {
139
+ react_1.default.createElement(core_1.Chip, { key: index, label: file.split('%2F').pop(), variant: "outlined", onClick: () => {
140
+ (0, ClientDisputeProjectCard_1.handleDownloadDocument)(projectId, file.split('%2F')[1], downloadDocumentUrl, bucketName);
141
+ }, sx: {
132
142
  '&:hover': {
133
143
  cursor: 'pointer',
134
144
  backgroundColor: 'rgba(76, 175, 80, 0.1)'
135
145
  }
136
146
  } })))),
137
147
  react_1.default.createElement("div", { className: "w-full mt-2" },
138
- react_1.default.createElement(base_ui_1.Button, { label: "Add File", iconLeft: react_1.default.createElement(base_icons_1.IconPlus, { size: "sm" }), onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, size: "sm", color: "info", className: "bg-white border border-[#248384] text-[#248384]" }))))))));
148
+ react_1.default.createElement(base_ui_1.Button, { label: "Add File", iconLeft: react_1.default.createElement(base_icons_1.IconPlus, { size: "sm" }), onClick: () => { var _a; return (_a = expertFileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, size: "sm", color: "info", className: "bg-white border border-[#248384] text-[#248384]" }))))))));
139
149
  };
140
150
  exports.DisputeSection = DisputeSection;
@@ -7,6 +7,7 @@ interface InvoiceCardProps {
7
7
  documentUploadUrl: string;
8
8
  downloadDocumentUrl: string;
9
9
  isInternal?: boolean;
10
+ bucketName?: string;
10
11
  }
11
- export declare const InvoiceCard: ({ clientInvoice, createDisputeChatMessage, user, chatMessages, updateClientInvoiceDisputeMutation, documentUploadUrl, downloadDocumentUrl, isInternal, }: InvoiceCardProps) => JSX.Element;
12
+ export declare const InvoiceCard: ({ clientInvoice, createDisputeChatMessage, user, chatMessages, updateClientInvoiceDisputeMutation, documentUploadUrl, downloadDocumentUrl, isInternal, bucketName }: InvoiceCardProps) => JSX.Element;
12
13
  export {};
@@ -12,16 +12,16 @@ const DisputeSection_1 = require("./DisputeSection");
12
12
  const DiscussionSection_1 = require("./DiscussionSection");
13
13
  const DecisionSection_1 = require("./DecisionSection");
14
14
  const ClientDisputeProjectCard_1 = require("./ClientDisputeProjectCard");
15
- const InvoiceCard = ({ clientInvoice, createDisputeChatMessage, user, chatMessages, updateClientInvoiceDisputeMutation, documentUploadUrl, downloadDocumentUrl, isInternal = false, }) => {
15
+ const InvoiceCard = ({ clientInvoice, createDisputeChatMessage, user, chatMessages, updateClientInvoiceDisputeMutation, documentUploadUrl, downloadDocumentUrl, isInternal = false, bucketName }) => {
16
16
  var _a, _b;
17
17
  return (react_1.default.createElement(base_ui_1.Card, { className: "w-full bg-white rounded-lg shadow-sm overflow-hidden mb-4" },
18
18
  react_1.default.createElement(InvoiceHeader_1.InvoiceHeader, { invoice: clientInvoice }),
19
19
  react_1.default.createElement("div", { className: "p-6 space-y-6" },
20
20
  react_1.default.createElement(InvoiceDetails_1.InvoiceDetails, { invoice: clientInvoice, isInternal: isInternal }),
21
21
  isInternal ?
22
- react_1.default.createElement(DisputeSection_1.DisputeSection, { dispute: clientInvoice, documentUploadUrl: documentUploadUrl, updateClientInvoiceDisputeMutation: updateClientInvoiceDisputeMutation })
22
+ react_1.default.createElement(DisputeSection_1.DisputeSection, { dispute: clientInvoice, documentUploadUrl: documentUploadUrl, updateClientInvoiceDisputeMutation: updateClientInvoiceDisputeMutation, downloadDocumentUrl: downloadDocumentUrl, bucketName: bucketName })
23
23
  :
24
- react_1.default.createElement(ClientDisputeProjectCard_1.ClientDisputeProjectCard, { clientInvoice: clientInvoice, updateClientInvoiceDisputeMutation: updateClientInvoiceDisputeMutation, documentUploadUrl: documentUploadUrl, downloadDocumentUrl: downloadDocumentUrl }),
24
+ react_1.default.createElement(ClientDisputeProjectCard_1.ClientDisputeProjectCard, { clientInvoice: clientInvoice, updateClientInvoiceDisputeMutation: updateClientInvoiceDisputeMutation, documentUploadUrl: documentUploadUrl, downloadDocumentUrl: downloadDocumentUrl, bucketName: bucketName }),
25
25
  (clientInvoice === null || clientInvoice === void 0 ? void 0 : clientInvoice.chatEnabled) && (react_1.default.createElement(DiscussionSection_1.DiscussionSection, { disputeId: (_b = (_a = clientInvoice === null || clientInvoice === void 0 ? void 0 : clientInvoice.disputeProjects) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.id, currentUser: user, messages: chatMessages, onCreateMessage: createDisputeChatMessage, isInternal: isInternal })),
26
26
  isInternal &&
27
27
  react_1.default.createElement(DecisionSection_1.DecisionSection, { dispute: clientInvoice, onUpdateDispute: updateClientInvoiceDisputeMutation }))));
@@ -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 {};