@paro.io/expert-shared-components 1.11.0 → 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.
- package/lib/components/DiscussionThread/DiscussionThread.d.ts +25 -0
- package/lib/components/DiscussionThread/DiscussionThread.js +115 -0
- package/lib/components/DiscussionThread/chat.d.ts +22 -0
- package/lib/components/DiscussionThread/chat.js +106 -0
- package/lib/components/DiscussionThread/index.d.ts +1 -0
- package/lib/components/DiscussionThread/index.js +5 -0
- package/lib/components/Invoices/InvoiceCard.d.ts +4 -2
- package/lib/components/Invoices/InvoiceCard.js +33 -20
- package/lib/components/ProjectCard/ActiveProjectCard.js +21 -1
- package/lib/components/ProjectCard/RightCardUI.d.ts +2 -1
- package/lib/components/ProjectCard/RightCardUI.js +2 -2
- package/lib/index.d.ts +1 -0
- package/lib/index.js +3 -1
- package/package.json +1 -1
|
@@ -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,115 @@
|
|
|
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 ${isCurrentUser ? 'bg-[#255b5c]' : 'bg-[#5f4508]'}` }, getInitials(userName || 'User'))))),
|
|
101
|
+
react_1.default.createElement("div", { className: `${isCurrentUser ? 'order-1' : 'order-2'} 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
|
+
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')))))));
|
|
108
|
+
}),
|
|
109
|
+
react_1.default.createElement("div", { ref: threadsEndRef })),
|
|
110
|
+
react_1.default.createElement("div", { className: "py-3" },
|
|
111
|
+
react_1.default.createElement("div", { className: "flex items-center" },
|
|
112
|
+
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 }),
|
|
113
|
+
react_1.default.createElement(base_ui_1.Button, { label: "Send", onClick: handleSend, disabled: !comment.trim(), color: "primary", className: "ml-2 px-4 py-2" })))));
|
|
114
|
+
};
|
|
115
|
+
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; } });
|
|
@@ -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 = ({
|
|
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)(
|
|
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 === "
|
|
105
|
+
const updatedProject = field === "clientDocumentLinks" ? projects.map((project) => {
|
|
105
106
|
if (project.projectId === expandRow) {
|
|
106
|
-
return Object.assign(Object.assign({}, project), {
|
|
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, "
|
|
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.
|
|
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.
|
|
134
|
+
clientInvoice.invoice.id),
|
|
134
135
|
react_1.default.createElement("p", null,
|
|
135
136
|
"Disputed: ",
|
|
136
|
-
|
|
137
|
+
clientInvoice.disputeDate),
|
|
137
138
|
react_1.default.createElement("p", null,
|
|
138
139
|
"Invoice Date: ",
|
|
139
|
-
invoice.
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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 },
|
|
@@ -150,11 +162,11 @@ const InvoiceCard = ({ invoice }) => {
|
|
|
150
162
|
react_1.default.createElement(core_1.TableCell, { className: classes.tableCell }))),
|
|
151
163
|
projects.map((row) => (react_1.default.createElement(react_1.default.Fragment, null,
|
|
152
164
|
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.
|
|
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),
|
|
155
167
|
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.
|
|
157
|
-
react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell }, row.
|
|
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),
|
|
158
170
|
react_1.default.createElement(core_1.TableCell, { align: "left", className: classes.tableCell },
|
|
159
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)))),
|
|
160
172
|
expandRow &&
|
|
@@ -169,18 +181,18 @@ const InvoiceCard = ({ invoice }) => {
|
|
|
169
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" }),
|
|
170
182
|
react_1.default.createElement(base_ui_2.Button, { label: "Save", size: "md", color: "success", className: "ml-2 mt-1", onClick: () => {
|
|
171
183
|
setProjects((prev) => prev.map((p) => p.projectId === row.projectId
|
|
172
|
-
? Object.assign(Object.assign({}, p), {
|
|
184
|
+
? Object.assign(Object.assign({}, p), { clientExplanation: editedExplanation }) : p));
|
|
173
185
|
setEditingRowId(null);
|
|
174
186
|
} }))) : (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.
|
|
187
|
+
setEditedExplanation(row.clientExplanation);
|
|
176
188
|
setEditingRowId(row.projectId);
|
|
177
189
|
}, size: "sm", color: "info", className: "ml-6" }))),
|
|
178
|
-
react_1.default.createElement("p", null, row.
|
|
190
|
+
react_1.default.createElement("p", null, row.clientExplanation),
|
|
179
191
|
react_1.default.createElement("b", { className: "flex flex-row flex-wrap justify-start items-center mt-2" },
|
|
180
192
|
"Supporting Documents:",
|
|
181
193
|
react_1.default.createElement("input", { id: "upload-file", type: "file", multiple: true, accept: ".pdf,.doc,.docx", style: { display: 'none' }, ref: fileInputRef, onChange: handleUpload }),
|
|
182
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" }),
|
|
183
|
-
row.
|
|
195
|
+
row.clientDocumentLinks.map((f) => {
|
|
184
196
|
return react_1.default.createElement("div", { className: "mx-2" },
|
|
185
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: () => {
|
|
186
198
|
const updatedFiles = projects.map((p) => {
|
|
@@ -209,6 +221,7 @@ const InvoiceCard = ({ invoice }) => {
|
|
|
209
221
|
react_1.default.createElement("p", null, obj.you));
|
|
210
222
|
})),
|
|
211
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 }),
|
|
212
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..." }),
|
|
213
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: () => {
|
|
214
227
|
setProjects((prev) => prev.map((p) => p.projectId === row.projectId
|
|
@@ -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; } });
|