@paro.io/expert-shared-components 1.11.0 → 1.11.2

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.
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ interface ChatMessages {
3
+ messageId: number;
4
+ disputeId: number;
5
+ sender: {
6
+ id: number;
7
+ email: string;
8
+ firstName: string;
9
+ lastName: string;
10
+ userTypeId: number;
11
+ avatar: string | null;
12
+ };
13
+ messageText: string;
14
+ visibility: "ALL" | "INTERNAL_ONLY" | "CLIENT_INTERNAL_ONLY" | "EXPERT_INTERNAL_ONLY";
15
+ createdAt: string;
16
+ updatedAt: string;
17
+ isDeleted: boolean;
18
+ }
19
+ interface DiscussionThreadProps {
20
+ currentUser: any;
21
+ initialThreads: ChatMessages[] | [];
22
+ createDisputeChatMessage: any;
23
+ }
24
+ export declare const DiscussionThread: ({ currentUser, initialThreads, createDisputeChatMessage, }: DiscussionThreadProps) => React.JSX.Element;
25
+ export {};
@@ -0,0 +1,114 @@
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.DiscussionThread = void 0;
27
+ const react_1 = __importStar(require("react"));
28
+ const base_ui_1 = require("@paro.io/base-ui");
29
+ const DiscussionThread = ({ currentUser, initialThreads, createDisputeChatMessage, }) => {
30
+ const [messages, setMessages] = (0, react_1.useState)(initialThreads);
31
+ const [comment, setComment] = (0, react_1.useState)("");
32
+ const threadsEndRef = (0, react_1.useRef)(null);
33
+ const [invalid, setInvalid] = (0, react_1.useState)(false);
34
+ // Auto scroll to bottom when messages change
35
+ (0, react_1.useEffect)(() => {
36
+ var _a;
37
+ (_a = threadsEndRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ behavior: "smooth" });
38
+ }, [messages]);
39
+ const handleSend = () => {
40
+ setInvalid(false);
41
+ if (comment) {
42
+ createDisputeChatMessage();
43
+ handleSendMessage();
44
+ setComment("");
45
+ }
46
+ else {
47
+ setInvalid(true);
48
+ }
49
+ };
50
+ const handleSendMessage = () => {
51
+ const newMsg = {
52
+ messageId: 0, // update required
53
+ disputeId: messages[0].disputeId,
54
+ sender: {
55
+ id: currentUser.id,
56
+ email: currentUser.email,
57
+ firstName: currentUser.name.split(' ')[0] || '',
58
+ lastName: currentUser.name.split(' ')[1] || '',
59
+ userTypeId: currentUser.userTypeId,
60
+ avatar: currentUser.avatar,
61
+ },
62
+ messageText: comment,
63
+ visibility: "ALL",
64
+ createdAt: new Date().toISOString(),
65
+ updatedAt: new Date().toISOString(),
66
+ isDeleted: false,
67
+ };
68
+ setMessages([...messages, newMsg]);
69
+ setComment("");
70
+ };
71
+ const handleKeyPress = (e) => {
72
+ if (e.key === "Enter" && !e.shiftKey) {
73
+ e.preventDefault();
74
+ handleSend();
75
+ }
76
+ };
77
+ const formatTime = (timestamp) => {
78
+ const date = new Date(timestamp);
79
+ return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }) +
80
+ ' · ' + date.toLocaleDateString([], { month: 'short', day: 'numeric', year: 'numeric' });
81
+ };
82
+ const getInitials = (name) => {
83
+ return name
84
+ .split(' ')
85
+ .map(word => word[0])
86
+ .join('')
87
+ .toUpperCase()
88
+ .substring(0, 2);
89
+ };
90
+ return (react_1.default.createElement("div", { className: "flex flex-col w-full rounded-lg bg-white px-4 h-auto" },
91
+ react_1.default.createElement("div", { className: `py-3 flex items-center` },
92
+ react_1.default.createElement("div", { className: "font-semibold text-gray-800 capitalize" }, "Discussion Thread")),
93
+ react_1.default.createElement("div", { className: "flex-1 max-h-[30vh] overflow-y-auto border rounded-md p-2" },
94
+ messages.map((message) => {
95
+ var _a;
96
+ const isCurrentUser = currentUser.id === message.sender.id;
97
+ const userName = message.sender.firstName + message.sender.lastName;
98
+ const timestamp = message.updatedAt ? message.updatedAt : message.createdAt;
99
+ return (react_1.default.createElement("div", { key: message.messageId, className: `flex mb-4 ${isCurrentUser ? 'justify-end' : 'justify-start'}` },
100
+ !isCurrentUser && (react_1.default.createElement("div", { className: "flex-shrink-0 mr-2" }, ((_a = message.sender) === null || _a === void 0 ? void 0 : _a.avatar) ? (react_1.default.createElement("img", { src: message.sender.avatar, alt: userName, className: "h-8 w-8 rounded-full" })) : (react_1.default.createElement("div", { className: "h-8 w-8 rounded-full bg-gray-400 flex items-center justify-center text-white text-xs font-medium bg-[#5f4508]" }, getInitials(userName || 'User'))))),
101
+ react_1.default.createElement("div", { className: `ml-1 min-w-min max-w-[75%] break-words` },
102
+ !isCurrentUser && (react_1.default.createElement("div", { className: "text-xs text-gray-500 font-medium mb-1" }, userName || 'Unknown User')),
103
+ react_1.default.createElement("div", { className: `px-4 py-2 rounded-lg ${isCurrentUser
104
+ ? 'bg-[#dbefef] rounded-br-none'
105
+ : 'bg-[#f9d8a7] border rounded-bl-none'}` }, message.messageText),
106
+ react_1.default.createElement("div", { className: "text-xs text-gray-500 mt-1" }, formatTime(timestamp)))));
107
+ }),
108
+ react_1.default.createElement("div", { ref: threadsEndRef })),
109
+ react_1.default.createElement("div", { className: "py-3" },
110
+ react_1.default.createElement("div", { className: "flex items-center" },
111
+ react_1.default.createElement("textarea", { value: comment, onChange: (e) => setComment(e.target.value), onKeyDown: handleKeyPress, placeholder: "Type your message here...", className: "flex-1 border rounded-lg px-3 py-2 resize-none focus:outline-none focus:ring-2 focus:ring-blue-500", rows: 1 }),
112
+ react_1.default.createElement(base_ui_1.Button, { label: "Send", onClick: handleSend, disabled: !comment.trim(), color: "primary", className: "ml-2 px-4 py-2" })))));
113
+ };
114
+ exports.DiscussionThread = DiscussionThread;
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ interface ChatProps {
3
+ currentUser: {
4
+ id: number;
5
+ name: string;
6
+ avatar: null;
7
+ };
8
+ initialThreads: {
9
+ id: number;
10
+ content: string;
11
+ sender: {
12
+ id: string;
13
+ name: string;
14
+ avatar: string | null;
15
+ };
16
+ timestamp: string;
17
+ isCurrentUser: boolean;
18
+ }[] | [];
19
+ updateChatMutation: () => void;
20
+ }
21
+ export declare const Chat: ({ currentUser, initialThreads, updateChatMutation, }: ChatProps) => React.JSX.Element;
22
+ export {};
@@ -0,0 +1,106 @@
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.Chat = void 0;
27
+ const base_ui_1 = require("@paro.io/base-ui");
28
+ const react_1 = __importStar(require("react"));
29
+ const Chat = ({ currentUser, initialThreads, updateChatMutation, }) => {
30
+ const [messages, setMessages] = (0, react_1.useState)(initialThreads);
31
+ const [comment, setComment] = (0, react_1.useState)("");
32
+ const threadsEndRef = (0, react_1.useRef)(null);
33
+ const [invalid, setInvalid] = (0, react_1.useState)(false);
34
+ // Auto scroll to bottom when messages change
35
+ (0, react_1.useEffect)(() => {
36
+ var _a;
37
+ (_a = threadsEndRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ behavior: "smooth" });
38
+ }, [messages]);
39
+ const handleSend = () => {
40
+ setInvalid(false);
41
+ if (comment) {
42
+ updateChatMutation();
43
+ handleSendMessage();
44
+ setComment("");
45
+ }
46
+ else {
47
+ setInvalid(true);
48
+ }
49
+ };
50
+ // Handle sending a new message
51
+ const handleSendMessage = () => {
52
+ const newMsg = {
53
+ id: Date.now(),
54
+ content: comment,
55
+ sender: Object.assign(Object.assign({}, currentUser), { id: currentUser.id.toString() }),
56
+ timestamp: new Date().toISOString(),
57
+ isCurrentUser: true
58
+ };
59
+ setMessages([...messages, newMsg]);
60
+ setComment("");
61
+ };
62
+ // Handle key press (send on Enter)
63
+ const handleKeyPress = (e) => {
64
+ if (e.key === "Enter" && !e.shiftKey) {
65
+ e.preventDefault();
66
+ handleSend();
67
+ }
68
+ };
69
+ // Format timestamp
70
+ const formatTime = (timestamp) => {
71
+ const date = new Date(timestamp);
72
+ return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }) +
73
+ ' · ' + date.toLocaleDateString([], { month: 'short', day: 'numeric', year: 'numeric' });
74
+ };
75
+ // Get initials for avatar
76
+ const getInitials = (name) => {
77
+ return name
78
+ .split(' ')
79
+ .map(word => word[0])
80
+ .join('')
81
+ .toUpperCase()
82
+ .substring(0, 2);
83
+ };
84
+ return (react_1.default.createElement("div", { className: "flex flex-col w-full rounded-lg bg-white px-4 h-auto" },
85
+ react_1.default.createElement("div", { className: `py-3 flex items-center` },
86
+ react_1.default.createElement("div", { className: "font-semibold text-gray-800 capitalize" }, "Discussion Thread")),
87
+ react_1.default.createElement("div", { className: "flex-1 max-h-[30vh] overflow-y-auto border rounded-md p-2" },
88
+ messages.map((message) => {
89
+ var _a, _b, _c;
90
+ return (react_1.default.createElement("div", { key: message.id, className: `flex mb-4 ${message.isCurrentUser ? 'justify-end' : 'justify-start'}` },
91
+ !message.isCurrentUser && (react_1.default.createElement("div", { className: "flex-shrink-0 mr-2" }, ((_a = message.sender) === null || _a === void 0 ? void 0 : _a.avatar) ? (react_1.default.createElement("img", { src: message.sender.avatar, alt: message.sender.name, className: "h-8 w-8 rounded-full" })) : (react_1.default.createElement("div", { className: `h-8 w-8 rounded-full bg-gray-400 flex items-center justify-center text-white text-xs font-medium ${message.isCurrentUser ? 'bg-[#255b5c]' : 'bg-[#5f4508]'}` }, getInitials(((_b = message.sender) === null || _b === void 0 ? void 0 : _b.name) || 'User'))))),
92
+ react_1.default.createElement("div", { className: `${message.isCurrentUser ? 'order-1' : 'order-2'} ml-1 min-w-min max-w-[75%]` },
93
+ !message.isCurrentUser && (react_1.default.createElement("div", { className: "text-xs text-gray-500 font-medium mb-1" }, ((_c = message.sender) === null || _c === void 0 ? void 0 : _c.name) || 'Unknown User')),
94
+ react_1.default.createElement("div", { className: `px-4 py-2 rounded-lg ${message.isCurrentUser
95
+ ? 'bg-[#dbefef] rounded-br-none'
96
+ : 'bg-[#f9d8a7] border rounded-bl-none'}` }, message.content),
97
+ react_1.default.createElement("div", { className: "text-xs text-gray-500 mt-1" }, formatTime(message.timestamp))),
98
+ message.isCurrentUser && (react_1.default.createElement("div", { className: "flex-shrink-0 ml-2" }, (currentUser === null || currentUser === void 0 ? void 0 : currentUser.avatar) ? (react_1.default.createElement("img", { src: currentUser.avatar, alt: currentUser.name, className: "h-8 w-8 rounded-full" })) : (react_1.default.createElement("div", { className: "h-8 w-8 rounded-full bg-blue-400 flex items-center justify-center text-white text-xs font-medium" }, getInitials((currentUser === null || currentUser === void 0 ? void 0 : currentUser.name) || 'You')))))));
99
+ }),
100
+ react_1.default.createElement("div", { ref: threadsEndRef })),
101
+ react_1.default.createElement("div", { className: "py-3" },
102
+ react_1.default.createElement("div", { className: "flex items-center" },
103
+ react_1.default.createElement("textarea", { value: comment, onChange: (e) => setComment(e.target.value), onKeyDown: handleKeyPress, placeholder: "Type your message here...", className: "flex-1 border rounded-lg px-3 py-2 resize-none focus:outline-none focus:ring-2 focus:ring-blue-500", rows: 1 }),
104
+ react_1.default.createElement(base_ui_1.Button, { label: "Send", onClick: handleSend, disabled: !comment.trim(), color: "primary", className: "ml-2 px-4 py-2" })))));
105
+ };
106
+ exports.Chat = Chat;
@@ -0,0 +1 @@
1
+ export { DiscussionThread } from './DiscussionThread';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DiscussionThread = void 0;
4
+ var DiscussionThread_1 = require("./DiscussionThread");
5
+ Object.defineProperty(exports, "DiscussionThread", { enumerable: true, get: function () { return DiscussionThread_1.DiscussionThread; } });
@@ -1,3 +1,5 @@
1
- export declare const InvoiceCard: ({ invoice }: {
2
- invoice: any;
1
+ export declare const InvoiceCard: ({ clientInvoice, createDisputeChatMessage, user }: {
2
+ clientInvoice: any;
3
+ createDisputeChatMessage: any;
4
+ user: any;
3
5
  }) => JSX.Element;
@@ -29,6 +29,7 @@ const base_ui_1 = require("@paro.io/base-ui");
29
29
  const base_ui_2 = require("@paro.io/base-ui");
30
30
  const core_1 = require("@material-ui/core");
31
31
  const base_icons_1 = require("@paro.io/base-icons");
32
+ const DiscussionThread_1 = require("../DiscussionThread");
32
33
  const useStyles = (0, core_1.makeStyles)((theme) => ({
33
34
  root: {
34
35
  width: "100%",
@@ -92,18 +93,18 @@ const validateFileUpload = (file) => {
92
93
  }
93
94
  return true;
94
95
  };
95
- const InvoiceCard = ({ invoice }) => {
96
+ const InvoiceCard = ({ clientInvoice, createDisputeChatMessage, user }) => {
96
97
  const [expandRow, setExpandRow] = (0, react_1.useState)(null);
97
98
  const classes = useStyles();
98
- const [projects, setProjects] = (0, react_1.useState)(invoice.projectDetails);
99
+ const [projects, setProjects] = (0, react_1.useState)(clientInvoice.disputeProjects);
99
100
  const [editingRowId, setEditingRowId] = (0, react_1.useState)(null);
100
101
  const [editedExplanation, setEditedExplanation] = (0, react_1.useState)('');
101
102
  const [discussion, setDiscussion] = (0, react_1.useState)('');
102
103
  const fileInputRef = (0, react_1.useRef)(null);
103
104
  const handleChange = (e, field) => {
104
- const updatedProject = field === "files" ? projects.map((project) => {
105
+ const updatedProject = field === "clientDocumentLinks" ? projects.map((project) => {
105
106
  if (project.projectId === expandRow) {
106
- return Object.assign(Object.assign({}, project), { files: [...project.files, ...e.filter((name) => !project.files.includes(name))] });
107
+ return Object.assign(Object.assign({}, project), { clientDocumentLinks: [...project.clientDocumentLinks, ...e.filter((name) => !project.clientDocumentLinks.includes(name))] });
107
108
  }
108
109
  return project;
109
110
  }) : projects.map((project) => {
@@ -121,25 +122,36 @@ const InvoiceCard = ({ invoice }) => {
121
122
  .map(file => file.name);
122
123
  if (validFiles.length === 0)
123
124
  return;
124
- handleChange(validFiles, "files");
125
+ handleChange(validFiles, "clientDocumentLinks");
125
126
  if (fileInputRef.current) {
126
127
  fileInputRef.current.value = '';
127
128
  }
128
129
  };
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` },
130
- react_1.default.createElement("div", { key: invoice.invoiceId, className: "bg-[#0F172A] text-white mb-1 p-4 relative top-0 left-0 w-full rounded flex flex-row justify-evenly" },
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" },
131
132
  react_1.default.createElement("b", null,
132
133
  "Dispute Invoice #",
133
- invoice.invoiceId),
134
+ clientInvoice.invoice.id),
134
135
  react_1.default.createElement("p", null,
135
136
  "Disputed: ",
136
- invoice.disputedDate),
137
+ clientInvoice.disputeDate),
137
138
  react_1.default.createElement("p", null,
138
139
  "Invoice Date: ",
139
- invoice.invoiceDate),
140
- react_1.default.createElement("p", null,
141
- "Expert: ",
142
- invoice.expertName)),
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")),
143
155
  react_1.default.createElement("div", { className: "w-[95%] m-2" },
144
156
  react_1.default.createElement(core_1.Table, { className: classes.table, "aria-labelledby": "tableTitle", size: 'medium', "aria-label": "enhanced table" },
145
157
  react_1.default.createElement(core_1.TableHead, { className: classes.tableHead },
@@ -147,74 +159,53 @@ const InvoiceCard = ({ invoice }) => {
147
159
  headCells.map((headcell) => {
148
160
  return react_1.default.createElement(core_1.TableCell, { key: headcell.id, className: classes.tableCell }, headcell.label);
149
161
  }),
150
- react_1.default.createElement(core_1.TableCell, { className: classes.tableCell }))),
151
- projects.map((row) => (react_1.default.createElement(react_1.default.Fragment, null,
152
- react_1.default.createElement(core_1.TableRow, { key: row.projectId },
153
- react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.project),
154
- react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.projectType),
155
- react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.hours),
156
- react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.amount),
157
- react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.reason),
158
- react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell },
159
- 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)))),
160
- expandRow &&
161
- react_1.default.createElement(core_1.TableRow, null,
162
- react_1.default.createElement(core_1.TableCell, { colSpan: headCells.length + 1, style: { paddingBottom: 0, paddingTop: 0 } },
163
- react_1.default.createElement(core_1.Collapse, { in: expandRow === row.projectId, timeout: "auto", unmountOnExit: true },
164
- react_1.default.createElement(react_1.default.Fragment, null,
165
- 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` },
166
- react_1.default.createElement("b", { className: "mb-2 flex flex-row justify-start items-center" },
167
- "Explanation:",
168
- editingRowId === row.projectId ? (react_1.default.createElement(react_1.default.Fragment, null,
169
- 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" }),
170
- react_1.default.createElement(base_ui_2.Button, { label: "Save", size: "md", color: "success", className: "ml-2 mt-1", onClick: () => {
171
- setProjects((prev) => prev.map((p) => p.projectId === row.projectId
172
- ? Object.assign(Object.assign({}, p), { explanation: editedExplanation }) : p));
173
- setEditingRowId(null);
174
- } }))) : (react_1.default.createElement(base_ui_2.Button, { label: "Edit", iconLeft: react_1.default.createElement(base_icons_1.IconPencil, { size: 'sm' }), onClick: () => {
175
- setEditedExplanation(row.explanation);
176
- setEditingRowId(row.projectId);
177
- }, size: "sm", color: "info", className: "ml-6" }))),
178
- react_1.default.createElement("p", null, row.explanation),
179
- react_1.default.createElement("b", { className: "flex flex-row flex-wrap justify-start items-center mt-2" },
180
- "Supporting Documents:",
181
- react_1.default.createElement("input", { id: "upload-file", type: "file", multiple: true, accept: ".pdf,.doc,.docx", style: { display: 'none' }, ref: fileInputRef, onChange: handleUpload }),
182
- 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" }),
183
- row.files.map((f) => {
184
- return react_1.default.createElement("div", { className: "mx-2" },
185
- 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: () => {
186
- const updatedFiles = projects.map((p) => {
187
- const updatedFiles = p.files.filter((file) => file !== f);
188
- return Object.assign(Object.assign({}, p), { files: updatedFiles });
189
- });
190
- setProjects(updatedFiles);
191
- } }));
192
- }))),
193
- react_1.default.createElement("b", { className: "ml-8 mt-4 mr-auto" }, "Discussion: "),
194
- 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) => {
195
- return obj.paroSupport ?
196
- react_1.default.createElement("div", { className: "flex flex-row w-[80%] justify-start" },
197
- react_1.default.createElement("div", { className: "flex justify-center items-center bg-[#26A69A] h-12 w-12 rounded-full text-2xl text-white" }, "PS"),
198
- react_1.default.createElement("div", { className: "flex flex-col items-start ml-4" },
199
- react_1.default.createElement("b", null,
200
- "Paro Support: ",
201
- react_1.default.createElement("span", null, "Apr 3, 2025")),
202
- " ",
203
- react_1.default.createElement("p", null, "We've received your dispute and are reviewing the timesheet discrepancies."),
204
- react_1.default.createElement("p", null, "We'll follow up with the expert and update you by Apr 5."),
205
- react_1.default.createElement("p", null, obj.paroSupport)))
206
- :
207
- react_1.default.createElement("div", { className: "flex flex-row-reverse w-[85%] justify-items-end items-center ml-auto my-1" },
208
- 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"),
209
- react_1.default.createElement("p", null, obj.you));
210
- })),
211
- react_1.default.createElement("div", { className: "flex flex-row w-[95%] m-2 ml-4 justify-start" },
212
- 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..." }),
213
- react_1.default.createElement(base_ui_2.Button, { label: "Save", size: "md", color: "success", className: "ml-2 mt-1 w-full", disabled: !discussion, onClick: () => {
214
- setProjects((prev) => prev.map((p) => p.projectId === row.projectId
215
- ? Object.assign(Object.assign({}, p), { discussion: [...p.discussion, { you: discussion }] }) : p));
216
- setEditingRowId(null);
217
- setDiscussion('');
218
- } })))))))))))));
162
+ react_1.default.createElement(core_1.TableCell, { className: classes.tableCell }))), projects === null || projects === void 0 ? void 0 :
163
+ projects.map((row) => {
164
+ var _a, _b;
165
+ return (react_1.default.createElement(react_1.default.Fragment, null,
166
+ react_1.default.createElement(core_1.TableRow, { key: row.projectId },
167
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, (_a = row.project) === null || _a === void 0 ? void 0 : _a.name),
168
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.disputeType),
169
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.hours),
170
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.disputeAmount),
171
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.disputeReasonCode),
172
+ react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell },
173
+ 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)))),
174
+ expandRow &&
175
+ react_1.default.createElement(core_1.TableRow, null,
176
+ react_1.default.createElement(core_1.TableCell, { colSpan: headCells.length + 1, style: { paddingBottom: 0, paddingTop: 0 } },
177
+ react_1.default.createElement(core_1.Collapse, { in: expandRow === row.projectId, timeout: "auto", unmountOnExit: true },
178
+ react_1.default.createElement(react_1.default.Fragment, null,
179
+ 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` },
180
+ react_1.default.createElement("b", { className: "mb-2 flex flex-row justify-start items-center" },
181
+ "Explanation:",
182
+ editingRowId === row.projectId ? (react_1.default.createElement(react_1.default.Fragment, null,
183
+ 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" }),
184
+ react_1.default.createElement(base_ui_2.Button, { label: "Save", size: "md", color: "success", className: "ml-2 mt-1", onClick: () => {
185
+ setProjects((prev) => prev.map((p) => p.projectId === row.projectId
186
+ ? Object.assign(Object.assign({}, p), { clientExplanation: editedExplanation }) : p));
187
+ setEditingRowId(null);
188
+ } }))) : (react_1.default.createElement(base_ui_2.Button, { label: "Edit", iconLeft: react_1.default.createElement(base_icons_1.IconPencil, { size: 'sm' }), onClick: () => {
189
+ setEditedExplanation(row.clientExplanation);
190
+ setEditingRowId(row.projectId);
191
+ }, size: "sm", color: "info", className: "ml-6" }))),
192
+ react_1.default.createElement("p", null, row.clientExplanation),
193
+ react_1.default.createElement("b", { className: "flex flex-row flex-wrap justify-start items-center mt-2" },
194
+ "Supporting Documents:",
195
+ react_1.default.createElement("input", { id: "upload-file", type: "file", multiple: true, accept: ".pdf,.doc,.docx", style: { display: 'none' }, ref: fileInputRef, onChange: handleUpload }),
196
+ 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" }),
197
+ row.clientDocumentLinks && ((_b = row.clientDocumentLinks) === null || _b === void 0 ? void 0 : _b.map((f) => {
198
+ return react_1.default.createElement("div", { className: "mx-2" },
199
+ 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: () => {
200
+ const updatedFiles = projects.map((p) => {
201
+ const updatedFiles = p.files.filter((file) => file !== f);
202
+ return Object.assign(Object.assign({}, p), { files: updatedFiles });
203
+ });
204
+ setProjects(updatedFiles);
205
+ } }));
206
+ })))),
207
+ react_1.default.createElement("div", { className: "flex flex-row w-[95%] m-2 ml-4 justify-start" },
208
+ react_1.default.createElement(DiscussionThread_1.DiscussionThread, { key: row.projectId, currentUser: user, initialThreads: clientInvoice.chatMessages, createDisputeChatMessage: createDisputeChatMessage }))))))));
209
+ })))));
219
210
  };
220
211
  exports.InvoiceCard = InvoiceCard;
@@ -132,6 +132,8 @@ const ActiveProjectCard = ({ project, projectsData, expertName, freelancerId, fr
132
132
  }
133
133
  const showRating = ratingValue && (0, dayjs_1.default)((0, dayjs_1.default)().tz('America/Los_Angeles').format('YYYY-MM-DD HH:mm:ss')).diff((0, dayjs_1.default)((_g = (_f = project === null || project === void 0 ? void 0 : project.rating) === null || _f === void 0 ? void 0 : _f[0]) === null || _g === void 0 ? void 0 : _g.createdAt.replace('Z', '')).format('YYYY-MM-DD HH:mm:ss'), 'hours') > 48;
134
134
  const displayName = clientPortal ? expertName : (_h = project === null || project === void 0 ? void 0 : project.client) === null || _h === void 0 ? void 0 : _h.name;
135
+ const editResponseTime = new Date().getDate() <= 7;
136
+ const disputedProject = true; //update required
135
137
  return (react_1.default.createElement("div", { className: "w-full mb-8" },
136
138
  internalPortal && changeRequests && changeRequests.length > 0 && (react_1.default.createElement("div", null, changeRequests
137
139
  .filter((cr) => cr.entityId === project.id)
@@ -161,6 +163,8 @@ const ActiveProjectCard = ({ project, projectsData, expertName, freelancerId, fr
161
163
  react_1.default.createElement("h1", null, displayName),
162
164
  react_1.default.createElement("p", { className: "font-bold text-md mt-1" }, `${(_j = project === null || project === void 0 ? void 0 : project.name) !== null && _j !== void 0 ? _j : "Project"} ${(singleProjectData === null || singleProjectData === void 0 ? void 0 : singleProjectData.minFloorHours) ? "WITH" : "WITHOUT"} a min floor.`)),
163
165
  react_1.default.createElement("div", { className: "flex flex-row gap-x-2 items-center ml-auto" },
166
+ disputedProject && react_1.default.createElement("div", { className: "pl-4 my-auto" },
167
+ react_1.default.createElement(base_ui_1.Tag, { variant: "subtle", color: "danger", label: "IN PROCESS" })),
164
168
  showRating && react_1.default.createElement("div", { className: "flex flex-auto items-center justify-between" },
165
169
  react_1.default.createElement(lab_1.Rating, { name: "read-only", value: Number(ratingValue), precision: 0.5, size: "large", readOnly: true, emptyIcon: react_1.default.createElement(Star_1.default, { fontSize: "inherit" }) })),
166
170
  (singleProjectData === null || singleProjectData === void 0 ? void 0 : singleProjectData.minFloorHours) && !adhocProject ? react_1.default.createElement(core_1.Tooltip, { classes: { tooltip: classes.tooltip }, title: "Minimum Floor Hours is the minimum amount of hours needed to log for this project.", placement: "top", arrow: true },
@@ -175,10 +179,26 @@ const ActiveProjectCard = ({ project, projectsData, expertName, freelancerId, fr
175
179
  react_1.default.createElement("p", { className: "font-bold text-md self-center" }, "NEW !")) : "",
176
180
  react_1.default.createElement("div", { className: "h-10 w-14 bg-[#F1F5F9] rounded-md flex place-content-center" },
177
181
  react_1.default.createElement(base_ui_1.Button, { onClick: () => { setExpand(!expand); }, className: "font-bold text-md p-8", icon: expand ? react_1.default.createElement(base_icons_1.IconChevronUp, null) : react_1.default.createElement(base_icons_1.IconChevronDown, null) })))),
182
+ disputedProject && react_1.default.createElement("div", { className: "flex flex-col p-4" },
183
+ react_1.default.createElement("b", { className: "text-red-500" }, "Invoice #12345 Disputed"),
184
+ " ",
185
+ react_1.default.createElement("div", { className: "flex flex-row justify-between items-center align-center bg-[#FDD7A5] p-2 rounded-md" },
186
+ selectedTab !== 6 && react_1.default.createElement("div", { className: `w-1/6 h-12 w-16 rounded-md flex place-content-center items-center bg-[#A73A43] text-[#F1F5F9]` },
187
+ react_1.default.createElement("h1", { className: "text-xl" }, "!")),
188
+ selectedTab === 6 && editResponseTime ?
189
+ react_1.default.createElement("p", { className: "w-full pl-2" }, "Your response has been received and is being reviewed by our team. The project remains paused during this review and you will not be able to submit time for this project.")
190
+ :
191
+ react_1.default.createElement("p", { className: "w-full pl-2" },
192
+ "Client has disputed $3,500.00. This project is paused until resolved and you will not be able to log hours.",
193
+ react_1.default.createElement("br", null),
194
+ "Reason: Incorrect Hours Logged"),
195
+ react_1.default.createElement("div", { className: "w-1/6 pl-2" },
196
+ react_1.default.createElement(base_ui_1.Button, { label: selectedTab === 6 && editResponseTime ? "EDIT RESPONSE" : "RESPOND TO DISPUTE", size: "sm", color: "primary", disabled: false, className: "w-full", onClick: () => { } }),
197
+ " "))),
178
198
  expand && react_1.default.createElement("div", { className: `flex w-full p-4 gap-x-10 gap-y-10 ${projectRateType === "Fixed" ? "flex-col" : "flex-col md:flex-row"}` },
179
199
  react_1.default.createElement(LeftCardUI_1.LeftCardUI, { projectData: singleProjectData, projectFrequencyType: projectFrequencyType, projectRateType: projectRateType, project: project, isAuthenticated: isAuthenticated, adhocProject: adhocProject, activeProject: activeProject, freelancerId: freelancerId, selectedTab: selectedTab, updateProjectTaskMutation: updateProjectTaskMutation, GetAllProjectIrprDetailsForFreelancerDocument: GetAllProjectIrprDetailsForFreelancerDocument, updateProjectTask: updateProjectTask, clientPortal: clientPortal }),
180
200
  react_1.default.createElement("div", { className: "flex flex-col flex-grow md:flex-row gap-x-0 justify-around" },
181
201
  react_1.default.createElement(CenterCardUI_1.CenterCardUI, { startDate: project === null || project === void 0 ? void 0 : project.startDate, endDate: project === null || project === void 0 ? void 0 : project.endDate, projectData: singleProjectData, projectRateType: projectRateType, project: project, projectFrequencyType: projectFrequencyType, adhocProject: adhocProject, clientPortal: clientPortal, internalPortal: internalPortal }),
182
- react_1.default.createElement(RightCardUI_1.RightCardUI, { project: project, expertName: expertName, freelancerEmail: freelancerEmail, freelancerId: freelancerId, isAuthenticated: isAuthenticated, editEndDate: editEndDate, setEditEndDate: setEditEndDate, editStartDate: editStartDate, setEditStartDate: setEditStartDate, showTimeModal: showTimeModal, setShowTimeModal: setShowTimeModal, setSingleProjectData: setSingleProjectData, projectData: singleProjectData, checkStartDate: checkStartDate, activeProject: activeProject, projectRateType: projectRateType, projectFrequencyType: projectFrequencyType, upcomingProject: upcomingProject, selectedTab: selectedTab, showRating: !!showRating, projectTagsMap: projectTagsMap, updateProjectStatusMutation: updateProjectStatusMutation, GetAllProjectIrprDetailsForFreelancerDocument: GetAllProjectIrprDetailsForFreelancerDocument, updateParoProjectTagsMutation: updateParoProjectTagsMutation, GetParoProjectsDocument: GetParoProjectsDocument, updateProjectTagReviewStatusMutation: updateProjectTagReviewStatusMutation, updateProjectStatus: updateProjectStatus, updateProjectTags: updateProjectTags, getSowLazyQuery: getSowLazyQuery, sendParoSupportEmail: sendParoSupportEmail, createChangeRequestMutation: createChangeRequestMutation, createChangeRequest: createChangeRequest, createOrUpdateRatingRequestMutation: createOrUpdateRatingRequestMutation, submitProjectHoursMutation: submitProjectHoursMutation, getAuth0Roles: getAuth0Roles, submitProjectHoursLambda: submitProjectHoursLambda, createOrUpdateRating: createOrUpdateRating, getParoProjectsByClientIdDocument: getParoProjectsByClientIdDocument, user: user, internalPortal: internalPortal, csmUserGroup: csmUserGroup, clientPortal: clientPortal, signedSow: signedSow, isStageProd: isStageProd, isRequestReviewEnabled: isRequestReviewEnabled, updateDBProjectRequestStatus: updateDBProjectRequestStatus }))))));
202
+ react_1.default.createElement(RightCardUI_1.RightCardUI, { project: project, expertName: expertName, freelancerEmail: freelancerEmail, freelancerId: freelancerId, isAuthenticated: isAuthenticated, editEndDate: editEndDate, setEditEndDate: setEditEndDate, editStartDate: editStartDate, setEditStartDate: setEditStartDate, showTimeModal: showTimeModal, setShowTimeModal: setShowTimeModal, setSingleProjectData: setSingleProjectData, projectData: singleProjectData, checkStartDate: checkStartDate, activeProject: activeProject, projectRateType: projectRateType, projectFrequencyType: projectFrequencyType, upcomingProject: upcomingProject, selectedTab: selectedTab, showRating: !!showRating, projectTagsMap: projectTagsMap, updateProjectStatusMutation: updateProjectStatusMutation, GetAllProjectIrprDetailsForFreelancerDocument: GetAllProjectIrprDetailsForFreelancerDocument, updateParoProjectTagsMutation: updateParoProjectTagsMutation, GetParoProjectsDocument: GetParoProjectsDocument, updateProjectTagReviewStatusMutation: updateProjectTagReviewStatusMutation, updateProjectStatus: updateProjectStatus, updateProjectTags: updateProjectTags, getSowLazyQuery: getSowLazyQuery, sendParoSupportEmail: sendParoSupportEmail, createChangeRequestMutation: createChangeRequestMutation, createChangeRequest: createChangeRequest, createOrUpdateRatingRequestMutation: createOrUpdateRatingRequestMutation, submitProjectHoursMutation: submitProjectHoursMutation, getAuth0Roles: getAuth0Roles, submitProjectHoursLambda: submitProjectHoursLambda, createOrUpdateRating: createOrUpdateRating, getParoProjectsByClientIdDocument: getParoProjectsByClientIdDocument, user: user, internalPortal: internalPortal, csmUserGroup: csmUserGroup, clientPortal: clientPortal, signedSow: signedSow, isStageProd: isStageProd, isRequestReviewEnabled: isRequestReviewEnabled, updateDBProjectRequestStatus: updateDBProjectRequestStatus, disputedProject: disputedProject }))))));
183
203
  };
