@paro.io/expert-shared-components 1.9.5 → 1.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/lib/components/EarningsTracker/ActiveProjectCard.d.ts +52 -0
  4. package/lib/components/EarningsTracker/ActiveProjectCard.js +161 -0
  5. package/lib/components/EarningsTracker/CenterCardUI.d.ts +13 -0
  6. package/lib/components/EarningsTracker/CenterCardUI.js +134 -0
  7. package/lib/components/EarningsTracker/EarningsTracker.d.ts +52 -0
  8. package/lib/components/EarningsTracker/EarningsTracker.js +508 -0
  9. package/lib/components/EarningsTracker/EditDateModal.d.ts +22 -0
  10. package/lib/components/EarningsTracker/EditDateModal.js +149 -0
  11. package/lib/components/EarningsTracker/EmailModal.d.ts +14 -0
  12. package/lib/components/EarningsTracker/EmailModal.js +79 -0
  13. package/lib/components/EarningsTracker/EndProjectModal.d.ts +56 -0
  14. package/lib/components/EarningsTracker/EndProjectModal.js +221 -0
  15. package/lib/components/EarningsTracker/LeftCardUI.d.ts +18 -0
  16. package/lib/components/EarningsTracker/LeftCardUI.js +189 -0
  17. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.d.ts +52 -0
  18. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.js +358 -0
  19. package/lib/components/EarningsTracker/ProgressBar.d.ts +4 -0
  20. package/lib/components/EarningsTracker/ProgressBar.js +66 -0
  21. package/lib/components/EarningsTracker/ReviewRequestModal.d.ts +17 -0
  22. package/lib/components/EarningsTracker/ReviewRequestModal.js +135 -0
  23. package/lib/components/EarningsTracker/RightCardUI.d.ts +46 -0
  24. package/lib/components/EarningsTracker/RightCardUI.js +231 -0
  25. package/lib/components/EarningsTracker/index.d.ts +1 -0
  26. package/lib/components/EarningsTracker/index.js +5 -0
  27. package/lib/components/ExpertProfileHeader/ProfileSection.js +0 -9
  28. package/lib/components/HeaderNavBar/index.d.ts +1 -1
  29. package/lib/components/HeaderNavBar/index.js +7 -2
  30. package/lib/components/ProjectCard/ActiveProjectCard.d.ts +58 -0
  31. package/lib/components/ProjectCard/ActiveProjectCard.js +163 -0
  32. package/lib/components/ProjectCard/CenterCardUI.d.ts +13 -0
  33. package/lib/components/ProjectCard/CenterCardUI.js +134 -0
  34. package/lib/components/ProjectCard/EditDateModal.d.ts +22 -0
  35. package/lib/components/ProjectCard/EditDateModal.js +149 -0
  36. package/lib/components/ProjectCard/EmailModal.d.ts +14 -0
  37. package/lib/components/ProjectCard/EmailModal.js +79 -0
  38. package/lib/components/ProjectCard/EndProjectModal.d.ts +56 -0
  39. package/lib/components/ProjectCard/EndProjectModal.js +221 -0
  40. package/lib/components/ProjectCard/LeftCardUI.d.ts +18 -0
  41. package/lib/components/ProjectCard/LeftCardUI.js +177 -0
  42. package/lib/components/ProjectCard/LogTimeModalAuthenticated.d.ts +52 -0
  43. package/lib/components/ProjectCard/LogTimeModalAuthenticated.js +358 -0
  44. package/lib/components/ProjectCard/ProgressBar.d.ts +4 -0
  45. package/lib/components/ProjectCard/ProgressBar.js +66 -0
  46. package/lib/components/ProjectCard/ReviewRequestModal.d.ts +17 -0
  47. package/lib/components/ProjectCard/ReviewRequestModal.js +135 -0
  48. package/lib/components/ProjectCard/RightCardUI.d.ts +50 -0
  49. package/lib/components/ProjectCard/RightCardUI.js +237 -0
  50. package/lib/components/ProjectCard/index.d.ts +1 -0
  51. package/lib/components/ProjectCard/index.js +5 -0
  52. package/lib/components/ReviewsTab/ReviewModal.js +1 -1
  53. package/lib/components/ServiceLinesTemplate/index.js +3 -3
  54. package/lib/components/shared/Error.d.ts +6 -6
  55. package/lib/components/shared/Error.js +16 -40
  56. package/lib/index.d.ts +1 -0
  57. package/lib/index.js +3 -1
  58. package/package.json +4 -1
