@paro.io/expert-shared-components 1.13.13 → 1.14.0
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/Invoices/TestDecisionSection.d.ts +1 -1
- package/lib/components/Invoices/TestDecisionSection.js +126 -126
- 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.js +79 -79
- package/lib/components/ProjectCard/ProgressBar.js +4 -4
- package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
- package/lib/components/ProjectIntelligence/EngagementHeader/index.js +13 -10
- package/lib/components/ProjectIntelligence/FocusAreas/index.d.ts +2 -1
- package/lib/components/ProjectIntelligence/FocusAreas/index.js +49 -45
- package/lib/components/ProjectIntelligence/KeyMetrics/index.d.ts +19 -0
- package/lib/components/ProjectIntelligence/KeyMetrics/index.js +21 -24
- package/lib/components/ProjectIntelligence/MissingInformation/index.d.ts +1 -0
- package/lib/components/ProjectIntelligence/MissingInformation/index.js +39 -30
- package/lib/components/ProjectIntelligence/ProgressTracker/index.js +3 -2
- package/lib/components/ProjectIntelligence/ProjectHealth/index.js +18 -18
- package/lib/components/ProjectIntelligence/TeamSection/index.js +21 -14
- package/lib/components/ProjectIntelligence/index.d.ts +3 -0
- package/lib/components/ProjectIntelligence/index.js +29 -11
- 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
|
@@ -7,11 +7,11 @@ const react_1 = __importDefault(require("react"));
|
|
|
7
7
|
const PersonCard = ({ name, position, experience, location, initial, noOfchildren, }) => (react_1.default.createElement("div", { className: "relative group" },
|
|
8
8
|
react_1.default.createElement("div", { className: "flex flex-col items-center" },
|
|
9
9
|
react_1.default.createElement("div", { className: "flex flex-col items-center mb-2" },
|
|
10
|
-
react_1.default.createElement("div", { className: `
|
|
11
|
-
-mb-4 z-10 w-12 h-12 rounded-full bg-[#434889] flex items-center justify-center
|
|
12
|
-
text-white font-semibold text-lg
|
|
13
|
-
transition-all duration-200 hover:bg-[#102377]
|
|
14
|
-
${noOfchildren > 0 ? 'hover:shadow-lg' : ''}
|
|
10
|
+
react_1.default.createElement("div", { className: `
|
|
11
|
+
-mb-4 z-10 w-12 h-12 rounded-full bg-[#434889] flex items-center justify-center
|
|
12
|
+
text-white font-semibold text-lg
|
|
13
|
+
transition-all duration-200 hover:bg-[#102377]
|
|
14
|
+
${noOfchildren > 0 ? 'hover:shadow-lg' : ''}
|
|
15
15
|
` },
|
|
16
16
|
initial,
|
|
17
17
|
noOfchildren > 0 && (react_1.default.createElement("div", { className: "absolute -bottom-3 w-6 h-6 rounded bg-gray-400 flex items-center justify-center text-white text-sm" }, noOfchildren)))),
|
|
@@ -50,86 +50,86 @@ const transformEmployeeData = (employeeData, firstName, lastName, primaryService
|
|
|
50
50
|
};
|
|
51
51
|
};
|
|
52
52
|
exports.transformEmployeeData = transformEmployeeData;
|
|
53
|
-
exports.ConnectorContainer = styled_components_1.default.div `
|
|
54
|
-
position: relative;
|
|
55
|
-
width: 100%;
|
|
56
|
-
display: flex;
|
|
57
|
-
justify-content: center;
|
|
58
|
-
align-items: center;
|
|
59
|
-
|
|
60
|
-
&.parent-vertical-line {
|
|
61
|
-
height: 40px;
|
|
62
|
-
position: relative;
|
|
63
|
-
|
|
64
|
-
&:before {
|
|
65
|
-
content: '';
|
|
66
|
-
position: absolute;
|
|
67
|
-
top: 0;
|
|
68
|
-
left: 50%;
|
|
69
|
-
width: 2px;
|
|
70
|
-
height: calc(100% + 2px);
|
|
71
|
-
background-color: #D8D8D8;
|
|
72
|
-
transform: translateX(-50%);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
&.child-vertical-line {
|
|
77
|
-
height: 40px;
|
|
78
|
-
position: relative;
|
|
79
|
-
margin-bottom: 4px;
|
|
80
|
-
&:before {
|
|
81
|
-
content: '';
|
|
82
|
-
position: absolute;
|
|
83
|
-
left: 50%;
|
|
84
|
-
width: 2px;
|
|
85
|
-
height: 100%;
|
|
86
|
-
background-color: #D8D8D8;
|
|
87
|
-
transform: translateX(-50%);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
&:after {
|
|
91
|
-
content: '';
|
|
92
|
-
position: absolute;
|
|
93
|
-
bottom: -4px;
|
|
94
|
-
left: 50%;
|
|
95
|
-
width: 8px;
|
|
96
|
-
height: 8px;
|
|
97
|
-
border-right: 2px solid #D8D8D8;
|
|
98
|
-
border-bottom: 2px solid #D8D8D8;
|
|
99
|
-
transform: translateX(-50%) rotate(45deg);
|
|
100
|
-
background-color: transparent;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
&.horizontal-line {
|
|
105
|
-
position: absolute;
|
|
106
|
-
height: 2px;
|
|
107
|
-
background-color: #D8D8D8;
|
|
108
|
-
top: 0;
|
|
109
|
-
width: 100%;
|
|
110
|
-
}
|
|
53
|
+
exports.ConnectorContainer = styled_components_1.default.div `
|
|
54
|
+
position: relative;
|
|
55
|
+
width: 100%;
|
|
56
|
+
display: flex;
|
|
57
|
+
justify-content: center;
|
|
58
|
+
align-items: center;
|
|
59
|
+
|
|
60
|
+
&.parent-vertical-line {
|
|
61
|
+
height: 40px;
|
|
62
|
+
position: relative;
|
|
63
|
+
|
|
64
|
+
&:before {
|
|
65
|
+
content: '';
|
|
66
|
+
position: absolute;
|
|
67
|
+
top: 0;
|
|
68
|
+
left: 50%;
|
|
69
|
+
width: 2px;
|
|
70
|
+
height: calc(100% + 2px);
|
|
71
|
+
background-color: #D8D8D8;
|
|
72
|
+
transform: translateX(-50%);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
&.child-vertical-line {
|
|
77
|
+
height: 40px;
|
|
78
|
+
position: relative;
|
|
79
|
+
margin-bottom: 4px;
|
|
80
|
+
&:before {
|
|
81
|
+
content: '';
|
|
82
|
+
position: absolute;
|
|
83
|
+
left: 50%;
|
|
84
|
+
width: 2px;
|
|
85
|
+
height: 100%;
|
|
86
|
+
background-color: #D8D8D8;
|
|
87
|
+
transform: translateX(-50%);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
&:after {
|
|
91
|
+
content: '';
|
|
92
|
+
position: absolute;
|
|
93
|
+
bottom: -4px;
|
|
94
|
+
left: 50%;
|
|
95
|
+
width: 8px;
|
|
96
|
+
height: 8px;
|
|
97
|
+
border-right: 2px solid #D8D8D8;
|
|
98
|
+
border-bottom: 2px solid #D8D8D8;
|
|
99
|
+
transform: translateX(-50%) rotate(45deg);
|
|
100
|
+
background-color: transparent;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
&.horizontal-line {
|
|
105
|
+
position: absolute;
|
|
106
|
+
height: 2px;
|
|
107
|
+
background-color: #D8D8D8;
|
|
108
|
+
top: 0;
|
|
109
|
+
width: 100%;
|
|
110
|
+
}
|
|
111
111
|
`;
|
|
112
|
-
exports.InfoCard = (0, styled_components_1.default)(core_1.Card) `
|
|
113
|
-
position: absolute;
|
|
114
|
-
top: 10;
|
|
115
|
-
right: 0;
|
|
116
|
-
width: fit-content;
|
|
117
|
-
max-width: 30%;
|
|
118
|
-
z-index: 1000;
|
|
119
|
-
padding: 8px;
|
|
120
|
-
margin: 16px;
|
|
121
|
-
background-color: white;
|
|
122
|
-
border-radius: 8px;
|
|
123
|
-
box-shadow: none;
|
|
124
|
-
border: 1px solid #e2e8f0;
|
|
125
|
-
max-height: 90vh;
|
|
126
|
-
overflow: auto;
|
|
127
|
-
@media (max-width: 600px) {
|
|
128
|
-
position: absolute;
|
|
129
|
-
top: 20;
|
|
130
|
-
right: auto;
|
|
131
|
-
min-width: 90%;
|
|
132
|
-
}
|
|
112
|
+
exports.InfoCard = (0, styled_components_1.default)(core_1.Card) `
|
|
113
|
+
position: absolute;
|
|
114
|
+
top: 10;
|
|
115
|
+
right: 0;
|
|
116
|
+
width: fit-content;
|
|
117
|
+
max-width: 30%;
|
|
118
|
+
z-index: 1000;
|
|
119
|
+
padding: 8px;
|
|
120
|
+
margin: 16px;
|
|
121
|
+
background-color: white;
|
|
122
|
+
border-radius: 8px;
|
|
123
|
+
box-shadow: none;
|
|
124
|
+
border: 1px solid #e2e8f0;
|
|
125
|
+
max-height: 90vh;
|
|
126
|
+
overflow: auto;
|
|
127
|
+
@media (max-width: 600px) {
|
|
128
|
+
position: absolute;
|
|
129
|
+
top: 20;
|
|
130
|
+
right: auto;
|
|
131
|
+
min-width: 90%;
|
|
132
|
+
}
|
|
133
133
|
`;
|
|
134
134
|
exports.CustomDialog = (0, core_1.styled)(Dialog_1.default)(({ theme }) => ({
|
|
135
135
|
'& .MuiDialog-paper': {
|
|
@@ -44,15 +44,15 @@ const ProgressBar = ({ minFloorHours, maxFloorHours, loggedHours }) => {
|
|
|
44
44
|
};
|
|
45
45
|
return (react_1.default.createElement("div", { className: `relative m-6 ${minFloorHours <= 0 ? 'pt-4' : 'pt-6'}` },
|
|
46
46
|
react_1.default.createElement("div", { className: "h-8 w-full border-2 border-solid border-[#64748B] rounded-full relative flex flex-wrap bg-[#F1F5F9]" },
|
|
47
|
-
react_1.default.createElement("div", { className: `h-full w-full rounded-l-full ${isRounded ? 'rounded-r-full' : ''}
|
|
47
|
+
react_1.default.createElement("div", { className: `h-full w-full rounded-l-full ${isRounded ? 'rounded-r-full' : ''}
|
|
48
48
|
${totalLoggedHours >= minFloorHours && totalLoggedHours <= maxFloorHours
|
|
49
49
|
? 'bg-[#248384]'
|
|
50
50
|
: totalLoggedHours < minFloorHours
|
|
51
51
|
? 'bg-[#F9BABF]'
|
|
52
52
|
: 'bg-[#A73A43]'}`, style: { width: `${totalLoggedHours !== 0 ? ((totalLoggedHours / totalBar) * 100) : 0}%` } },
|
|
53
|
-
react_1.default.createElement("div", { className: `absolute top-1/2 left-1/2 transform -translate-x-1/2 z-10
|
|
54
|
-
${totalLoggedHours < (totalBar * 0.03) || totalLoggedHours > totalBar || (totalLoggedHours < (totalBar * 0.12)) ? 'translate-y-full' : '-translate-y-1/2'}
|
|
55
|
-
${totalLoggedHours < minFloorHours || totalLoggedHours === 0 ? 'text-black' : 'text-white'}
|
|
53
|
+
react_1.default.createElement("div", { className: `absolute top-1/2 left-1/2 transform -translate-x-1/2 z-10
|
|
54
|
+
${totalLoggedHours < (totalBar * 0.03) || totalLoggedHours > totalBar || (totalLoggedHours < (totalBar * 0.12)) ? 'translate-y-full' : '-translate-y-1/2'}
|
|
55
|
+
${totalLoggedHours < minFloorHours || totalLoggedHours === 0 ? 'text-black' : 'text-white'}
|
|
56
56
|
font-bold`, style: { left: `calc(${calculatePosition()}% - 1px)` } },
|
|
57
57
|
(0, exports.formatNumberingSystem)(totalLoggedHours),
|
|
58
58
|
" hrs")),
|
|
@@ -35,11 +35,11 @@ const react_hot_toast_1 = __importDefault(require("react-hot-toast"));
|
|
|
35
35
|
const ReviewRequestModal = ({ project, requestModal, setRequestModal, expertName, freelancerId, setRequestStatus, selectedProject, setSelectedProject, clientId, refetchParoProjects, setHighlightedRatings, createOrUpdateRatingRequestMutation, }) => {
|
|
36
36
|
var _a;
|
|
37
37
|
const [showError, setShowError] = (0, react_1.useState)(false);
|
|
38
|
-
const [textareaValue, setTextareaValue] = (0, react_1.useState)(`Hi ${(_a = project === null || project === void 0 ? void 0 : project.client) === null || _a === void 0 ? void 0 : _a.name},
|
|
39
|
-
I hope you are satisfied with the work I provided on ${project === null || project === void 0 ? void 0 : project.name}. Your feedback is very important to me and helps me improve my services and build my reputation on Paro. Could you please take a moment to leave a review of you experience? Your input is greatly appreciated!
|
|
40
|
-
|
|
41
|
-
Thank you in advance for your time and feedback.
|
|
42
|
-
Best regards,
|
|
38
|
+
const [textareaValue, setTextareaValue] = (0, react_1.useState)(`Hi ${(_a = project === null || project === void 0 ? void 0 : project.client) === null || _a === void 0 ? void 0 : _a.name},
|
|
39
|
+
I hope you are satisfied with the work I provided on ${project === null || project === void 0 ? void 0 : project.name}. Your feedback is very important to me and helps me improve my services and build my reputation on Paro. Could you please take a moment to leave a review of you experience? Your input is greatly appreciated!
|
|
40
|
+
|
|
41
|
+
Thank you in advance for your time and feedback.
|
|
42
|
+
Best regards,
|
|
43
43
|
${expertName}`);
|
|
44
44
|
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
45
45
|
const handleTextArea = (e) => {
|
|
@@ -6,15 +6,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.EngagementHeader = void 0;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const date_fns_1 = require("date-fns");
|
|
9
|
-
const base_ui_1 = require("@paro.io/base-ui");
|
|
10
|
-
const EscalationIssueCard_1 = require("../../Escalations/EscalationIssueCard");
|
|
11
9
|
const STATUS_COLORS = {
|
|
12
|
-
Discovery: '
|
|
13
|
-
Kickoff_Complete: '
|
|
14
|
-
In_Progress: '
|
|
15
|
-
Completed: '
|
|
16
|
-
Paused: '
|
|
17
|
-
Cancelled: '
|
|
10
|
+
Discovery: 'bg-orange-100 text-orange-800 border-orange-200',
|
|
11
|
+
Kickoff_Complete: 'bg-green-100 text-green-800 border-green-200',
|
|
12
|
+
In_Progress: 'bg-blue-100 text-blue-800 border-blue-200',
|
|
13
|
+
Completed: 'bg-gray-100 text-gray-800 border-gray-200',
|
|
14
|
+
Paused: 'bg-orange-100 text-orange-800 border-orange-200',
|
|
15
|
+
Cancelled: 'bg-red-100 text-red-800 border-red-200',
|
|
18
16
|
};
|
|
19
17
|
const STATUS_LABELS = {
|
|
20
18
|
Discovery: 'DISCOVERY',
|
|
@@ -29,7 +27,9 @@ const EngagementHeader = ({ clientName, expertName, expertTitle, startDate, stat
|
|
|
29
27
|
return (react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200" },
|
|
30
28
|
react_1.default.createElement("div", { className: "px-6 pt-4" },
|
|
31
29
|
react_1.default.createElement("p", { className: "text-sm font-medium text-gray-700 mb-3" }, "Select Client:"),
|
|
32
|
-
react_1.default.createElement("div", { className: "flex flex-wrap gap-2 mb-4" }, clientTabs.map((client) => (react_1.default.createElement(
|
|
30
|
+
react_1.default.createElement("div", { className: "flex flex-wrap gap-2 mb-4" }, clientTabs.map((client) => (react_1.default.createElement("button", { key: client.id, onClick: () => onClientChange(client.id), className: `px-3 py-1.5 text-sm font-medium rounded-md transition-colors cursor-pointer ${client.id === selectedClientId
|
|
31
|
+
? 'bg-blue bg-blue-600 text-white'
|
|
32
|
+
: 'bg-gray-100 text-gray-700 hover:bg-gray-200'}` }, client.label)))),
|
|
33
33
|
react_1.default.createElement("hr", { className: "border-gray-200" })),
|
|
34
34
|
react_1.default.createElement("div", { className: "px-6 py-4" },
|
|
35
35
|
react_1.default.createElement("div", { className: "flex items-center justify-between" },
|
|
@@ -42,6 +42,9 @@ const EngagementHeader = ({ clientName, expertName, expertTitle, startDate, stat
|
|
|
42
42
|
expertTitle,
|
|
43
43
|
" \u2022 Started ",
|
|
44
44
|
formattedDate)),
|
|
45
|
-
react_1.default.createElement(
|
|
45
|
+
react_1.default.createElement("div", { className: "flex items-center" },
|
|
46
|
+
react_1.default.createElement("span", { className: `inline-flex items-center px-3 py-1 rounded-full text-sm font-medium ${STATUS_COLORS[status]}` },
|
|
47
|
+
react_1.default.createElement("div", { className: "w-2 h-2 bg-current rounded-full mr-1.5" }),
|
|
48
|
+
STATUS_LABELS[status]))))));
|
|
46
49
|
};
|
|
47
50
|
exports.EngagementHeader = EngagementHeader;
|
|
@@ -12,7 +12,8 @@ interface FocusAreasProps {
|
|
|
12
12
|
onEditFocusAreas: () => void;
|
|
13
13
|
updateOpportunityFocusArea: any;
|
|
14
14
|
GetOpportunityInsightsDocument: any;
|
|
15
|
-
|
|
15
|
+
selectedOpportunityId: string;
|
|
16
|
+
onSaveFocusArea: any;
|
|
16
17
|
}
|
|
17
18
|
export declare const FocusAreas: React.FC<FocusAreasProps>;
|
|
18
19
|
export {};
|
|
@@ -27,30 +27,25 @@ exports.FocusAreas = void 0;
|
|
|
27
27
|
const react_1 = __importStar(require("react"));
|
|
28
28
|
const date_fns_1 = require("date-fns");
|
|
29
29
|
const utils_1 = require("../../shared/utils");
|
|
30
|
-
const core_1 = require("@material-ui/core");
|
|
31
|
-
const base_icons_1 = require("@paro.io/base-icons");
|
|
32
|
-
const base_ui_1 = require("@paro.io/base-ui");
|
|
33
|
-
const EscalationIssueCard_1 = require("../../Escalations/EscalationIssueCard");
|
|
34
|
-
const TeamSection_1 = require("../TeamSection");
|
|
35
30
|
const STATUS_COLORS = {
|
|
36
|
-
CONFIRMED:
|
|
37
|
-
IN_PROGRESS:
|
|
38
|
-
COMPLETED:
|
|
39
|
-
AT_RISK:
|
|
31
|
+
CONFIRMED: 'bg-green-100 text-green-800 border-green-200',
|
|
32
|
+
IN_PROGRESS: 'bg-blue-100 text-blue-800 border-blue-200',
|
|
33
|
+
COMPLETED: 'bg-gray-100 text-gray-800 border-gray-200',
|
|
34
|
+
AT_RISK: 'bg-red-100 text-red-800 border-red-200',
|
|
40
35
|
};
|
|
41
36
|
const STATUS_ICONS = {
|
|
42
|
-
CONFIRMED:
|
|
43
|
-
IN_PROGRESS:
|
|
44
|
-
COMPLETED:
|
|
45
|
-
AT_RISK:
|
|
37
|
+
CONFIRMED: '✓',
|
|
38
|
+
IN_PROGRESS: '•',
|
|
39
|
+
COMPLETED: '✓',
|
|
40
|
+
AT_RISK: '!',
|
|
46
41
|
};
|
|
47
42
|
const PRIORITY_COLORS = {
|
|
48
|
-
HIGH: '
|
|
49
|
-
MEDIUM: '
|
|
50
|
-
LOW: '
|
|
43
|
+
HIGH: 'text-red-600',
|
|
44
|
+
MEDIUM: 'text-yellow-600',
|
|
45
|
+
LOW: 'text-green-600',
|
|
51
46
|
};
|
|
52
47
|
// Modal Component
|
|
53
|
-
const EditFocusAreaModal = ({ isOpen, focusArea, onClose, onSave, updateOpportunityFocusArea, GetOpportunityInsightsDocument,
|
|
48
|
+
const EditFocusAreaModal = ({ isOpen, focusArea, onClose, onSave, updateOpportunityFocusArea, GetOpportunityInsightsDocument, selectedOpportunityId, onSaveFocusArea, }) => {
|
|
54
49
|
const [title, setTitle] = (0, react_1.useState)((focusArea === null || focusArea === void 0 ? void 0 : focusArea.title) || '');
|
|
55
50
|
const [description, setDescription] = (0, react_1.useState)((focusArea === null || focusArea === void 0 ? void 0 : focusArea.description) || '');
|
|
56
51
|
react_1.default.useEffect(() => {
|
|
@@ -62,7 +57,7 @@ const EditFocusAreaModal = ({ isOpen, focusArea, onClose, onSave, updateOpportun
|
|
|
62
57
|
try {
|
|
63
58
|
updateOpportunityFocusArea({
|
|
64
59
|
variables: {
|
|
65
|
-
opportunityId:
|
|
60
|
+
opportunityId: selectedOpportunityId,
|
|
66
61
|
input: {
|
|
67
62
|
id: focusArea.id,
|
|
68
63
|
title,
|
|
@@ -70,10 +65,11 @@ const EditFocusAreaModal = ({ isOpen, focusArea, onClose, onSave, updateOpportun
|
|
|
70
65
|
}
|
|
71
66
|
},
|
|
72
67
|
refetchQueries: [
|
|
73
|
-
{ query: GetOpportunityInsightsDocument, variables: { opportunityId } }
|
|
68
|
+
{ query: GetOpportunityInsightsDocument, variables: { opportunityId: selectedOpportunityId } }
|
|
74
69
|
]
|
|
75
70
|
});
|
|
76
71
|
(0, utils_1.showToast)('success', 'Focus area updated successfully');
|
|
72
|
+
onSaveFocusArea();
|
|
77
73
|
}
|
|
78
74
|
catch (error) {
|
|
79
75
|
console.error('Error updating focus area:', error);
|
|
@@ -89,25 +85,26 @@ const EditFocusAreaModal = ({ isOpen, focusArea, onClose, onSave, updateOpportun
|
|
|
89
85
|
};
|
|
90
86
|
if (!isOpen || !focusArea)
|
|
91
87
|
return null;
|
|
92
|
-
return (react_1.default.createElement(
|
|
93
|
-
react_1.default.createElement(
|
|
94
|
-
react_1.default.createElement("div", { className: "
|
|
95
|
-
"
|
|
96
|
-
|
|
97
|
-
react_1.default.createElement(
|
|
98
|
-
|
|
99
|
-
|
|
88
|
+
return (react_1.default.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50" },
|
|
89
|
+
react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-xl w-1/2 mx-4" },
|
|
90
|
+
react_1.default.createElement("div", { className: "px-6 py-4 border-b border-gray-200" },
|
|
91
|
+
react_1.default.createElement("div", { className: "flex items-center justify-between" },
|
|
92
|
+
react_1.default.createElement("h2", { className: "text-lg font-semibold text-gray-900" }, "Edit Focus Area"),
|
|
93
|
+
react_1.default.createElement("button", { onClick: onClose, className: "text-gray-400 hover:text-gray-600 transition-colors" },
|
|
94
|
+
react_1.default.createElement("svg", { className: "w-6 h-6", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" },
|
|
95
|
+
react_1.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }))))),
|
|
96
|
+
react_1.default.createElement("div", { className: "px-6 py-4 space-y-4" },
|
|
100
97
|
react_1.default.createElement("div", null,
|
|
101
98
|
react_1.default.createElement("label", { htmlFor: "title", className: "block text-sm font-medium text-gray-700 mb-2" }, "Title"),
|
|
102
|
-
react_1.default.createElement("
|
|
99
|
+
react_1.default.createElement("input", { id: "title", type: "text", value: title, onChange: (e) => setTitle(e.target.value), className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500", placeholder: "Enter focus area title..." })),
|
|
103
100
|
react_1.default.createElement("div", null,
|
|
104
101
|
react_1.default.createElement("label", { htmlFor: "description", className: "block text-sm font-medium text-gray-700 mb-2" }, "Description"),
|
|
105
102
|
react_1.default.createElement("textarea", { id: "description", value: description, onChange: (e) => setDescription(e.target.value), rows: 4, className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500", placeholder: "Enter focus area description..." }))),
|
|
106
|
-
react_1.default.createElement("div", { className: "px-6 py-4 flex justify-end space-x-3" },
|
|
107
|
-
react_1.default.createElement(
|
|
108
|
-
react_1.default.createElement(
|
|
103
|
+
react_1.default.createElement("div", { className: "px-6 py-4 border-t border-gray-200 flex justify-end space-x-3" },
|
|
104
|
+
react_1.default.createElement("button", { onClick: handleCancel, className: "px-4 py-2 text-sm font-medium text-gray-700 bg-gray-100 border border-gray-300 rounded-md hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-gray-500 transition-colors" }, "Cancel"),
|
|
105
|
+
react_1.default.createElement("button", { onClick: handleSave, className: "px-4 py-2 text-sm font-medium text-white bg-blue bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors" }, "Save")))));
|
|
109
106
|
};
|
|
110
|
-
const FocusAreas = ({ focusAreas,
|
|
107
|
+
const FocusAreas = ({ focusAreas, updateOpportunityFocusArea, GetOpportunityInsightsDocument, selectedOpportunityId, onSaveFocusArea, }) => {
|
|
111
108
|
const [editingFocusArea, setEditingFocusArea] = (0, react_1.useState)(null);
|
|
112
109
|
const [isModalOpen, setIsModalOpen] = (0, react_1.useState)(false);
|
|
113
110
|
const [localFocusAreas, setLocalFocusAreas] = (0, react_1.useState)(focusAreas || []);
|
|
@@ -130,27 +127,34 @@ const FocusAreas = ({ focusAreas, onEditFocusAreas, updateOpportunityFocusArea,
|
|
|
130
127
|
};
|
|
131
128
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
132
129
|
react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200" },
|
|
133
|
-
react_1.default.createElement("div", { className: "
|
|
134
|
-
react_1.default.createElement(
|
|
135
|
-
|
|
130
|
+
react_1.default.createElement("div", { className: "px-6 py-4 border-b border-gray-200" },
|
|
131
|
+
react_1.default.createElement("div", { className: "flex items-center justify-between" },
|
|
132
|
+
react_1.default.createElement("div", null,
|
|
133
|
+
react_1.default.createElement("h2", { className: "text-lg font-semibold text-gray-900 flex items-center" }, "\uD83C\uDFAF Focus Areas"),
|
|
134
|
+
react_1.default.createElement("p", { className: "text-sm text-gray-600 mt-1" }, "Time-sensitive tasks that need attention today/this week")))),
|
|
136
135
|
react_1.default.createElement("div", { className: "p-6" },
|
|
137
136
|
react_1.default.createElement("div", { className: "space-y-4" }, localFocusAreas.map((area, index) => (react_1.default.createElement("div", { key: area.id, className: "flex items-start space-x-4 p-4 border border-gray-200 rounded-lg hover:shadow-sm transition-shadow" },
|
|
137
|
+
react_1.default.createElement("div", { className: "flex-shrink-0 mt-1" },
|
|
138
|
+
react_1.default.createElement("div", { className: `flex items-center justify-center w-8 h-8 rounded-full border ${STATUS_COLORS[area.status]}` },
|
|
139
|
+
react_1.default.createElement("span", { className: "text-sm font-medium" }, index + 1))),
|
|
138
140
|
react_1.default.createElement("div", { className: "flex-1 min-w-0" },
|
|
139
141
|
react_1.default.createElement("div", { className: "flex items-center justify-between mb-1" },
|
|
140
142
|
react_1.default.createElement("div", { className: "flex items-center space-x-2" },
|
|
141
|
-
react_1.default.createElement("
|
|
142
|
-
react_1.default.createElement(
|
|
143
|
-
|
|
143
|
+
react_1.default.createElement("h3", { className: "text-sm font-medium text-gray-900" }, area.title),
|
|
144
|
+
react_1.default.createElement("span", { className: `inline-flex items-center px-2 py-0.5 rounded text-xs font-medium border ${STATUS_COLORS[area.status]}` },
|
|
145
|
+
STATUS_ICONS[area.status],
|
|
146
|
+
" ",
|
|
147
|
+
area.status.replace('_', ' '))),
|
|
148
|
+
react_1.default.createElement("button", { onClick: () => handleEditClick(area), className: "flex items-center space-x-1 px-2 py-1 text-xs font-medium text-gray-600 hover:text-blue-600 hover:bg-blue-50 rounded transition-colors" },
|
|
149
|
+
react_1.default.createElement("span", null, "\u270F\uFE0F"),
|
|
150
|
+
react_1.default.createElement("span", null, "Edit Focus Area"))),
|
|
144
151
|
react_1.default.createElement("p", { className: "text-sm text-gray-600 mb-2" }, area.description),
|
|
145
|
-
react_1.default.createElement("div", { className: "flex items-center
|
|
152
|
+
react_1.default.createElement("div", { className: "flex items-center space-x-4 text-xs text-gray-500" },
|
|
146
153
|
react_1.default.createElement("span", null, (0, date_fns_1.format)(new Date(area.dueDate), 'MMM dd, yyyy')),
|
|
147
|
-
react_1.default.createElement("span",
|
|
148
|
-
react_1.default.createElement("span", { className: `text-${PRIORITY_COLORS[area.priority]}` },
|
|
154
|
+
react_1.default.createElement("span", { className: `font-medium ${PRIORITY_COLORS[area.priority]}` },
|
|
149
155
|
area.priority,
|
|
150
156
|
" Priority"),
|
|
151
|
-
area.status === 'IN_PROGRESS' && (react_1.default.createElement(
|
|
152
|
-
|
|
153
|
-
react_1.default.createElement("span", { className: "text-info" }, "In progress"))))))))))),
|
|
154
|
-
react_1.default.createElement(EditFocusAreaModal, { isOpen: isModalOpen, focusArea: editingFocusArea, onClose: handleCloseModal, onSave: handleSaveFocusArea, updateOpportunityFocusArea: updateOpportunityFocusArea, GetOpportunityInsightsDocument: GetOpportunityInsightsDocument, opportunityId: opportunityId })));
|
|
157
|
+
area.status === 'IN_PROGRESS' && (react_1.default.createElement("span", { className: "text-blue-600" }, "In progress")))))))))),
|
|
158
|
+
react_1.default.createElement(EditFocusAreaModal, { isOpen: isModalOpen, focusArea: editingFocusArea, onClose: handleCloseModal, onSave: handleSaveFocusArea, selectedOpportunityId: selectedOpportunityId, updateOpportunityFocusArea: updateOpportunityFocusArea, GetOpportunityInsightsDocument: GetOpportunityInsightsDocument, onSaveFocusArea: onSaveFocusArea })));
|
|
155
159
|
};
|
|
156
160
|
exports.FocusAreas = FocusAreas;
|
|
@@ -5,8 +5,27 @@ interface KeyMetricsData {
|
|
|
5
5
|
daysSinceGoal: number;
|
|
6
6
|
totalContractLength: number;
|
|
7
7
|
}
|
|
8
|
+
interface CommunicationData {
|
|
9
|
+
channel: string;
|
|
10
|
+
frequency: string;
|
|
11
|
+
formalChannel: string;
|
|
12
|
+
weeklyMeeting: string;
|
|
13
|
+
languages: string[];
|
|
14
|
+
}
|
|
15
|
+
interface BusinessContextData {
|
|
16
|
+
industry: string;
|
|
17
|
+
structure: string;
|
|
18
|
+
challenge: string;
|
|
19
|
+
opportunity: string;
|
|
20
|
+
tags: string[];
|
|
21
|
+
}
|
|
8
22
|
interface KeyMetricsProps {
|
|
9
23
|
metrics: KeyMetricsData;
|
|
24
|
+
communication: CommunicationData;
|
|
25
|
+
businessContext: BusinessContextData;
|
|
26
|
+
updateOpportunityKeyMetrics: any;
|
|
27
|
+
GetOpportunityInsightsDocument: any;
|
|
28
|
+
selectedOpportunityId: string;
|
|
10
29
|
}
|
|
11
30
|
export declare const KeyMetrics: React.FC<KeyMetricsProps>;
|
|
12
31
|
export {};
|
|
@@ -25,11 +25,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.KeyMetrics = void 0;
|
|
27
27
|
const react_1 = __importStar(require("react"));
|
|
28
|
-
const EscalationIssueCard_1 = require("../../Escalations/EscalationIssueCard");
|
|
29
|
-
const base_icons_1 = require("@paro.io/base-icons");
|
|
30
|
-
const TeamSection_1 = require("../TeamSection");
|
|
31
28
|
// Edit Metrics Modal Component
|
|
32
|
-
const EditMetricsModal = ({ isOpen, metrics, onClose, onSave }) => {
|
|
29
|
+
const EditMetricsModal = ({ isOpen, metrics, onClose, onSave, updateOpportunityKeyMetrics, GetOpportunityInsightsDocument, selectedOpportunityId }) => {
|
|
33
30
|
const [formData, setFormData] = (0, react_1.useState)(metrics);
|
|
34
31
|
react_1.default.useEffect(() => {
|
|
35
32
|
setFormData(metrics);
|
|
@@ -73,7 +70,7 @@ const EditMetricsModal = ({ isOpen, metrics, onClose, onSave }) => {
|
|
|
73
70
|
react_1.default.createElement("button", { onClick: handleCancel, className: "px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-500 transition-colors" }, "Cancel"),
|
|
74
71
|
react_1.default.createElement("button", { onClick: handleSave, className: "px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors" }, "Save Changes")))));
|
|
75
72
|
};
|
|
76
|
-
const KeyMetrics = ({ metrics }) => {
|
|
73
|
+
const KeyMetrics = ({ metrics, communication, businessContext }) => {
|
|
77
74
|
const [isModalOpen, setIsModalOpen] = (0, react_1.useState)(false);
|
|
78
75
|
const [localMetrics, setLocalMetrics] = (0, react_1.useState)(metrics);
|
|
79
76
|
react_1.default.useEffect(() => {
|
|
@@ -90,10 +87,11 @@ const KeyMetrics = ({ metrics }) => {
|
|
|
90
87
|
// Here you would typically call an API to update the metrics
|
|
91
88
|
console.log('Saving metrics:', newMetrics);
|
|
92
89
|
};
|
|
93
|
-
return (react_1.default.createElement(
|
|
90
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
94
91
|
react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-6" },
|
|
95
|
-
react_1.default.createElement(
|
|
96
|
-
|
|
92
|
+
react_1.default.createElement("div", { className: "flex items-center justify-between mb-4" },
|
|
93
|
+
react_1.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 flex items-center" }, "\uD83D\uDCCA Engagement Metrics")),
|
|
94
|
+
react_1.default.createElement("div", { className: "grid grid-cols-2 gap-4" },
|
|
97
95
|
react_1.default.createElement("div", { className: "text-center" },
|
|
98
96
|
react_1.default.createElement("div", { className: "text-2xl font-bold text-gray-900" }, localMetrics.targetAchievements),
|
|
99
97
|
react_1.default.createElement("div", { className: "text-sm text-gray-600" }, "Target Hours/Month")),
|
|
@@ -111,38 +109,37 @@ const KeyMetrics = ({ metrics }) => {
|
|
|
111
109
|
react_1.default.createElement("div", { className: "text-2xl font-bold text-gray-900" }, localMetrics.totalContractLength),
|
|
112
110
|
react_1.default.createElement("div", { className: "text-sm text-gray-600" }, "Total Contract Length")))),
|
|
113
111
|
react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-4" },
|
|
114
|
-
react_1.default.createElement(
|
|
115
|
-
react_1.default.createElement("div", { className: "space-y-2 text-sm text-gray-600
|
|
112
|
+
react_1.default.createElement("h4", { className: "text-sm font-medium text-gray-900 mb-3 flex items-center" }, "\uD83D\uDCAC Communication"),
|
|
113
|
+
react_1.default.createElement("div", { className: "space-y-2 text-sm text-gray-600" },
|
|
116
114
|
react_1.default.createElement("div", { className: "flex justify-between" },
|
|
117
115
|
react_1.default.createElement("span", null, "Daily"),
|
|
118
|
-
react_1.default.createElement("span", { className: "font-medium" },
|
|
116
|
+
react_1.default.createElement("span", { className: "font-medium" }, communication.channel)),
|
|
119
117
|
react_1.default.createElement("div", { className: "flex justify-between" },
|
|
120
118
|
react_1.default.createElement("span", null, "Formal"),
|
|
121
|
-
react_1.default.createElement("span", { className: "font-medium" },
|
|
119
|
+
react_1.default.createElement("span", { className: "font-medium" }, communication.formalChannel)),
|
|
122
120
|
react_1.default.createElement("div", { className: "flex justify-between" },
|
|
123
121
|
react_1.default.createElement("span", null, "Weekly"),
|
|
124
|
-
react_1.default.createElement("span", { className: "font-medium" },
|
|
122
|
+
react_1.default.createElement("span", { className: "font-medium" }, communication.weeklyMeeting)),
|
|
125
123
|
react_1.default.createElement("div", { className: "flex justify-between" },
|
|
126
124
|
react_1.default.createElement("span", null, "Languages"),
|
|
127
|
-
react_1.default.createElement("span", { className: "font-medium" },
|
|
125
|
+
react_1.default.createElement("span", { className: "font-medium" }, communication.languages.join(', '))))),
|
|
128
126
|
react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-4" },
|
|
129
|
-
react_1.default.createElement(
|
|
130
|
-
react_1.default.createElement("div", { className: "space-y-2 text-sm text-gray-600
|
|
127
|
+
react_1.default.createElement("h4", { className: "text-sm font-medium text-gray-900 mb-3" }, "\uD83D\uDCCA Business Context"),
|
|
128
|
+
react_1.default.createElement("div", { className: "space-y-2 text-sm text-gray-600" },
|
|
131
129
|
react_1.default.createElement("div", { className: "flex justify-between" },
|
|
132
130
|
react_1.default.createElement("span", null, "Industry:"),
|
|
133
|
-
react_1.default.createElement("span", { className: "font-medium" },
|
|
131
|
+
react_1.default.createElement("span", { className: "font-medium ml-4" }, businessContext.industry)),
|
|
134
132
|
react_1.default.createElement("div", { className: "flex justify-between" },
|
|
135
133
|
react_1.default.createElement("span", null, "Structure:"),
|
|
136
|
-
react_1.default.createElement("span", { className: "font-medium" },
|
|
134
|
+
react_1.default.createElement("span", { className: "font-medium ml-4" }, businessContext.structure)),
|
|
137
135
|
react_1.default.createElement("div", { className: "flex justify-between" },
|
|
138
136
|
react_1.default.createElement("span", null, "Challenge:"),
|
|
139
|
-
react_1.default.createElement("span", { className: "font-medium" },
|
|
137
|
+
react_1.default.createElement("span", { className: "font-medium ml-4" }, businessContext.challenge)),
|
|
140
138
|
react_1.default.createElement("div", { className: "flex justify-between" },
|
|
141
139
|
react_1.default.createElement("span", null, "Opportunity:"),
|
|
142
|
-
react_1.default.createElement("span", { className: "font-medium" },
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
react_1.default.createElement(EditMetricsModal, { isOpen: isModalOpen, metrics: localMetrics, onClose: handleCloseModal, onSave: handleSaveMetrics })));
|
|
140
|
+
react_1.default.createElement("span", { className: "font-medium ml-4" }, businessContext.opportunity)),
|
|
141
|
+
react_1.default.createElement("div", { className: "flex justify-between" },
|
|
142
|
+
react_1.default.createElement("span", null, "Tags:"),
|
|
143
|
+
react_1.default.createElement("div", { className: "flex items-center space-x-2 mt-4" }, businessContext.tags.map((tag) => (react_1.default.createElement("span", { className: "px-2 py-1 bg-blue-100 text-blue-800 text-xs rounded-full" }, tag)))))))));
|
|
147
144
|
};
|
|
148
145
|
exports.KeyMetrics = KeyMetrics;
|