184
204
  exports.ActiveProjectCard = ActiveProjectCard;
@@ -46,6 +46,7 @@ interface RightCardUIProps {
46
46
  isStageProd: string;
47
47
  isRequestReviewEnabled: boolean;
48
48
  updateDBProjectRequestStatus: any;
49
+ disputedProject: boolean;
49
50
  }
50
- export declare const RightCardUI: ({ project, expertName, freelancerId, freelancerEmail, isAuthenticated, editEndDate, setEditEndDate, editStartDate, setEditStartDate, showTimeModal, setShowTimeModal, setSingleProjectData, projectData, checkStartDate, activeProject, projectFrequencyType, projectRateType, upcomingProject, selectedTab, showRating, projectTagsMap, updateProjectStatusMutation, GetAllProjectIrprDetailsForFreelancerDocument, updateParoProjectTagsMutation, GetParoProjectsDocument, updateProjectTagReviewStatusMutation, updateProjectStatus, updateProjectTags, getSowLazyQuery, sendParoSupportEmail, createChangeRequestMutation, createChangeRequest, createOrUpdateRatingRequestMutation, submitProjectHoursMutation, getAuth0Roles, submitProjectHoursLambda, createOrUpdateRating, getParoProjectsByClientIdDocument, user, internalPortal, csmUserGroup, clientPortal, signedSow, isStageProd, isRequestReviewEnabled, updateDBProjectRequestStatus, }: RightCardUIProps) => React.JSX.Element;
51
+ export declare const RightCardUI: ({ project, expertName, freelancerId, freelancerEmail, isAuthenticated, editEndDate, setEditEndDate, editStartDate, setEditStartDate, showTimeModal, setShowTimeModal, setSingleProjectData, projectData, checkStartDate, activeProject, projectFrequencyType, projectRateType, upcomingProject, selectedTab, showRating, projectTagsMap, updateProjectStatusMutation, GetAllProjectIrprDetailsForFreelancerDocument, updateParoProjectTagsMutation, GetParoProjectsDocument, updateProjectTagReviewStatusMutation, updateProjectStatus, updateProjectTags, getSowLazyQuery, sendParoSupportEmail, createChangeRequestMutation, createChangeRequest, createOrUpdateRatingRequestMutation, submitProjectHoursMutation, getAuth0Roles, submitProjectHoursLambda, createOrUpdateRating, getParoProjectsByClientIdDocument, user, internalPortal, csmUserGroup, clientPortal, signedSow, isStageProd, isRequestReviewEnabled, updateDBProjectRequestStatus, disputedProject, }: RightCardUIProps) => React.JSX.Element;
51
52
  export {};