@@ -0,0 +1,237 @@
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.RightCardUI = void 0;
39
+ const react_1 = __importStar(require("react"));
40
+ const base_icons_1 = require("@paro.io/base-icons");
41
+ const base_ui_1 = require("@paro.io/base-ui");
42
+ const core_1 = require("@material-ui/core");
43
+ const LogTimeModalAuthenticated_1 = require("./LogTimeModalAuthenticated");
44
+ const dayjs_1 = __importDefault(require("dayjs"));
45
+ const EmailModal_1 = require("./EmailModal");
46
+ const EditDateModal_1 = require("./EditDateModal");
47
+ const EndProjectModal_1 = require("./EndProjectModal");
48
+ const ReviewRequestModal_1 = require("./ReviewRequestModal");
49
+ const ActiveProjectCard_1 = require("./ActiveProjectCard");
50
+ const ReviewModal_1 = __importDefault(require("../ReviewsTab/ReviewModal"));
51
+ const isWithinHours = (date, hours) => (0, dayjs_1.default)((0, dayjs_1.default)().tz("America/Los_Angeles").format("YYYY-MM-DD HH:mm:ss")).diff((0, dayjs_1.default)(date).format("YYYY-MM-DD HH:mm:ss"), "hour") < hours;
52
+ const projectWithRecentRating = (project) => {
53
+ var _a, _b;
54
+ return (project === null || project === void 0 ? void 0 : project.rating) &&
55
+ ((_a = project === null || project === void 0 ? void 0 : project.rating[0]) === null || _a === void 0 ? void 0 : _a.overallRating) &&
56
+ isWithinHours((_b = project === null || project === void 0 ? void 0 : project.rating[0]) === null || _b === void 0 ? void 0 : _b.createdAt.replace("Z", ""), 48);
57
+ };
58
+ const TicketModal = ({ ticketModal, setTicketModal }) => {
59
+ return (react_1.default.createElement(base_ui_1.Modal, { open: ticketModal, onClose: () => { setTicketModal(false); }, size: "sm", className: "z-[100]" },
60
+ react_1.default.createElement("h1", { className: "font-bold text-xl mb-6" }, "Your ticket has been submitted!"),
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
+ react_1.default.createElement(base_ui_1.Button, { type: "button", onClick: () => { setTicketModal(false); }, label: "OK", className: "mt-4", color: "primary" })));
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, }) => {
65
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
66
+ const [expandClient, setExpandClient] = (0, react_1.useState)(false);
67
+ const [expandSupport, setExpandSupport] = (0, react_1.useState)(false);
68
+ const [emailModal, setEmailModal] = (0, react_1.useState)(false);
69
+ const [emailText, setEmailText] = (0, react_1.useState)("");
70
+ const [ticketModal, setTicketModal] = (0, react_1.useState)(false);
71
+ const [showConfirmationModal, setShowConfirmationModal] = (0, react_1.useState)(false);
72
+ const [isDateInvalid, setIsDateInvalid] = (0, react_1.useState)(false);
73
+ const [requestModal, setRequestModal] = (0, react_1.useState)(false);
74
+ const [sowData, setSowData] = (0, react_1.useState)();
75
+ const [sowLoading, setSowLoading] = (0, react_1.useState)(false);
76
+ const [openReviewModal, setOpenReviewModal] = (0, react_1.useState)(false);
77
+ const classes = (0, ActiveProjectCard_1.useStyles)();
78
+ const sow = !!(project === null || project === void 0 ? void 0 : project.contractId);
79
+ const sowId = !!(project === null || project === void 0 ? void 0 : project.scopeOfWorkId);
80
+ const projectType = `${projectFrequencyType}-${projectRateType}`;
81
+ const nDaysSinceLastRatingIsSubmiited = 30;
82
+ const isProjectCompletedIn2024 = (0, dayjs_1.default)(project === null || project === void 0 ? void 0 : project.rowUpdateTimestamp).year() === 2024;
83
+ const [requestStatus, setRequestStatus] = (0, react_1.useState)();
84
+ const isTestEnv = isStageProd !== "prod";
85
+ (0, react_1.useEffect)(() => {
86
+ var _a, _b, _c, _d, _e, _f, _g, _h;
87
+ const isRatingBeforeRatingRequest = (0, dayjs_1.default)((_b = (_a = project === null || project === void 0 ? void 0 : project.rating) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.createdAt).isBefore((0, dayjs_1.default)((_d = (_c = project === null || project === void 0 ? void 0 : project.ratingRequest) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.createdAt));
88
+ const isRatingRequestAfterRowUpdate = (0, dayjs_1.default)((_f = (_e = project === null || project === void 0 ? void 0 : project.ratingRequest) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.createdAt).isAfter((0, dayjs_1.default)(project === null || project === void 0 ? void 0 : project.rowUpdateTimestamp));
89
+ const isRatingRequestStatusRequested = ((_h = (_g = project === null || project === void 0 ? void 0 : project.ratingRequest) === null || _g === void 0 ? void 0 : _g[0]) === null || _h === void 0 ? void 0 : _h.status) === 'Requested';
90
+ const getRequestStatus = () => {
91
+ var _a, _b, _c, _d;
92
+ if (selectedTab === 4) {
93
+ if (isRatingBeforeRatingRequest && isRatingRequestAfterRowUpdate && isProjectCompletedIn2024 && isRatingRequestStatusRequested) {
94
+ return (_b = (_a = project === null || project === void 0 ? void 0 : project.ratingRequest) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.status;
95
+ }
96
+ }
97
+ else {
98
+ if (isRatingBeforeRatingRequest && isRatingRequestStatusRequested) {
99
+ return (_d = (_c = project === null || project === void 0 ? void 0 : project.ratingRequest) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.status;
100
+ }
101
+ }
102
+ return undefined;
103
+ };
104
+ setRequestStatus(getRequestStatus());
105
+ }, [project, selectedTab, isProjectCompletedIn2024]);
106
+ (0, react_1.useEffect)(() => {
107
+ if (sowData && sowData.presignedUrl) {
108
+ window.open(sowData.presignedUrl);
109
+ }
110
+ }, [sowData]);
111
+ const isWithinDays = (date, days) => (0, dayjs_1.default)((0, dayjs_1.default)().tz('America/Los_Angeles').format('YYYY-MM-DD HH:mm:ss')).diff((0, dayjs_1.default)(date).format('YYYY-MM-DD HH:mm:ss'), 'day') < days;
112
+ const isWithinHours = (date, hours) => (0, dayjs_1.default)((0, dayjs_1.default)().tz('America/Los_Angeles').format('YYYY-MM-DD HH:mm:ss')).diff((0, dayjs_1.default)(date).format('YYYY-MM-DD HH:mm:ss'), 'hours') < hours;
113
+ const hasRecentRating = !!((project === null || project === void 0 ? void 0 : project.rating) && ((_a = project === null || project === void 0 ? void 0 : project.rating[0]) === null || _a === void 0 ? void 0 : _a.overallRating) && isWithinHours((_b = project === null || project === void 0 ? void 0 : project.rating[0]) === null || _b === void 0 ? void 0 : _b.createdAt.replace('Z', ''), 48) &&
114
+ (!(((_c = project === null || project === void 0 ? void 0 : project.ratingRequest) === null || _c === void 0 ? void 0 : _c.length) > 0) || ((_d = project === null || project === void 0 ? void 0 : project.ratingRequest[0]) === null || _d === void 0 ? void 0 : _d.status) !== 'Requested' && (0, dayjs_1.default)((_e = project === null || project === void 0 ? void 0 : project.ratingRequest[0]) === null || _e === void 0 ? void 0 : _e.createdAt).isBefore((0, dayjs_1.default)((_f = project === null || project === void 0 ? void 0 : project.rating[0]) === null || _f === void 0 ? void 0 : _f.createdAt))));
115
+ const getMaxDate = () => {
116
+ let maxDate = LogTimeModalAuthenticated_1.constants.MAX_DATE;
117
+ const todayDate = new Date();
118
+ if (editStartDate) {
119
+ maxDate = new Date(project === null || project === void 0 ? void 0 : project.endDate);
120
+ }
121
+ else if (editEndDate) {
122
+ maxDate = new Date(todayDate.setMonth((todayDate).getMonth() + 12));
123
+ }
124
+ return new Date(maxDate);
125
+ };
126
+ const validateDate = (date) => {
127
+ const minDate = LogTimeModalAuthenticated_1.constants.MIN_DATE;
128
+ const maxDate = getMaxDate();
129
+ const isValid = date ? date.setHours(0, 0, 0, 0) < minDate.setHours(0, 0, 0, 0) || date.setHours(0, 0, 0, 0) > maxDate.setHours(0, 0, 0, 0) : true;
130
+ setIsDateInvalid(isValid);
131
+ return !isValid;
132
+ };
133
+ const downloadSow = (sowId) => __awaiter(void 0, void 0, void 0, function* () {
134
+ setSowLoading(true);
135
+ yield getSowLazyQuery({ variables: { getSowId: sowId } })
136
+ .then((res) => {
137
+ setSowData(res.data.getSow);
138
+ })
139
+ .catch((error) => {
140
+ console.error("Failed to download SOW:", error);
141
+ })
142
+ .finally(() => {
143
+ setSowLoading(false);
144
+ });
145
+ });
146
+ const isRecentRatingAfterRowUpdate = (ratingDate, rowUpdateTimestamp) => (0, dayjs_1.default)(ratingDate).isAfter((0, dayjs_1.default)(rowUpdateTimestamp));
147
+ const hasRecentRatingCondition = (selectedTab, hasRecentRating, project, isProjectCompletedIn2024) => {
148
+ var _a, _b;
149
+ if (selectedTab === 4) {
150
+ return hasRecentRating && isRecentRatingAfterRowUpdate((_b = (_a = project === null || project === void 0 ? void 0 : project.rating) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.createdAt, project === null || project === void 0 ? void 0 : project.rowUpdateTimestamp) && isProjectCompletedIn2024;
151
+ }
152
+ return hasRecentRating;
153
+ };
154
+ const reviewGivenCondition = (selectedTab, showRating, project, isProjectCompletedIn2024, nDaysSinceLastRatingIsSubmiited) => {
155
+ var _a, _b, _c, _d;
156
+ if (!showRating)
157
+ return false;
158
+ if (selectedTab === 4) {
159
+ return isRecentRatingAfterRowUpdate((_b = (_a = project === null || project === void 0 ? void 0 : project.rating) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.createdAt, project === null || project === void 0 ? void 0 : project.rowUpdateTimestamp) && isProjectCompletedIn2024;
160
+ }
161
+ return isWithinDays((_d = (_c = project === null || project === void 0 ? void 0 : project.rating) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.createdAt, nDaysSinceLastRatingIsSubmiited);
162
+ };
163
+ const requestReviewButtonLabel = () => {
164
+ const hasRecentRatings = hasRecentRatingCondition(selectedTab, hasRecentRating, project, isProjectCompletedIn2024);
165
+ const reviewGiven = reviewGivenCondition(selectedTab, showRating, project, isProjectCompletedIn2024, nDaysSinceLastRatingIsSubmiited);
166
+ if (hasRecentRatings) {
167
+ return 'Review Pending';
168
+ }
169
+ else if (requestStatus === 'Requested') {
170
+ return 'Requested';
171
+ }
172
+ else if (reviewGiven) {
173
+ return 'Review Given';
174
+ }
175
+ return 'Request Review';
176
+ };
177
+ return (react_1.default.createElement(react_1.default.Fragment, null,
178
+ react_1.default.createElement("div", { className: "w-full md:w-2/12 flex flex-col gap-y-2.5" },
179
+ (internalPortal && csmUserGroup) || (!internalPortal && !csmUserGroup) && !clientPortal ? react_1.default.createElement(react_1.default.Fragment, null,
180
+ react_1.default.createElement("h1", { className: "text-[#64748B] text-md font-bold" }, "Actions"),
181
+ checkStartDate ?
182
+ react_1.default.createElement(core_1.Tooltip, { classes: { tooltip: classes.tooltip }, title: activeProject && "The project has not started yet. Request to change the project start date to the current date in order to edit the project end date.", placement: "top", arrow: true }, upcomingProject ? react_1.default.createElement("div", null,
183
+ react_1.default.createElement(base_ui_1.Button, { label: "LOG YOUR TIME", disabled: true, size: "sm", color: "primary", className: "w-full", onClick: () => { setShowTimeModal(true); } }))
184
+ : react_1.default.createElement("div", null,
185
+ react_1.default.createElement(base_ui_1.Button, { label: "LOG YOUR TIME", disabled: checkStartDate || !activeProject, size: "sm", color: "primary", className: "w-full", onClick: () => { setShowTimeModal(true); } })))
186
+ :
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
+ 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); } }))),
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
+ react_1.default.createElement(base_ui_1.Button, { label: "EDIT START DATE", disabled: !activeProject, size: "sm", className: "w-full", onClick: () => { setEditStartDate(true); } }),
192
+ checkStartDate ?
193
+ react_1.default.createElement(core_1.Tooltip, { classes: { tooltip: classes.tooltip }, title: activeProject && "The project has not started yet, please wait until the project start date to request a change to edit the end date.", placement: "top", arrow: true }, upcomingProject ? react_1.default.createElement("div", null,
194
+ react_1.default.createElement(base_ui_1.Button, { label: "EDIT END DATE", disabled: true, size: "sm", className: "w-full", onClick: () => { setEditEndDate(true); } })) :
195
+ react_1.default.createElement("div", null,
196
+ react_1.default.createElement(base_ui_1.Button, { label: "EDIT END DATE", disabled: checkStartDate || !activeProject, size: "sm", className: "w-full", onClick: () => { setEditEndDate(true); } })))
197
+ :
198
+ react_1.default.createElement(base_ui_1.Button, { label: "EDIT END DATE", disabled: !activeProject, size: "sm", className: "w-full", onClick: () => { setEditEndDate(true); } }),
199
+ react_1.default.createElement(base_ui_1.Button, { label: "END PROJECT", disabled: selectedTab === 2 || selectedTab === 3 || selectedTab === 4, size: "sm", className: "w-full", onClick: () => { setShowConfirmationModal(true); } }),
200
+ react_1.default.createElement(base_ui_1.Button, { label: "VIEW SOW", size: "sm", disabled: !sow, className: "w-full", onClick: () => window.open(`/contract/${project === null || project === void 0 ? void 0 : project.contractId}`, '_blank') }),
201
+ !internalPortal && react_1.default.createElement(base_ui_1.Button, { label: "DOWNLOAD SOW", size: "sm", disabled: !sowId, className: "w-full", onClick: () => { downloadSow(project === null || project === void 0 ? void 0 : project.scopeOfWorkId); }, isLoading: sowLoading }),
202
+ (selectedTab === 0 || selectedTab === 1 || selectedTab === 4) && isRequestReviewEnabled && !internalPortal &&
203
+ react_1.default.createElement(base_ui_1.Button, { label: requestReviewButtonLabel(), disabled: requestReviewButtonLabel() !== 'Request Review', size: "sm", className: "w-full", onClick: () => setRequestModal(true), isLoading: sowLoading })) : null,
204
+ clientPortal && react_1.default.createElement(react_1.default.Fragment, null,
205
+ react_1.default.createElement("h1", { className: "text-[#64748B] text-md font-bold" }, "Actions"),
206
+ react_1.default.createElement(base_ui_1.Button, { label: signedSow ? "DOWNLOAD SOW" : "SIGN SOW", size: "sm", disabled: !sowId, className: "w-full", onClick: () => { downloadSow(project === null || project === void 0 ? void 0 : project.scopeOfWorkId); }, isLoading: sowLoading }),
207
+ signedSow &&
208
+ react_1.default.createElement(base_ui_1.Button, { label: "SUBMIT REVIEW", size: "sm", className: "w-full", onClick: () => setOpenReviewModal(true) })),
209
+ react_1.default.createElement("div", { className: "gap-y-1 mt-4" },
210
+ react_1.default.createElement("div", { className: "flex flex-row justify-between" },
211
+ react_1.default.createElement("h1", { className: "font-bold text-lg mb-2" }, clientPortal ? "AE Information" : "Client Contact"),
212
+ react_1.default.createElement("button", { onClick: () => { setExpandClient(!expandClient); }, className: "font-bold text-md mb-2" }, expandClient ? react_1.default.createElement(base_icons_1.IconChevronUp, null) : react_1.default.createElement(base_icons_1.IconChevronDown, null))),
213
+ expandClient && react_1.default.createElement("div", { className: "m-1 overflow-auto" },
214
+ react_1.default.createElement("p", null, (_g = project === null || project === void 0 ? void 0 : project.client) === null || _g === void 0 ? void 0 : _g.name),
215
+ react_1.default.createElement("p", null, (_h = project === null || project === void 0 ? void 0 : project.client) === null || _h === void 0 ? void 0 : _h.clientEmail),
216
+ react_1.default.createElement("p", null, (_k = ((_j = project === null || project === void 0 ? void 0 : project.client) === null || _j === void 0 ? void 0 : _j.clientPhone)) === null || _k === void 0 ? void 0 : _k.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3")))),
217
+ react_1.default.createElement("div", { className: "gap-y-1 mt-4" },
218
+ react_1.default.createElement("div", { className: "flex flex-row justify-between" },
219
+ react_1.default.createElement("h1", { className: "font-bold text-lg mb-2" }, "Paro Support"),
220
+ react_1.default.createElement("button", { onClick: () => { setExpandSupport(!expandSupport); }, className: "font-bold text-md mb-2" }, expandSupport ? react_1.default.createElement(base_icons_1.IconChevronUp, null) : react_1.default.createElement(base_icons_1.IconChevronDown, null))),
221
+ expandSupport && react_1.default.createElement(react_1.default.Fragment, null,
222
+ react_1.default.createElement("b", null, "Customer Success Manager"),
223
+ react_1.default.createElement("div", { className: "m-1 overflow-auto" },
224
+ react_1.default.createElement("p", null, ((_m = (_l = project === null || project === void 0 ? void 0 : project.paroContact) === null || _l === void 0 ? void 0 : _l.firstName) !== null && _m !== void 0 ? _m : '') + ' ' + ((_p = (_o = project === null || project === void 0 ? void 0 : project.paroContact) === null || _o === void 0 ? void 0 : _o.lastName) !== null && _p !== void 0 ? _p : '')),
225
+ react_1.default.createElement("a", { href: `mailto:${(_q = project === null || project === void 0 ? void 0 : project.paroContact) === null || _q === void 0 ? void 0 : _q.email}`, className: "underline text-[#1878BD]" }, (_r = project === null || project === void 0 ? void 0 : project.paroContact) === null || _r === void 0 ? void 0 : _r.email),
226
+ react_1.default.createElement("p", null, (_s = project === null || project === void 0 ? void 0 : project.paroContact) === null || _s === void 0 ? void 0 : _s.phone)),
227
+ react_1.default.createElement(base_ui_1.Button, { label: "CONTACT SUPPORT", size: "sm", className: "max-w-max mt-2", onClick: () => setEmailModal(true) })))),
228
+ react_1.default.createElement(LogTimeModalAuthenticated_1.LogTimeModalAuthenticated, { project: project, freelancerId: freelancerId, showTimeModal: showTimeModal, setShowTimeModal: setShowTimeModal, validateDate: validateDate, setIsDateInvalid: setIsDateInvalid, isDateInvalid: isDateInvalid, setSingleProjectData: setSingleProjectData, projectData: projectData, selectedTab: selectedTab, isAuthenticated: isAuthenticated, submitProjectHoursMutation: submitProjectHoursMutation, GetAllProjectIrprDetailsForFreelancerDocument: GetAllProjectIrprDetailsForFreelancerDocument, getAuth0Roles: getAuth0Roles, submitProjectHoursLambda: submitProjectHoursLambda, user: user }),
229
+ react_1.default.createElement(EditDateModal_1.EditDateModal, { freelancerId: freelancerId, freelancerEmail: freelancerEmail, project: project, previousDate: project === null || project === void 0 ? void 0 : project.startDate, editDate: editStartDate, setEditDate: setEditStartDate, validateDate: validateDate, setIsDateInvalid: setIsDateInvalid, isDateInvalid: isDateInvalid, changeType: "start", expertName: expertName, isAuthenticated: isAuthenticated, selectedTab: selectedTab, createChangeRequestMutation: createChangeRequestMutation, GetAllProjectIrprDetailsForFreelancerDocument: GetAllProjectIrprDetailsForFreelancerDocument, createChangeRequest: createChangeRequest, isTestEnv: isTestEnv }),
230
+ react_1.default.createElement(EditDateModal_1.EditDateModal, { freelancerId: freelancerId, freelancerEmail: freelancerEmail, project: project, previousDate: project === null || project === void 0 ? void 0 : project.endDate, editDate: editEndDate, setEditDate: setEditEndDate, validateDate: validateDate, setIsDateInvalid: setIsDateInvalid, isDateInvalid: isDateInvalid, changeType: "end", expertName: expertName, isAuthenticated: isAuthenticated, selectedTab: selectedTab, createChangeRequestMutation: createChangeRequestMutation, GetAllProjectIrprDetailsForFreelancerDocument: GetAllProjectIrprDetailsForFreelancerDocument, createChangeRequest: createChangeRequest, isTestEnv: isTestEnv }),
231
+ react_1.default.createElement(EndProjectModal_1.EndProjectModal, { freelancerId: freelancerId, project: project, expertName: expertName, showConfirmationModal: showConfirmationModal, setShowConfirmationModal: setShowConfirmationModal, projectType: projectType, isAuthenticated: isAuthenticated, selectedTab: selectedTab, projectTagsMap: projectTagsMap, updateProjectStatusMutation: updateProjectStatusMutation, GetAllProjectIrprDetailsForFreelancerDocument: GetAllProjectIrprDetailsForFreelancerDocument, updateParoProjectTagsMutation: updateParoProjectTagsMutation, GetParoProjectsDocument: GetParoProjectsDocument, updateProjectTagReviewStatusMutation: updateProjectTagReviewStatusMutation, updateProjectStatus: updateProjectStatus, updateProjectTags: updateProjectTags }),
232
+ react_1.default.createElement(EmailModal_1.EmailModal, { emailModal: emailModal, setEmailModal: setEmailModal, emailText: emailText, setEmailText: setEmailText, setTicketModal: setTicketModal, project: project, expertName: expertName, sendParoSupportEmail: sendParoSupportEmail, isTestEnv: isTestEnv }),
233
+ react_1.default.createElement(TicketModal, { ticketModal: ticketModal, setTicketModal: setTicketModal }),
234
+ react_1.default.createElement(ReviewRequestModal_1.ReviewRequestModal, { project: project, requestModal: requestModal, setRequestModal: setRequestModal, expertName: expertName, freelancerId: freelancerId, setRequestStatus: setRequestStatus, createOrUpdateRatingRequestMutation: createOrUpdateRatingRequestMutation }),
235
+ react_1.default.createElement(ReviewModal_1.default, { openReviewModal: openReviewModal, setOpenReviewModal: setOpenReviewModal, freelancer: (_t = project === null || project === void 0 ? void 0 : project.projectScope) === null || _t === void 0 ? void 0 : _t.freelancer, projects: [project], projectsWithRecentRating: projectWithRecentRating(project), projectsEligibleForRating: [project], createOrUpdateRatingRequestMutation: createOrUpdateRatingRequestMutation, createOrUpdateRating: createOrUpdateRating, getparoProjectsByClientIdDocument: getParoProjectsByClientIdDocument, clientId: (_u = project === null || project === void 0 ? void 0 : project.client) === null || _u === void 0 ? void 0 : _u.id })));
236
+ };
237
+ exports.RightCardUI = RightCardUI;
@@ -0,0 +1 @@
1
+ export { ActiveProjectCard } from './ActiveProjectCard';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ActiveProjectCard = void 0;
4
+ var ActiveProjectCard_1 = require("./ActiveProjectCard");
5
+ Object.defineProperty(exports, "ActiveProjectCard", { enumerable: true, get: function () { return ActiveProjectCard_1.ActiveProjectCard; } });
@@ -77,7 +77,7 @@ const ClientReviewModal = ({ openReviewModal, setOpenReviewModal, freelancer, pr
77
77
  communicationRating: communicationRating,
78
78
  executionOfDeliverablesRating: deliveryRating,
79
79
  review,
80
- projectId: isSingleProject ? projectData === null || projectData === void 0 ? void 0 : projectData.id : projectId,
80
+ projectId: isSingleProject ? +(projectData === null || projectData === void 0 ? void 0 : projectData.id) : projectId,
81
81
  clientId: (_a = projectData === null || projectData === void 0 ? void 0 : projectData.client) === null || _a === void 0 ? void 0 : _a.id,
82
82
  freelancerId: (_b = projectData === null || projectData === void 0 ? void 0 : projectData.freelancer) === null || _b === void 0 ? void 0 : _b.id,
83
83
  submittedBy: projectData === null || projectData === void 0 ? void 0 : projectData.clientFirstName,
@@ -273,8 +273,8 @@ const ServiceLinesTemplate = ({ getFreelancerDataResult, createOrUpdateRates, ge
273
273
  setDisablePublicProfile(false);
274
274
  };
275
275
  return react_1.default.createElement(core_1.Grid, { container: true, direction: "row", justifyContent: "space-evenly", style: { margin: 'auto' }, spacing: 2 },
276
- react_1.default.createElement(base_ui_1.Button, { label: "PREVIEW PUBLIC PROFILE", onClick: () => window.open(`${reactAppUrl}/public/${legacyFreelancerId}`, '_blank'), type: "button", disabled: disablePublicProfile, isLoading: updateClicked, size: "sm" }),
277
- react_1.default.createElement(base_ui_1.Button, { label: "UPDATE PROFILE", onClick: handleButtonClick, type: "button", isLoading: updateClicked, disabled: isUpdateButtonDisabled(), color: "primary", size: "sm" }));
276
+ react_1.default.createElement(base_ui_1.Button, { label: "PREVIEW PUBLIC PROFILE", onClick: () => window.open(`${reactAppUrl}/public/${legacyFreelancerId}`, '_blank'), type: "button", disabled: disablePublicProfile, isLoading: updateClicked, size: "sm", className: "m-2" }),
277
+ react_1.default.createElement(base_ui_1.Button, { label: "UPDATE PROFILE", onClick: handleButtonClick, type: "button", isLoading: updateClicked, disabled: isUpdateButtonDisabled(), color: "primary", size: "sm", className: "m-2" }));
278
278
  };
279
279
  const newServiceLine = () => {
280
280
  var _a, _b;
@@ -338,7 +338,7 @@ const ServiceLinesTemplate = ({ getFreelancerDataResult, createOrUpdateRates, ge
338
338
  handleServiceToggle(service.title, true);
339
339
  }
340
340
  } })),
341
- react_1.default.createElement(core_1.Box, { sx: { flex: 1 } },
341
+ react_1.default.createElement(core_1.Box, { sx: { flex: 1, width: '100%' } },
342
342
  react_1.default.createElement(core_1.Box, { display: 'flex', alignItems: 'center', justifyContent: 'space-between' },
343
343
  react_1.default.createElement(core_1.Box, { display: 'flex', alignItems: 'center' },
344
344
  react_1.default.createElement(core_1.Typography, { component: "div", style: { fontWeight: 600, fontSize: '12px', color: '#1C1F2B', fontFamily: "Roboto" } },
@@ -1,6 +1,6 @@
1
- type SectionContents = {
2
- handleClose?: (...args: any) => void;
3
- formError?: boolean;
4
- };
5
- declare const Error: ({ handleClose }: SectionContents) => JSX.Element;
6
- export default Error;
1
+ import React from "react";
2
+ interface ErrorProps {
3
+ message?: string;
4
+ }
5
+ declare const Error: ({ message }: ErrorProps) => React.JSX.Element;
6
+ export default Error;
@@ -1,40 +1,16 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const react_1 = __importDefault(require("react"));
7
- const core_1 = require("@material-ui/core");
8
- const styled_components_1 = __importDefault(require("styled-components"));
9
- const colors_1 = __importDefault(require("../shared/constants/colors"));
10
- const CopyToClipboardAlert_1 = __importDefault(require("./CopyToClipboardAlert"));
11
- const ErrorBox = (0, styled_components_1.default)(core_1.Box) `
12
- width: 100%;
13
- padding-bottom: 100;
14
- `;
15
- const ParoTitle = (0, styled_components_1.default)(core_1.Box) `
16
- color: ${colors_1.default.paroBlack};
17
- padding: 0px 0px 18px 0px;
18
- `;
19
- const ParoSubtitle = styled_components_1.default.div `
20
- color: ${colors_1.default.paroBlack};
21
- margin-bottom: 24px;
22
- font-size: 1rem;
23
- `;
24
- const reloadWindow = () => {
25
- window.location.reload();
26
- };
27
- const Error = ({ handleClose }) => {
28
- const handleCancel = handleClose ? handleClose : reloadWindow;
29
- const handleCancelLanguage = handleClose ? 'Close' : 'Retry';
30
- return (react_1.default.createElement(ErrorBox, null,
31
- react_1.default.createElement(core_1.Box, { display: 'flex', alignContent: 'center', alignItems: 'center', justifyContent: 'center', flexDirection: 'column', padding: '100px 0px 36px 5px;' },
32
- react_1.default.createElement(core_1.Typography, { variant: 'h6', gutterBottom: true },
33
- react_1.default.createElement(ParoTitle, null, "Oops! We had a misstep.")),
34
- react_1.default.createElement(core_1.Typography, { component: 'span', gutterBottom: true },
35
- react_1.default.createElement(ParoSubtitle, null, "Contact support if the issue persists")),
36
- react_1.default.createElement(core_1.DialogActions, null,
37
- react_1.default.createElement(core_1.Button, { variant: 'outlined', onClick: handleCancel, color: 'primary' }, handleCancelLanguage),
38
- react_1.default.createElement(CopyToClipboardAlert_1.default, { alertMessage: 'Email address copied to clipboard', button: core_1.Button, buttonContent: 'Copy support email', copyContent: 'people@paro.io', variant: 'contained' })))));
39
- };
40
- exports.default = Error;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const Error = ({ message = 'Error while loading this page. Please refresh and try again.' }) => {
8
+ return (react_1.default.createElement(react_1.default.Fragment, null,
9
+ react_1.default.createElement("div", { className: "flex align-middle justify-center" },
10
+ react_1.default.createElement("div", { className: "flex-col" },
11
+ react_1.default.createElement("div", { className: "flex item-center justify-center" },
12
+ react_1.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-12 w-12 text-grey-light", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" },
13
+ react_1.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }))),
14
+ react_1.default.createElement("div", { className: "text-grey" }, message)))));
15
+ };
16
+ exports.default = Error;
package/lib/index.d.ts CHANGED
@@ -9,3 +9,4 @@ export { DocumentCenter } from './components/DocumentCenter';
9
9
  export { HeaderNavBar } from './components/HeaderNavBar';
10
10
  export { ServiceLinesTemplate } from './components/ServiceLinesTemplate';
11
11
  export { sharedUtils } from './components/shared/utils';
12
+ export { ActiveProjectCard } from './components/ProjectCard/ActiveProjectCard';
package/lib/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- 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.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");
@@ -23,3 +23,5 @@ var ServiceLinesTemplate_1 = require("./components/ServiceLinesTemplate");
23
23
  Object.defineProperty(exports, "ServiceLinesTemplate", { enumerable: true, get: function () { return ServiceLinesTemplate_1.ServiceLinesTemplate; } });
24
24
  var utils_1 = require("./components/shared/utils");
25
25
  Object.defineProperty(exports, "sharedUtils", { enumerable: true, get: function () { return utils_1.sharedUtils; } });
26
+ var ActiveProjectCard_1 = require("./components/ProjectCard/ActiveProjectCard");
27
+ Object.defineProperty(exports, "ActiveProjectCard", { enumerable: true, get: function () { return ActiveProjectCard_1.ActiveProjectCard; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paro.io/expert-shared-components",
3
- "version": "1.9.5",
3
+ "version": "1.9.7",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -18,6 +18,7 @@
18
18
  "author": "apande@paro.io",
19
19
  "license": "MIT",
20
20
  "dependencies": {
21
+ "@date-io/dayjs": "1.x",
21
22
  "@fortawesome/fontawesome-svg-core": "^6.6.0",
22
23
  "@fortawesome/free-solid-svg-icons": "^6.6.0",
23
24
  "@fortawesome/react-fontawesome": "^0.2.2",
@@ -25,11 +26,13 @@
25
26
  "@material-ui/core": "^4.11.0",
26
27
  "@material-ui/icons": "^4.11.3",
27
28
  "@material-ui/lab": "^4.0.0-alpha.61",
29
+ "@material-ui/pickers": "^3.3.11",
28
30
  "@paro.io/base-icons": "^1.0.4",
29
31
  "@paro.io/base-ui": "^1.8.3",
30
32
  "@types/react-input-mask": "^3.0.5",
31
33
  "dayjs": "^1.10.7",
32
34
  "lodash": "^4.17.21",
35
+ "moment": "2.29.4",
33
36
  "react": "^18.2.0",
34
37
  "react-copy-to-clipboard": "^5.0.4",
35
38
  "react-datepicker": "^4.6.0",