@paro.io/expert-shared-components 1.14.13 → 1.14.15
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/LICENSE +21 -21
- package/README.md +2 -2
- package/lib/components/ClientReferencesSection/DeleteButton.js +11 -11
- package/lib/components/ClientReferencesSection/ParoError.js +10 -10
- package/lib/components/ClientReferencesSection/TagsSection.js +2 -2
- package/lib/components/ClientReferencesSection/styles/BrandedTypography.js +2 -2
- package/lib/components/ClientReferencesSection/styles/Buttons.js +15 -15
- package/lib/components/ClientReferencesSection/styles/Name.js +5 -5
- package/lib/components/ClientReferencesSection/styles/NullContentConditionalColor.js +4 -4
- package/lib/components/ClientReferencesSection/styles/SectionBody.js +11 -11
- package/lib/components/ClientReferencesSection/styles/SectionTitle.js +6 -6
- package/lib/components/ClientReferencesSection/styles/Tags.js +2 -2
- package/lib/components/DiscussionThread/chat.d.ts +22 -22
- package/lib/components/DiscussionThread/chat.js +106 -106
- package/lib/components/DocumentCenter/DocumentTable.d.ts +15 -15
- package/lib/components/DocumentCenter/DocumentTable.js +350 -350
- package/lib/components/DocumentCenter/UploadFilesButton.d.ts +6 -6
- package/lib/components/DocumentCenter/UploadFilesButton.js +29 -29
- package/lib/components/EarningsTracker/ActiveProjectCard.d.ts +52 -52
- package/lib/components/EarningsTracker/ActiveProjectCard.js +161 -161
- package/lib/components/EarningsTracker/CenterCardUI.d.ts +13 -13
- package/lib/components/EarningsTracker/CenterCardUI.js +134 -134
- package/lib/components/EarningsTracker/EarningsTracker.d.ts +52 -52
- package/lib/components/EarningsTracker/EarningsTracker.js +508 -508
- package/lib/components/EarningsTracker/EditDateModal.d.ts +22 -22
- package/lib/components/EarningsTracker/EditDateModal.js +149 -149
- package/lib/components/EarningsTracker/EmailModal.d.ts +14 -14
- package/lib/components/EarningsTracker/EmailModal.js +79 -79
- package/lib/components/EarningsTracker/EndProjectModal.d.ts +56 -56
- package/lib/components/EarningsTracker/EndProjectModal.js +221 -221
- package/lib/components/EarningsTracker/LeftCardUI.d.ts +18 -18
- package/lib/components/EarningsTracker/LeftCardUI.js +189 -189
- package/lib/components/EarningsTracker/LogTimeModalAuthenticated.d.ts +52 -52
- package/lib/components/EarningsTracker/LogTimeModalAuthenticated.js +358 -358
- package/lib/components/EarningsTracker/ProgressBar.d.ts +4 -4
- package/lib/components/EarningsTracker/ProgressBar.js +66 -66
- package/lib/components/EarningsTracker/ReviewRequestModal.d.ts +17 -17
- package/lib/components/EarningsTracker/ReviewRequestModal.js +135 -135
- package/lib/components/EarningsTracker/RightCardUI.d.ts +46 -46
- package/lib/components/EarningsTracker/RightCardUI.js +231 -231
- package/lib/components/EarningsTracker/index.d.ts +1 -1
- package/lib/components/EarningsTracker/index.js +5 -5
- package/lib/components/Escalations/CustomTag.d.ts +3 -3
- package/lib/components/Escalations/CustomTag.js +25 -25
- package/lib/components/Escalations/ViewReponseModal.d.ts +8 -8
- package/lib/components/Escalations/ViewReponseModal.js +27 -27
- package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
- package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -7
- package/lib/components/ExpertProfileHeader/TeamsSection.js +1 -1
- package/lib/components/HeaderNavBar/index.d.ts +1 -1
- package/lib/components/HeaderNavBar/index.js +11 -3
- package/lib/components/Invoices/DiscussionSection.js +1 -1
- package/lib/components/Invoices/InvoiceCard.js +1 -1
- package/lib/components/Invoices/TestDecisionSection.d.ts +1 -1
- package/lib/components/Invoices/TestDecisionSection.js +126 -126
- package/lib/components/OrganizationChart/OrgChart.d.ts +15 -1
- package/lib/components/OrganizationChart/OrgChart.js +33 -30
- package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
- package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
- package/lib/components/OrganizationChart/PersonCard.js +5 -5
- package/lib/components/OrganizationChart/utils.d.ts +1 -1
- package/lib/components/OrganizationChart/utils.js +80 -80
- package/lib/components/ProjectCard/ProgressBar.js +4 -4
- package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
- package/lib/components/ProjectIntelligence/MissingInformation/index.js +1 -1
- package/lib/components/Reviews/Pagination.js +6 -6
- package/lib/components/ReviewsTab/RatingHeader.js +6 -6
- package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
- package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
- package/lib/components/shared/Image.js +13 -13
- package/lib/components/shared/ProfileTextField.d.ts +18 -18
- package/lib/components/shared/ProfileTextField.js +16 -16
- package/lib/components/shared/StyledActionButtons.d.ts +7 -7
- package/lib/components/shared/StyledActionButtons.js +15 -15
- package/lib/components/shared/ToastNotification.d.ts +10 -10
- package/lib/components/shared/ToastNotification.js +63 -63
- package/package.json +67 -67
|
@@ -1,189 +1,189 @@
|
|
|
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.LeftCardUI = void 0;
|
|
39
|
-
const react_1 = __importStar(require("react"));
|
|
40
|
-
const core_1 = require("@material-ui/core");
|
|
41
|
-
const base_icons_1 = require("@paro.io/base-icons");
|
|
42
|
-
const ActiveProjectCard_1 = require("./ActiveProjectCard");
|
|
43
|
-
const moment_1 = __importDefault(require("moment"));
|
|
44
|
-
const react_hot_toast_1 = __importDefault(require("react-hot-toast"));
|
|
45
|
-
const base_ui_1 = require("@paro.io/base-ui");
|
|
46
|
-
const ProgressBar_1 = __importStar(require("./ProgressBar"));
|
|
47
|
-
const LeftCardUI = ({ projectData, projectRateType, projectFrequencyType, project, isAuthenticated, activeProject, adhocProject, freelancerId, selectedTab, updateProjectTaskMutation, GetAllProjectIrprDetailsForFreelancerDocument, updateProjectTask, clientPortal, }) => {
|
|
48
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
49
|
-
const projectHealth = (_a = project === null || project === void 0 ? void 0 : project.healthGrade) !== null && _a !== void 0 ? _a : "!";
|
|
50
|
-
const maxFloorHours = (_b = projectData === null || projectData === void 0 ? void 0 : projectData.maxHours) !== null && _b !== void 0 ? _b : 0;
|
|
51
|
-
const loggedHours = (_c = projectData === null || projectData === void 0 ? void 0 : projectData.hoursInvoiced) !== null && _c !== void 0 ? _c : 0;
|
|
52
|
-
const payRate = (_d = projectData === null || projectData === void 0 ? void 0 : projectData.expertRate) !== null && _d !== void 0 ? _d : 0;
|
|
53
|
-
const invoicedAmount = payRate * loggedHours;
|
|
54
|
-
const expertSowValue = (_e = projectData === null || projectData === void 0 ? void 0 : projectData.expertSowValue) !== null && _e !== void 0 ? _e : 0;
|
|
55
|
-
const isNegative = (expertSowValue - invoicedAmount) < 0;
|
|
56
|
-
const textColor = isNegative ? "#A73A43" : "#248384";
|
|
57
|
-
const classes = (0, ActiveProjectCard_1.useStyles)();
|
|
58
|
-
const endDate = (0, moment_1.default)((_f = projectData === null || projectData === void 0 ? void 0 : projectData.endDate) !== null && _f !== void 0 ? _f : (0, moment_1.default)().format('YYYY-MM-DD'));
|
|
59
|
-
const startDate = (0, moment_1.default)((_g = projectData === null || projectData === void 0 ? void 0 : projectData.startDate) !== null && _g !== void 0 ? _g : (0, moment_1.default)().format('YYYY-MM-DD'));
|
|
60
|
-
const totalProjectHrs = (projectData === null || projectData === void 0 ? void 0 : projectData.totalProjectHrs) || 0;
|
|
61
|
-
const containerRef = (0, react_1.useRef)(null);
|
|
62
|
-
const today = new Date();
|
|
63
|
-
const currMonth = today.toLocaleDateString('en-US', { month: 'short' });
|
|
64
|
-
const { minFloorHours } = (0, ActiveProjectCard_1.getAllProjectRecommendationData)({ projectData });
|
|
65
|
-
const toolTipText = projectFrequencyType === "Recurring" ? "(Max Hours for a month * Expert Rate for that project) - Monthly $ Invoiced" : "";
|
|
66
|
-
/* How earnings are calculated
|
|
67
|
-
Project Type:
|
|
68
|
-
·Fixed One Time: Total $ for project - (Hours Invoiced * Expert Rate)
|
|
69
|
-
·Fixed Recurring: Expert Rate for Project(aka Monthly Earnings)
|
|
70
|
-
·If even one hour invoiced for Fixed Recurring project, then no unrealized earnings
|
|
71
|
-
·Hourly One Time: Max Hours * Expert Rate - ( Hours Invoiced * Expert Rate)
|
|
72
|
-
·Hourly Recurring: Max Hours * Expert Rate - ( Hours Invoiced * Expert Rate)
|
|
73
|
-
*/
|
|
74
|
-
const calculateUnrealizedEarnings = (projectFrequency, projectRate, data) => {
|
|
75
|
-
if (!data)
|
|
76
|
-
return;
|
|
77
|
-
const oneTime = (data === null || data === void 0 ? void 0 : data.maxHours) * (data === null || data === void 0 ? void 0 : data.expertRate);
|
|
78
|
-
if (projectRate === "Hourly") {
|
|
79
|
-
return oneTime - invoicedAmount;
|
|
80
|
-
}
|
|
81
|
-
if (projectRate === "Fixed" && projectFrequency === "One-time") {
|
|
82
|
-
const { expertSowValue } = data;
|
|
83
|
-
return expertSowValue - invoicedAmount;
|
|
84
|
-
}
|
|
85
|
-
if (projectRate === "Fixed" && projectFrequency === "Recurring") {
|
|
86
|
-
// Hours invoiced is total hours invoiced since start of month
|
|
87
|
-
const { hoursInvoiced, expertRate } = data;
|
|
88
|
-
if (hoursInvoiced > 0) {
|
|
89
|
-
return 0;
|
|
90
|
-
}
|
|
91
|
-
return expertRate;
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
const totalUnrealizedEarnings = startDate.diff(endDate, 'months') * maxFloorHours * payRate;
|
|
95
|
-
const [tskid, setTskid] = (0, react_1.useState)(undefined);
|
|
96
|
-
const [statusId, setStatusId] = (0, react_1.useState)(undefined);
|
|
97
|
-
const loadingUpdateTask = false;
|
|
98
|
-
const updateTaskStatus = (taskId, statusValue) => __awaiter(void 0, void 0, void 0, function* () {
|
|
99
|
-
console.log(`Updating task ${taskId} status to ${statusValue}`);
|
|
100
|
-
try {
|
|
101
|
-
setTskid(taskId);
|
|
102
|
-
setStatusId(statusValue);
|
|
103
|
-
isAuthenticated ?
|
|
104
|
-
updateProjectTaskMutation({
|
|
105
|
-
variables: { id: taskId, statusId: statusValue },
|
|
106
|
-
refetchQueries: [
|
|
107
|
-
{ query: GetAllProjectIrprDetailsForFreelancerDocument, variables: { freelancerId, projectType: 3, activeTabId: selectedTab } }
|
|
108
|
-
]
|
|
109
|
-
}).then((res) => {
|
|
110
|
-
if (res) {
|
|
111
|
-
(0, react_hot_toast_1.default)(react_1.default.createElement(base_ui_1.Alert, { color: "success", icon: "success", label: `Successfully updated task status` }), {
|
|
112
|
-
position: 'bottom-right',
|
|
113
|
-
style: { borderRadius: '8px' },
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
}) : yield updateProjectTask({ id: taskId, statusId: statusValue });
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
console.error(`Error updating status`, error);
|
|
120
|
-
(0, react_hot_toast_1.default)(react_1.default.createElement(base_ui_1.Alert, { color: "danger", icon: "danger", label: `Failed to update` }), {
|
|
121
|
-
position: 'bottom-right',
|
|
122
|
-
style: { borderRadius: '8px' },
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
setTskid(undefined);
|
|
126
|
-
setStatusId(undefined);
|
|
127
|
-
});
|
|
128
|
-
return (react_1.default.createElement("div", { className: `flex w-full ${projectRateType === "Fixed" ? "flex-col items-center justify-around gap-x-10 gap-y-4 md:flex-row" : "flex-col md:w-1/3"}` },
|
|
129
|
-
projectRateType === "Fixed" &&
|
|
130
|
-
react_1.default.createElement("div", { className: 'mb-2 w-3/4' },
|
|
131
|
-
react_1.default.createElement("div", { className: "flex py-3" },
|
|
132
|
-
react_1.default.createElement("div", { className: "flex-1 pr-4 sm:pr-2 text-right sm:text-left font-bold text-lg" }, "SOW Tasks:"),
|
|
133
|
-
react_1.default.createElement("div", { className: "flex-initial w-44 pl-4 sm:pl-2 text-left sm:text-left font-bold text-lg mr-4" }, "Status")),
|
|
134
|
-
react_1.default.createElement("div", null, ((_h = project === null || project === void 0 ? void 0 : project.projectScopeTasks) === null || _h === void 0 ? void 0 : _h.length) > 0 ? (project.projectScopeTasks.map((task) => {
|
|
135
|
-
var _a;
|
|
136
|
-
return (react_1.default.createElement("div", { className: "flex py-3 items-center justify-between my-4" },
|
|
137
|
-
react_1.default.createElement("div", { key: task.id, className: 'flex-1 pr-4 sm:pr-2 text-right sm:text-left mr-4' },
|
|
138
|
-
react_1.default.createElement("div", { ref: containerRef, className: 'w-full' },
|
|
139
|
-
react_1.default.createElement("p", { className: 'border px-2 py-1 rounded bg-slate-100 flex-wrap' }, String((_a = task === null || task === void 0 ? void 0 : task.name) !== null && _a !== void 0 ? _a : '')))),
|
|
140
|
-
react_1.default.createElement("div", { className: 'flex-initial w-44 pl-5 sm:pl-2 text-left sm:text-left mr-4' },
|
|
141
|
-
react_1.default.createElement(core_1.FormControl, { fullWidth: true },
|
|
142
|
-
react_1.default.createElement(core_1.Select, { labelId: "status", id: "status", label: "Status", value: task.statusId || '', variant: "standard", className: "border-none w-36", onChange: (event) => {
|
|
143
|
-
const newStatusValue = event.target.value;
|
|
144
|
-
updateTaskStatus(task.id, newStatusValue);
|
|
145
|
-
}, disabled: loadingUpdateTask || !activeProject || clientPortal },
|
|
146
|
-
react_1.default.createElement(core_1.MenuItem, { value: 2 }, "Pending"),
|
|
147
|
-
react_1.default.createElement(core_1.MenuItem, { value: 1 }, "Completed"),
|
|
148
|
-
react_1.default.createElement(core_1.MenuItem, { value: 3 }, "In Progress"),
|
|
149
|
-
react_1.default.createElement(core_1.MenuItem, { value: 4 }, "Not Needed"))))));
|
|
150
|
-
})) : (react_1.default.createElement("p", null, "No tasks found")))),
|
|
151
|
-
projectRateType !== "Fixed" && react_1.default.createElement(react_1.default.Fragment, null,
|
|
152
|
-
!adhocProject && (react_1.default.createElement("div", { className: "flex flex-col justify-content-center items-center" },
|
|
153
|
-
react_1.default.createElement("h1", { className: "text-md font-bold" }, "Project Health Grade"),
|
|
154
|
-
react_1.default.createElement(core_1.Tooltip, { classes: { tooltip: classes.tooltip }, title: "Project health grades can take up to 24 hours to update even after logging hours.", placement: "top", arrow: true },
|
|
155
|
-
react_1.default.createElement("div", { className: `h-12 w-16 border-2 border-solid rounded-md flex place-content-center items-center mt-4 ${['A', 'B', 'C', 'D'].includes(projectHealth) ? (['A', 'B'].includes(projectHealth) && "bg-[#F1F5F9] border-[#A3DCD8]") || (['C', 'D'].includes(projectHealth) && "bg-[#A73A43 border-[#F9C34F]") : "bg-[#A73A43] text-[#F1F5F9] border-[#F1F5F9]"}` },
|
|
156
|
-
react_1.default.createElement("h1", { className: "text-xl" }, projectHealth))))),
|
|
157
|
-
!adhocProject && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
158
|
-
react_1.default.createElement("div", { className: "mt-8" },
|
|
159
|
-
(projectData === null || projectData === void 0 ? void 0 : projectData.minFloorHours) > 0 && react_1.default.createElement(ActiveProjectCard_1.CheckItem, { checked: projectData === null || projectData === void 0 ? void 0 : projectData.minimumFloorHoursCompleted, text: "Minimum Floor Hours Completed" }),
|
|
160
|
-
react_1.default.createElement(ActiveProjectCard_1.CheckItem, { checked: projectData === null || projectData === void 0 ? void 0 : projectData.weeklyMinHoursLogged, text: "Weekly Minimum Hours Logged" })),
|
|
161
|
-
react_1.default.createElement("div", { className: "flex flex-row m-2 gap-x-1" },
|
|
162
|
-
react_1.default.createElement("p", null, "How does this grade affect me?"),
|
|
163
|
-
react_1.default.createElement(core_1.Tooltip, { classes: { tooltip: classes.tooltip }, title: "This grade does not have an impact on your standing with Paro but if you see a low grade or action required, please reach out to the Customer Success Team to help make sure you are staying up to date with your projects.", placement: "top", arrow: true },
|
|
164
|
-
react_1.default.createElement("div", null,
|
|
165
|
-
react_1.default.createElement(base_icons_1.IconInfoCircle, null)))))),
|
|
166
|
-
react_1.default.createElement("p", { className: "font-bold text-lg mt-6 mb-6" }, projectFrequencyType === "Recurring" ? `Hours Logged for ${currMonth}` : "Hours Logged"),
|
|
167
|
-
react_1.default.createElement("div", { className: "mb-10 mt-10" },
|
|
168
|
-
react_1.default.createElement(ProgressBar_1.default, { minFloorHours: Number(minFloorHours), maxFloorHours: Number(maxFloorHours), loggedHours: Number(loggedHours) }))),
|
|
169
|
-
react_1.default.createElement("div", { className: `flex flex-col ${projectRateType === 'Fixed' ? "w-full md:w-1/4 mt-2" : "w-full"}` },
|
|
170
|
-
react_1.default.createElement("div", { className: "flex flex-row justify-between" },
|
|
171
|
-
react_1.default.createElement("p", null,
|
|
172
|
-
projectFrequencyType === "Recurring" && "Monthly",
|
|
173
|
-
" Hours Invoiced"),
|
|
174
|
-
react_1.default.createElement("p", null, (0, ProgressBar_1.formatNumberingSystem)(loggedHours))),
|
|
175
|
-
react_1.default.createElement("div", { className: "flex flex-row justify-between" },
|
|
176
|
-
react_1.default.createElement("p", null,
|
|
177
|
-
projectFrequencyType === "Recurring" && "Monthly",
|
|
178
|
-
" $ Invoiced"),
|
|
179
|
-
react_1.default.createElement("p", null,
|
|
180
|
-
"$ ",
|
|
181
|
-
(0, ProgressBar_1.formatNumberingSystem)(invoicedAmount))),
|
|
182
|
-
react_1.default.createElement(core_1.Tooltip, { classes: { tooltip: classes.tooltip }, title: toolTipText, placement: "top", arrow: true },
|
|
183
|
-
react_1.default.createElement("div", { className: "flex flex-row justify-between mt-1 font-bold text-md" },
|
|
184
|
-
react_1.default.createElement("p", null, projectFrequencyType === 'Recurring' ? 'Monthly Unrealized Earnings' : 'Unrealized Earnings'),
|
|
185
|
-
react_1.default.createElement("p", { className: `text-[${textColor}]` },
|
|
186
|
-
"$ ",
|
|
187
|
-
(0, ProgressBar_1.formatNumberingSystem)(Math.max(calculateUnrealizedEarnings(projectFrequencyType, projectRateType, projectData), 0))))))));
|
|
188
|
-
};
|
|
189
|
-
exports.LeftCardUI = LeftCardUI;
|
|
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.LeftCardUI = void 0;
|
|
39
|
+
const react_1 = __importStar(require("react"));
|
|
40
|
+
const core_1 = require("@material-ui/core");
|
|
41
|
+
const base_icons_1 = require("@paro.io/base-icons");
|
|
42
|
+
const ActiveProjectCard_1 = require("./ActiveProjectCard");
|
|
43
|
+
const moment_1 = __importDefault(require("moment"));
|
|
44
|
+
const react_hot_toast_1 = __importDefault(require("react-hot-toast"));
|
|
45
|
+
const base_ui_1 = require("@paro.io/base-ui");
|
|
46
|
+
const ProgressBar_1 = __importStar(require("./ProgressBar"));
|
|
47
|
+
const LeftCardUI = ({ projectData, projectRateType, projectFrequencyType, project, isAuthenticated, activeProject, adhocProject, freelancerId, selectedTab, updateProjectTaskMutation, GetAllProjectIrprDetailsForFreelancerDocument, updateProjectTask, clientPortal, }) => {
|
|
48
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
49
|
+
const projectHealth = (_a = project === null || project === void 0 ? void 0 : project.healthGrade) !== null && _a !== void 0 ? _a : "!";
|
|
50
|
+
const maxFloorHours = (_b = projectData === null || projectData === void 0 ? void 0 : projectData.maxHours) !== null && _b !== void 0 ? _b : 0;
|
|
51
|
+
const loggedHours = (_c = projectData === null || projectData === void 0 ? void 0 : projectData.hoursInvoiced) !== null && _c !== void 0 ? _c : 0;
|
|
52
|
+
const payRate = (_d = projectData === null || projectData === void 0 ? void 0 : projectData.expertRate) !== null && _d !== void 0 ? _d : 0;
|
|
53
|
+
const invoicedAmount = payRate * loggedHours;
|
|
54
|
+
const expertSowValue = (_e = projectData === null || projectData === void 0 ? void 0 : projectData.expertSowValue) !== null && _e !== void 0 ? _e : 0;
|
|
55
|
+
const isNegative = (expertSowValue - invoicedAmount) < 0;
|
|
56
|
+
const textColor = isNegative ? "#A73A43" : "#248384";
|
|
57
|
+
const classes = (0, ActiveProjectCard_1.useStyles)();
|
|
58
|
+
const endDate = (0, moment_1.default)((_f = projectData === null || projectData === void 0 ? void 0 : projectData.endDate) !== null && _f !== void 0 ? _f : (0, moment_1.default)().format('YYYY-MM-DD'));
|
|
59
|
+
const startDate = (0, moment_1.default)((_g = projectData === null || projectData === void 0 ? void 0 : projectData.startDate) !== null && _g !== void 0 ? _g : (0, moment_1.default)().format('YYYY-MM-DD'));
|
|
60
|
+
const totalProjectHrs = (projectData === null || projectData === void 0 ? void 0 : projectData.totalProjectHrs) || 0;
|
|
61
|
+
const containerRef = (0, react_1.useRef)(null);
|
|
62
|
+
const today = new Date();
|
|
63
|
+
const currMonth = today.toLocaleDateString('en-US', { month: 'short' });
|
|
64
|
+
const { minFloorHours } = (0, ActiveProjectCard_1.getAllProjectRecommendationData)({ projectData });
|
|
65
|
+
const toolTipText = projectFrequencyType === "Recurring" ? "(Max Hours for a month * Expert Rate for that project) - Monthly $ Invoiced" : "";
|
|
66
|
+
/* How earnings are calculated
|
|
67
|
+
Project Type:
|
|
68
|
+
·Fixed One Time: Total $ for project - (Hours Invoiced * Expert Rate)
|
|
69
|
+
·Fixed Recurring: Expert Rate for Project(aka Monthly Earnings)
|
|
70
|
+
·If even one hour invoiced for Fixed Recurring project, then no unrealized earnings
|
|
71
|
+
·Hourly One Time: Max Hours * Expert Rate - ( Hours Invoiced * Expert Rate)
|
|
72
|
+
·Hourly Recurring: Max Hours * Expert Rate - ( Hours Invoiced * Expert Rate)
|
|
73
|
+
*/
|
|
74
|
+
const calculateUnrealizedEarnings = (projectFrequency, projectRate, data) => {
|
|
75
|
+
if (!data)
|
|
76
|
+
return;
|
|
77
|
+
const oneTime = (data === null || data === void 0 ? void 0 : data.maxHours) * (data === null || data === void 0 ? void 0 : data.expertRate);
|
|
78
|
+
if (projectRate === "Hourly") {
|
|
79
|
+
return oneTime - invoicedAmount;
|
|
80
|
+
}
|
|
81
|
+
if (projectRate === "Fixed" && projectFrequency === "One-time") {
|
|
82
|
+
const { expertSowValue } = data;
|
|
83
|
+
return expertSowValue - invoicedAmount;
|
|
84
|
+
}
|
|
85
|
+
if (projectRate === "Fixed" && projectFrequency === "Recurring") {
|
|
86
|
+
// Hours invoiced is total hours invoiced since start of month
|
|
87
|
+
const { hoursInvoiced, expertRate } = data;
|
|
88
|
+
if (hoursInvoiced > 0) {
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
return expertRate;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const totalUnrealizedEarnings = startDate.diff(endDate, 'months') * maxFloorHours * payRate;
|
|
95
|
+
const [tskid, setTskid] = (0, react_1.useState)(undefined);
|
|
96
|
+
const [statusId, setStatusId] = (0, react_1.useState)(undefined);
|
|
97
|
+
const loadingUpdateTask = false;
|
|
98
|
+
const updateTaskStatus = (taskId, statusValue) => __awaiter(void 0, void 0, void 0, function* () {
|
|
99
|
+
console.log(`Updating task ${taskId} status to ${statusValue}`);
|
|
100
|
+
try {
|
|
101
|
+
setTskid(taskId);
|
|
102
|
+
setStatusId(statusValue);
|
|
103
|
+
isAuthenticated ?
|
|
104
|
+
updateProjectTaskMutation({
|
|
105
|
+
variables: { id: taskId, statusId: statusValue },
|
|
106
|
+
refetchQueries: [
|
|
107
|
+
{ query: GetAllProjectIrprDetailsForFreelancerDocument, variables: { freelancerId, projectType: 3, activeTabId: selectedTab } }
|
|
108
|
+
]
|
|
109
|
+
}).then((res) => {
|
|
110
|
+
if (res) {
|
|
111
|
+
(0, react_hot_toast_1.default)(react_1.default.createElement(base_ui_1.Alert, { color: "success", icon: "success", label: `Successfully updated task status` }), {
|
|
112
|
+
position: 'bottom-right',
|
|
113
|
+
style: { borderRadius: '8px' },
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}) : yield updateProjectTask({ id: taskId, statusId: statusValue });
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error(`Error updating status`, error);
|
|
120
|
+
(0, react_hot_toast_1.default)(react_1.default.createElement(base_ui_1.Alert, { color: "danger", icon: "danger", label: `Failed to update` }), {
|
|
121
|
+
position: 'bottom-right',
|
|
122
|
+
style: { borderRadius: '8px' },
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
setTskid(undefined);
|
|
126
|
+
setStatusId(undefined);
|
|
127
|
+
});
|
|
128
|
+
return (react_1.default.createElement("div", { className: `flex w-full ${projectRateType === "Fixed" ? "flex-col items-center justify-around gap-x-10 gap-y-4 md:flex-row" : "flex-col md:w-1/3"}` },
|
|
129
|
+
projectRateType === "Fixed" &&
|
|
130
|
+
react_1.default.createElement("div", { className: 'mb-2 w-3/4' },
|
|
131
|
+
react_1.default.createElement("div", { className: "flex py-3" },
|
|
132
|
+
react_1.default.createElement("div", { className: "flex-1 pr-4 sm:pr-2 text-right sm:text-left font-bold text-lg" }, "SOW Tasks:"),
|
|
133
|
+
react_1.default.createElement("div", { className: "flex-initial w-44 pl-4 sm:pl-2 text-left sm:text-left font-bold text-lg mr-4" }, "Status")),
|
|
134
|
+
react_1.default.createElement("div", null, ((_h = project === null || project === void 0 ? void 0 : project.projectScopeTasks) === null || _h === void 0 ? void 0 : _h.length) > 0 ? (project.projectScopeTasks.map((task) => {
|
|
135
|
+
var _a;
|
|
136
|
+
return (react_1.default.createElement("div", { className: "flex py-3 items-center justify-between my-4" },
|
|
137
|
+
react_1.default.createElement("div", { key: task.id, className: 'flex-1 pr-4 sm:pr-2 text-right sm:text-left mr-4' },
|
|
138
|
+
react_1.default.createElement("div", { ref: containerRef, className: 'w-full' },
|
|
139
|
+
react_1.default.createElement("p", { className: 'border px-2 py-1 rounded bg-slate-100 flex-wrap' }, String((_a = task === null || task === void 0 ? void 0 : task.name) !== null && _a !== void 0 ? _a : '')))),
|
|
140
|
+
react_1.default.createElement("div", { className: 'flex-initial w-44 pl-5 sm:pl-2 text-left sm:text-left mr-4' },
|
|
141
|
+
react_1.default.createElement(core_1.FormControl, { fullWidth: true },
|
|
142
|
+
react_1.default.createElement(core_1.Select, { labelId: "status", id: "status", label: "Status", value: task.statusId || '', variant: "standard", className: "border-none w-36", onChange: (event) => {
|
|
143
|
+
const newStatusValue = event.target.value;
|
|
144
|
+
updateTaskStatus(task.id, newStatusValue);
|
|
145
|
+
}, disabled: loadingUpdateTask || !activeProject || clientPortal },
|
|
146
|
+
react_1.default.createElement(core_1.MenuItem, { value: 2 }, "Pending"),
|
|
147
|
+
react_1.default.createElement(core_1.MenuItem, { value: 1 }, "Completed"),
|
|
148
|
+
react_1.default.createElement(core_1.MenuItem, { value: 3 }, "In Progress"),
|
|
149
|
+
react_1.default.createElement(core_1.MenuItem, { value: 4 }, "Not Needed"))))));
|
|
150
|
+
})) : (react_1.default.createElement("p", null, "No tasks found")))),
|
|
151
|
+
projectRateType !== "Fixed" && react_1.default.createElement(react_1.default.Fragment, null,
|
|
152
|
+
!adhocProject && (react_1.default.createElement("div", { className: "flex flex-col justify-content-center items-center" },
|
|
153
|
+
react_1.default.createElement("h1", { className: "text-md font-bold" }, "Project Health Grade"),
|
|
154
|
+
react_1.default.createElement(core_1.Tooltip, { classes: { tooltip: classes.tooltip }, title: "Project health grades can take up to 24 hours to update even after logging hours.", placement: "top", arrow: true },
|
|
155
|
+
react_1.default.createElement("div", { className: `h-12 w-16 border-2 border-solid rounded-md flex place-content-center items-center mt-4 ${['A', 'B', 'C', 'D'].includes(projectHealth) ? (['A', 'B'].includes(projectHealth) && "bg-[#F1F5F9] border-[#A3DCD8]") || (['C', 'D'].includes(projectHealth) && "bg-[#A73A43 border-[#F9C34F]") : "bg-[#A73A43] text-[#F1F5F9] border-[#F1F5F9]"}` },
|
|
156
|
+
react_1.default.createElement("h1", { className: "text-xl" }, projectHealth))))),
|
|
157
|
+
!adhocProject && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
158
|
+
react_1.default.createElement("div", { className: "mt-8" },
|
|
159
|
+
(projectData === null || projectData === void 0 ? void 0 : projectData.minFloorHours) > 0 && react_1.default.createElement(ActiveProjectCard_1.CheckItem, { checked: projectData === null || projectData === void 0 ? void 0 : projectData.minimumFloorHoursCompleted, text: "Minimum Floor Hours Completed" }),
|
|
160
|
+
react_1.default.createElement(ActiveProjectCard_1.CheckItem, { checked: projectData === null || projectData === void 0 ? void 0 : projectData.weeklyMinHoursLogged, text: "Weekly Minimum Hours Logged" })),
|
|
161
|
+
react_1.default.createElement("div", { className: "flex flex-row m-2 gap-x-1" },
|
|
162
|
+
react_1.default.createElement("p", null, "How does this grade affect me?"),
|
|
163
|
+
react_1.default.createElement(core_1.Tooltip, { classes: { tooltip: classes.tooltip }, title: "This grade does not have an impact on your standing with Paro but if you see a low grade or action required, please reach out to the Customer Success Team to help make sure you are staying up to date with your projects.", placement: "top", arrow: true },
|
|
164
|
+
react_1.default.createElement("div", null,
|
|
165
|
+
react_1.default.createElement(base_icons_1.IconInfoCircle, null)))))),
|
|
166
|
+
react_1.default.createElement("p", { className: "font-bold text-lg mt-6 mb-6" }, projectFrequencyType === "Recurring" ? `Hours Logged for ${currMonth}` : "Hours Logged"),
|
|
167
|
+
react_1.default.createElement("div", { className: "mb-10 mt-10" },
|
|
168
|
+
react_1.default.createElement(ProgressBar_1.default, { minFloorHours: Number(minFloorHours), maxFloorHours: Number(maxFloorHours), loggedHours: Number(loggedHours) }))),
|
|
169
|
+
react_1.default.createElement("div", { className: `flex flex-col ${projectRateType === 'Fixed' ? "w-full md:w-1/4 mt-2" : "w-full"}` },
|
|
170
|
+
react_1.default.createElement("div", { className: "flex flex-row justify-between" },
|
|
171
|
+
react_1.default.createElement("p", null,
|
|
172
|
+
projectFrequencyType === "Recurring" && "Monthly",
|
|
173
|
+
" Hours Invoiced"),
|
|
174
|
+
react_1.default.createElement("p", null, (0, ProgressBar_1.formatNumberingSystem)(loggedHours))),
|
|
175
|
+
react_1.default.createElement("div", { className: "flex flex-row justify-between" },
|
|
176
|
+
react_1.default.createElement("p", null,
|
|
177
|
+
projectFrequencyType === "Recurring" && "Monthly",
|
|
178
|
+
" $ Invoiced"),
|
|
179
|
+
react_1.default.createElement("p", null,
|
|
180
|
+
"$ ",
|
|
181
|
+
(0, ProgressBar_1.formatNumberingSystem)(invoicedAmount))),
|
|
182
|
+
react_1.default.createElement(core_1.Tooltip, { classes: { tooltip: classes.tooltip }, title: toolTipText, placement: "top", arrow: true },
|
|
183
|
+
react_1.default.createElement("div", { className: "flex flex-row justify-between mt-1 font-bold text-md" },
|
|
184
|
+
react_1.default.createElement("p", null, projectFrequencyType === 'Recurring' ? 'Monthly Unrealized Earnings' : 'Unrealized Earnings'),
|
|
185
|
+
react_1.default.createElement("p", { className: `text-[${textColor}]` },
|
|
186
|
+
"$ ",
|
|
187
|
+
(0, ProgressBar_1.formatNumberingSystem)(Math.max(calculateUnrealizedEarnings(projectFrequencyType, projectRateType, projectData), 0))))))));
|
|
188
|
+
};
|
|
189
|
+
exports.LeftCardUI = LeftCardUI;
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import "date-fns";
|
|
3
|
-
export declare const roundMinutes: (minutes: number, hours: number) => {
|
|
4
|
-
hours: number;
|
|
5
|
-
minutes: number;
|
|
6
|
-
};
|
|
7
|
-
export declare const TASK_DESCRIPTION_VALIDATION: {
|
|
8
|
-
MAX_LENGTH: number;
|
|
9
|
-
MIN_LENGTH: number;
|
|
10
|
-
LENGTH_VALIDATION_MESSAGE: string;
|
|
11
|
-
};
|
|
12
|
-
export declare const constants: {
|
|
13
|
-
MINUTES_ERROR_MESSAGE: string;
|
|
14
|
-
HOURS_ERROR_MESSAGE: string;
|
|
15
|
-
DATE_FORMAT: string;
|
|
16
|
-
MAX_DATE: Date;
|
|
17
|
-
MIN_DATE: Date;
|
|
18
|
-
DATE_VALIDATION_MESSAGE: string;
|
|
19
|
-
TASK_DESCRIPTION_ERROR_MESSAGE: string;
|
|
20
|
-
};
|
|
21
|
-
type SelectDateProps = {
|
|
22
|
-
timeLogDate: any;
|
|
23
|
-
setTimeLogDate: (e: any) => void;
|
|
24
|
-
isInvalid: boolean | "";
|
|
25
|
-
setIsDateInvalid: (e: any) => void;
|
|
26
|
-
validateDate: (e: any) => boolean;
|
|
27
|
-
showErrorText?: boolean;
|
|
28
|
-
disabled?: boolean;
|
|
29
|
-
maxDate?: string;
|
|
30
|
-
minDate?: string;
|
|
31
|
-
};
|
|
32
|
-
export declare const SelectDate: ({ timeLogDate, setTimeLogDate, isInvalid, setIsDateInvalid, validateDate, showErrorText, disabled, maxDate, minDate }: SelectDateProps) => React.JSX.Element;
|
|
33
|
-
interface LogTimeModalAuthenticatedProps {
|
|
34
|
-
project: any;
|
|
35
|
-
freelancerId: number;
|
|
36
|
-
showTimeModal: boolean;
|
|
37
|
-
setShowTimeModal: (showTimeModal: boolean) => void;
|
|
38
|
-
isDateInvalid: any;
|
|
39
|
-
setIsDateInvalid: (isDateInvalid: any) => void;
|
|
40
|
-
validateDate: any;
|
|
41
|
-
setSingleProjectData: any;
|
|
42
|
-
projectData: any;
|
|
43
|
-
isAuthenticated: boolean;
|
|
44
|
-
selectedTab: number;
|
|
45
|
-
submitProjectHoursMutation: any;
|
|
46
|
-
GetAllProjectIrprDetailsForFreelancerDocument: any;
|
|
47
|
-
getAuth0Roles: any;
|
|
48
|
-
submitProjectHoursLambda: any;
|
|
49
|
-
user: any;
|
|
50
|
-
}
|
|
51
|
-
export declare const LogTimeModalAuthenticated: ({ project, freelancerId, showTimeModal, setShowTimeModal, isDateInvalid, setIsDateInvalid, validateDate, setSingleProjectData, projectData, isAuthenticated, selectedTab, submitProjectHoursMutation, GetAllProjectIrprDetailsForFreelancerDocument, getAuth0Roles, submitProjectHoursLambda, user, }: LogTimeModalAuthenticatedProps) => React.JSX.Element;
|
|
52
|
-
export {};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import "date-fns";
|
|
3
|
+
export declare const roundMinutes: (minutes: number, hours: number) => {
|
|
4
|
+
hours: number;
|
|
5
|
+
minutes: number;
|
|
6
|
+
};
|
|
7
|
+
export declare const TASK_DESCRIPTION_VALIDATION: {
|
|
8
|
+
MAX_LENGTH: number;
|
|
9
|
+
MIN_LENGTH: number;
|
|
10
|
+
LENGTH_VALIDATION_MESSAGE: string;
|
|
11
|
+
};
|
|
12
|
+
export declare const constants: {
|
|
13
|
+
MINUTES_ERROR_MESSAGE: string;
|
|
14
|
+
HOURS_ERROR_MESSAGE: string;
|
|
15
|
+
DATE_FORMAT: string;
|
|
16
|
+
MAX_DATE: Date;
|
|
17
|
+
MIN_DATE: Date;
|
|
18
|
+
DATE_VALIDATION_MESSAGE: string;
|
|
19
|
+
TASK_DESCRIPTION_ERROR_MESSAGE: string;
|
|
20
|
+
};
|
|
21
|
+
type SelectDateProps = {
|
|
22
|
+
timeLogDate: any;
|
|
23
|
+
setTimeLogDate: (e: any) => void;
|
|
24
|
+
isInvalid: boolean | "";
|
|
25
|
+
setIsDateInvalid: (e: any) => void;
|
|
26
|
+
validateDate: (e: any) => boolean;
|
|
27
|
+
showErrorText?: boolean;
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
maxDate?: string;
|
|
30
|
+
minDate?: string;
|
|
31
|
+
};
|
|
32
|
+
export declare const SelectDate: ({ timeLogDate, setTimeLogDate, isInvalid, setIsDateInvalid, validateDate, showErrorText, disabled, maxDate, minDate }: SelectDateProps) => React.JSX.Element;
|
|
33
|
+
interface LogTimeModalAuthenticatedProps {
|
|
34
|
+
project: any;
|
|
35
|
+
freelancerId: number;
|
|
36
|
+
showTimeModal: boolean;
|
|
37
|
+
setShowTimeModal: (showTimeModal: boolean) => void;
|
|
38
|
+
isDateInvalid: any;
|
|
39
|
+
setIsDateInvalid: (isDateInvalid: any) => void;
|
|
40
|
+
validateDate: any;
|
|
41
|
+
setSingleProjectData: any;
|
|
42
|
+
projectData: any;
|
|
43
|
+
isAuthenticated: boolean;
|
|
44
|
+
selectedTab: number;
|
|
45
|
+
submitProjectHoursMutation: any;
|
|
46
|
+
GetAllProjectIrprDetailsForFreelancerDocument: any;
|
|
47
|
+
getAuth0Roles: any;
|
|
48
|
+
submitProjectHoursLambda: any;
|
|
49
|
+
user: any;
|
|
50
|
+
}
|
|
51
|
+
export declare const LogTimeModalAuthenticated: ({ project, freelancerId, showTimeModal, setShowTimeModal, isDateInvalid, setIsDateInvalid, validateDate, setSingleProjectData, projectData, isAuthenticated, selectedTab, submitProjectHoursMutation, GetAllProjectIrprDetailsForFreelancerDocument, getAuth0Roles, submitProjectHoursLambda, user, }: LogTimeModalAuthenticatedProps) => React.JSX.Element;
|
|
52
|
+
export {};
|