@@ -61,7 +61,7 @@ const TicketModal = ({ ticketModal, setTicketModal }) => {
61
61
  react_1.default.createElement("p", { className: "font-bold text-md mb-2" }, "Thank you for reaching out to Paro Support, we will contact you within the next business day to follow up on your request."),
62
62
  react_1.default.createElement(base_ui_1.Button, { type: "button", onClick: () => { setTicketModal(false); }, label: "OK", className: "mt-4", color: "primary" })));
63
63
  };
64
- const RightCardUI = ({ project, expertName, freelancerId, freelancerEmail, isAuthenticated, editEndDate, setEditEndDate, editStartDate, setEditStartDate, showTimeModal, setShowTimeModal, setSingleProjectData, projectData, checkStartDate, activeProject, projectFrequencyType, projectRateType, upcomingProject, selectedTab, showRating, projectTagsMap, updateProjectStatusMutation, GetAllProjectIrprDetailsForFreelancerDocument, updateParoProjectTagsMutation, GetParoProjectsDocument, updateProjectTagReviewStatusMutation, updateProjectStatus, updateProjectTags, getSowLazyQuery, sendParoSupportEmail, createChangeRequestMutation, createChangeRequest, createOrUpdateRatingRequestMutation, submitProjectHoursMutation, getAuth0Roles, submitProjectHoursLambda, createOrUpdateRating, getParoProjectsByClientIdDocument, user, internalPortal, csmUserGroup, clientPortal, signedSow, isStageProd, isRequestReviewEnabled, updateDBProjectRequestStatus, }) => {
64
+ const RightCardUI = ({ project, expertName, freelancerId, freelancerEmail, isAuthenticated, editEndDate, setEditEndDate, editStartDate, setEditStartDate, showTimeModal, setShowTimeModal, setSingleProjectData, projectData, checkStartDate, activeProject, projectFrequencyType, projectRateType, upcomingProject, selectedTab, showRating, projectTagsMap, updateProjectStatusMutation, GetAllProjectIrprDetailsForFreelancerDocument, updateParoProjectTagsMutation, GetParoProjectsDocument, updateProjectTagReviewStatusMutation, updateProjectStatus, updateProjectTags, getSowLazyQuery, sendParoSupportEmail, createChangeRequestMutation, createChangeRequest, createOrUpdateRatingRequestMutation, submitProjectHoursMutation, getAuth0Roles, submitProjectHoursLambda, createOrUpdateRating, getParoProjectsByClientIdDocument, user, internalPortal, csmUserGroup, clientPortal, signedSow, isStageProd, isRequestReviewEnabled, updateDBProjectRequestStatus, disputedProject = false, }) => {
65
65
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
66
66
  const [expandClient, setExpandClient] = (0, react_1.useState)(false);
67
67
  const [expandSupport, setExpandSupport] = (0, react_1.useState)(clientPortal);
@@ -186,7 +186,7 @@ const RightCardUI = ({ project, expertName, freelancerId, freelancerEmail, isAut
186
186
  :
187
187
  react_1.default.createElement(core_1.Tooltip, { classes: { tooltip: classes.tooltip }, title: (projectType === "One-time-Fixed" || projectType === "Recurring-Fixed") ? "Please reach out to your Customer Success Manager if you would like to submit time for Fixed Projects." : "", placement: "top", arrow: true },
188
188
  react_1.default.createElement("div", null,
189
- react_1.default.createElement(base_ui_1.Button, { label: "LOG YOUR TIME", disabled: !activeProject, size: "sm", color: "primary", className: "w-full", onClick: () => { setShowTimeModal(true); } }))),
189
+ react_1.default.createElement(base_ui_1.Button, { label: "LOG YOUR TIME", disabled: !activeProject || disputedProject, size: "sm", color: "primary", className: "w-full", onClick: () => { setShowTimeModal(true); } }))),
190
190
  upcomingProject ? react_1.default.createElement(base_ui_1.Button, { label: "EDIT START DATE", disabled: false, size: "sm", className: "w-full", onClick: () => { setEditStartDate(true); } }) :
191
191
  react_1.default.createElement(base_ui_1.Button, { label: "EDIT START DATE", disabled: !activeProject, size: "sm", className: "w-full", onClick: () => { setEditStartDate(true); } }),
192
192
  checkStartDate ?
package/lib/index.d.ts CHANGED
@@ -11,3 +11,4 @@ export { ServiceLinesTemplate } from './components/ServiceLinesTemplate';
11
11
  export { sharedUtils } from './components/shared/utils';
12
12
  export { ActiveProjectCard } from './components/ProjectCard/ActiveProjectCard';
13
13
  export { InvoiceCard } from './components/Invoices/InvoiceCard';
14
+ export { DiscussionThread } from './components/DiscussionThread';
package/lib/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InvoiceCard = exports.ActiveProjectCard = exports.sharedUtils = exports.ServiceLinesTemplate = exports.HeaderNavBar = exports.DocumentCenter = exports.ProfileCompletedPercentage = exports.ExpertProfileHeader = exports.OrganizationChart = exports.FirmEmployeeSection = exports.ClientReferenceSection = exports.Reviews = exports.ReviewsTab = void 0;
3
+ exports.DiscussionThread = exports.InvoiceCard = exports.ActiveProjectCard = exports.sharedUtils = exports.ServiceLinesTemplate = exports.HeaderNavBar = exports.DocumentCenter = exports.ProfileCompletedPercentage = exports.ExpertProfileHeader = exports.OrganizationChart = exports.FirmEmployeeSection = exports.ClientReferenceSection = exports.Reviews = exports.ReviewsTab = void 0;
4
4
  var ReviewsTab_1 = require("./components/ReviewsTab");
5
5
  Object.defineProperty(exports, "ReviewsTab", { enumerable: true, get: function () { return ReviewsTab_1.ReviewsTab; } });
6
6
  var Reviews_1 = require("./components/Reviews");
@@ -27,3 +27,5 @@ var ActiveProjectCard_1 = require("./components/ProjectCard/ActiveProjectCard");
27
27
  Object.defineProperty(exports, "ActiveProjectCard", { enumerable: true, get: function () { return ActiveProjectCard_1.ActiveProjectCard; } });
28
28
  var InvoiceCard_1 = require("./components/Invoices/InvoiceCard");
29
29
  Object.defineProperty(exports, "InvoiceCard", { enumerable: true, get: function () { return InvoiceCard_1.InvoiceCard; } });
30
+ var DiscussionThread_1 = require("./components/DiscussionThread");
31
+ Object.defineProperty(exports, "DiscussionThread", { enumerable: true, get: function () { return DiscussionThread_1.DiscussionThread; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paro.io/expert-shared-components",
3
- "version": "1.11.0",
3
+ "version": "1.11.2",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {