@paro.io/expert-shared-components 1.13.12 → 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
|
@@ -35,10 +35,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
35
35
|
exports.MissingInformation = void 0;
|
|
36
36
|
const react_1 = __importStar(require("react"));
|
|
37
37
|
const utils_1 = require("../../shared/utils");
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
const PRIORITY_COLORS = {
|
|
39
|
+
HIGH: 'bg-red-100 text-red-800 border-red-200',
|
|
40
|
+
MEDIUM: 'bg-orange-100 text-orange-800 border-orange-200',
|
|
41
|
+
LOW: 'bg-gray-100 text-gray-800 border-gray-200',
|
|
42
|
+
REQUESTED: 'bg-green-100 text-green-800 border-green-200',
|
|
43
|
+
CLIENT_RESPONDED: 'bg-green-100 text-green-800 border-green-200',
|
|
44
|
+
};
|
|
45
|
+
const PRIORITY_LABELS = {
|
|
46
|
+
HIGH: 'Required Now',
|
|
47
|
+
MEDIUM: 'Request Info',
|
|
48
|
+
LOW: 'Request Once',
|
|
49
|
+
REQUESTED: 'Requested',
|
|
50
|
+
CLIENT_RESPONDED: 'Client Responded',
|
|
51
|
+
};
|
|
42
52
|
// Category options for the dropdown
|
|
43
53
|
const INFORMATION_CATEGORIES = [
|
|
44
54
|
'Technical Integration Details',
|
|
@@ -116,14 +126,15 @@ const RequestInfoModal = ({ isOpen, missingInfoItem, onClose, onSubmit, document
|
|
|
116
126
|
const isClientResponded = missingInfoItem.status === "CLIENT_RESPONDED";
|
|
117
127
|
const buttonText = isClientResponded ? "Update Request" : "Send Request";
|
|
118
128
|
const hasUploadedDocuments = missingInfoItem.clientResponse && missingInfoItem.clientResponse.includes("Client Uploaded");
|
|
119
|
-
return (react_1.default.createElement(
|
|
120
|
-
react_1.default.createElement(
|
|
121
|
-
react_1.default.createElement("div", { className: "
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
react_1.default.createElement(
|
|
125
|
-
|
|
126
|
-
|
|
129
|
+
return (react_1.default.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50" },
|
|
130
|
+
react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-xl w-full max-w-md mx-4" },
|
|
131
|
+
react_1.default.createElement("div", { className: "px-6 py-4 border-b border-gray-200" },
|
|
132
|
+
react_1.default.createElement("div", { className: "flex items-center justify-between" },
|
|
133
|
+
react_1.default.createElement("h2", { className: "text-lg font-semibold text-gray-900" }, isClientResponded ? "View Client Response" : "Request Additional Information"),
|
|
134
|
+
react_1.default.createElement("button", { onClick: onClose, className: "text-gray-400 hover:text-gray-600 transition-colors" },
|
|
135
|
+
react_1.default.createElement("svg", { className: "w-6 h-6", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" },
|
|
136
|
+
react_1.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }))))),
|
|
137
|
+
react_1.default.createElement("div", { className: "px-6 py-4 space-y-4" },
|
|
127
138
|
isClientResponded && missingInfoItem.clientResponse && (react_1.default.createElement("div", null,
|
|
128
139
|
react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Client Response"),
|
|
129
140
|
react_1.default.createElement("div", { className: "w-full px-3 py-2 border border-gray-300 rounded-md bg-gray-50 text-sm" },
|
|
@@ -132,27 +143,21 @@ const RequestInfoModal = ({ isOpen, missingInfoItem, onClose, onSubmit, document
|
|
|
132
143
|
react_1.default.createElement("button", { onClick: handleOpenDocumentCenter, className: "text-blue-600 hover:text-blue-800 font-medium flex items-center text-sm" },
|
|
133
144
|
react_1.default.createElement("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg" },
|
|
134
145
|
react_1.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" })),
|
|
135
|
-
|
|
146
|
+
"View Documents in Document Center"))))),
|
|
136
147
|
react_1.default.createElement("div", null,
|
|
137
148
|
react_1.default.createElement("label", { htmlFor: "informationCategory", className: "block text-sm font-medium text-gray-700 mb-1" }, "Information Category"),
|
|
138
|
-
react_1.default.createElement(
|
|
139
|
-
react_1.default.createElement(core_1.MenuItem, { disabled: true, value: "" },
|
|
140
|
-
react_1.default.createElement("em", null, `Select a category`)),
|
|
141
|
-
INFORMATION_CATEGORIES.map((category) => (react_1.default.createElement(core_1.MenuItem, { key: category, value: category }, category))))),
|
|
149
|
+
react_1.default.createElement("select", { id: "informationCategory", value: formData.informationCategory, onChange: (e) => setFormData(prev => (Object.assign(Object.assign({}, prev), { informationCategory: 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 text-sm" }, INFORMATION_CATEGORIES.map((category) => (react_1.default.createElement("option", { key: category, value: category }, category))))),
|
|
142
150
|
react_1.default.createElement("div", null,
|
|
143
151
|
react_1.default.createElement("label", { htmlFor: "priorityLevel", className: "block text-sm font-medium text-gray-700 mb-1" }, "Priority Level"),
|
|
144
|
-
react_1.default.createElement(
|
|
145
|
-
react_1.default.createElement(core_1.MenuItem, { disabled: true, value: "" },
|
|
146
|
-
react_1.default.createElement("em", null, `Select priority level`)),
|
|
147
|
-
PRIORITY_LEVELS.map((level) => (react_1.default.createElement(core_1.MenuItem, { key: level, value: level }, level))))),
|
|
152
|
+
react_1.default.createElement("select", { id: "priorityLevel", value: formData.priorityLevel, onChange: (e) => setFormData(prev => (Object.assign(Object.assign({}, prev), { priorityLevel: 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 text-sm" }, PRIORITY_LEVELS.map((level) => (react_1.default.createElement("option", { key: level, value: level }, level))))),
|
|
148
153
|
react_1.default.createElement("div", null,
|
|
149
154
|
react_1.default.createElement("label", { htmlFor: "specificInformation", className: "block text-sm font-medium text-gray-700 mb-1" }, "Specific Information Needed"),
|
|
150
|
-
react_1.default.createElement("textarea", { id: "specificInformation", value: formData.specificInformation, onChange: (e) => setFormData(prev => (Object.assign(Object.assign({}, prev), { specificInformation: 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 text-sm", placeholder: "Need NetSuite configuration details:\
|
|
151
|
-
react_1.default.createElement("div", { className: "px-6 py-4 flex justify-end space-x-3" },
|
|
152
|
-
react_1.default.createElement(
|
|
153
|
-
react_1.default.createElement(
|
|
155
|
+
react_1.default.createElement("textarea", { id: "specificInformation", value: formData.specificInformation, onChange: (e) => setFormData(prev => (Object.assign(Object.assign({}, prev), { specificInformation: 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 text-sm", placeholder: "Need NetSuite configuration details:\n \n 1. US vs Colombian entity setup\n 2. Consolidation process and requirements" }))),
|
|
156
|
+
react_1.default.createElement("div", { className: "px-6 py-4 border-t border-gray-200 flex justify-end space-x-3" },
|
|
157
|
+
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"),
|
|
158
|
+
react_1.default.createElement("button", { onClick: handleSubmit, 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" }, buttonText)))));
|
|
154
159
|
};
|
|
155
|
-
const MissingInformation = ({ items, className = '', opportunityId, GetOpportunityInsightsDocument, updateOpportunityMissingInformation, documentCenterController, isInternal, handleRouteToDocuments, }) => {
|
|
160
|
+
const MissingInformation = ({ items, className = '', opportunityId, GetOpportunityInsightsDocument, updateOpportunityMissingInformation, documentCenterController, isInternal, handleRouteToDocuments, onSaveMissingInformation, }) => {
|
|
156
161
|
const [selectedItem, setSelectedItem] = (0, react_1.useState)(null);
|
|
157
162
|
const [isModalOpen, setIsModalOpen] = (0, react_1.useState)(false);
|
|
158
163
|
const [requestedItems, setRequestedItems] = (0, react_1.useState)({});
|
|
@@ -184,6 +189,7 @@ const MissingInformation = ({ items, className = '', opportunityId, GetOpportuni
|
|
|
184
189
|
]
|
|
185
190
|
});
|
|
186
191
|
(0, utils_1.showToast)('success', 'Information request submitted successfully');
|
|
192
|
+
onSaveMissingInformation && onSaveMissingInformation();
|
|
187
193
|
// Update local state to reflect the change immediately
|
|
188
194
|
setRequestedItems(prev => (Object.assign(Object.assign({}, prev), { [selectedItem.id]: true })));
|
|
189
195
|
console.log('Information request submitted successfully');
|
|
@@ -195,8 +201,9 @@ const MissingInformation = ({ items, className = '', opportunityId, GetOpportuni
|
|
|
195
201
|
});
|
|
196
202
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
197
203
|
react_1.default.createElement("div", { className: `bg-white rounded-lg shadow-sm border border-gray-200 p-6 ${className}` },
|
|
198
|
-
react_1.default.createElement(
|
|
199
|
-
|
|
204
|
+
react_1.default.createElement("div", { className: "flex items-center justify-between mb-4" },
|
|
205
|
+
react_1.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 flex items-center" }, "\u26A0\uFE0F Missing Information")),
|
|
206
|
+
react_1.default.createElement("div", { className: "space-y-4" }, items.map((item) => {
|
|
200
207
|
const isRequested = requestedItems[item.id] || item.status === "EXPERT_REQUESTED";
|
|
201
208
|
const isClientResponded = item.status === "CLIENT_RESPONDED";
|
|
202
209
|
let displayPriority = item.priority;
|
|
@@ -207,11 +214,13 @@ const MissingInformation = ({ items, className = '', opportunityId, GetOpportuni
|
|
|
207
214
|
displayPriority = "CLIENT_RESPONDED";
|
|
208
215
|
}
|
|
209
216
|
return (react_1.default.createElement("div", { key: item.id, className: "border border-gray-200 rounded-lg p-4 hover:shadow-sm transition-shadow" },
|
|
210
|
-
react_1.default.createElement("div", { className: "
|
|
217
|
+
react_1.default.createElement("div", { className: "flex items-start justify-between mb-2" },
|
|
218
|
+
react_1.default.createElement("h4", { className: "text-sm font-medium text-gray-900" }, item.title),
|
|
219
|
+
react_1.default.createElement("span", { className: `inline-flex items-center px-2 py-0.5 rounded text-xs font-medium border ${PRIORITY_COLORS[displayPriority]}` }, PRIORITY_LABELS[displayPriority])),
|
|
211
220
|
react_1.default.createElement("p", { className: "text-sm text-gray-600 mb-2" }, item.description),
|
|
212
221
|
react_1.default.createElement("div", { className: "flex items-center justify-between" },
|
|
213
222
|
react_1.default.createElement("span", { className: "text-xs text-gray-500" }, item.category),
|
|
214
|
-
isClientResponded ? (react_1.default.createElement(
|
|
223
|
+
isClientResponded ? (react_1.default.createElement("button", { onClick: () => handleRequestInfo(item), className: "text-xs text-blue-600 hover:text-blue-800 font-medium transition-colors" }, "Show Response \u2192")) : !isRequested ? (react_1.default.createElement("button", { onClick: () => handleRequestInfo(item), className: "text-xs text-blue-600 hover:text-blue-800 font-medium transition-colors" }, "Request Info \u2192")) : (react_1.default.createElement("span", { className: "text-xs text-green-600 font-medium" }, "Information Requested")))));
|
|
215
224
|
}))),
|
|
216
225
|
react_1.default.createElement(RequestInfoModal, { isOpen: isModalOpen, missingInfoItem: selectedItem, onClose: handleCloseModal, onSubmit: handleSubmitRequest, documentCenterController: documentCenterController, isInternal: isInternal, handleRouteToDocuments: handleRouteToDocuments })));
|
|
217
226
|
};
|
|
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.ProgressTracker = void 0;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
|
-
const base_ui_1 = require("@paro.io/base-ui");
|
|
9
8
|
const PHASE_TABS = [
|
|
10
9
|
{ id: 'discovery', label: 'Discovery', active: true },
|
|
11
10
|
{ id: 'kickoff', label: 'Kickoff', active: false },
|
|
@@ -16,6 +15,8 @@ const PHASE_TABS = [
|
|
|
16
15
|
const ProgressTracker = ({ percentage, currentPhase, nextSteps }) => {
|
|
17
16
|
return (react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 mt-6" },
|
|
18
17
|
react_1.default.createElement("div", { className: "px-6 py-4 border-b border-gray-200" },
|
|
19
|
-
react_1.default.createElement("div", { className: "flex space-x-
|
|
18
|
+
react_1.default.createElement("div", { className: "flex space-x-1" }, PHASE_TABS.map((phase) => (react_1.default.createElement("button", { key: phase.id, disabled: !phase.active, className: `px-4 py-2 text-sm font-medium rounded-md transition-colors ${phase.active
|
|
19
|
+
? 'bg-green-100 text-green-800 border border-green-200 hover:bg-green-200 cursor-pointer'
|
|
20
|
+
: 'text-gray-400 bg-gray-50 border border-gray-200 cursor-not-allowed opacity-60'}` }, phase.label)))))));
|
|
20
21
|
};
|
|
21
22
|
exports.ProgressTracker = ProgressTracker;
|
|
@@ -5,38 +5,38 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.ProjectHealth = void 0;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
|
-
const TeamSection_1 = require("../TeamSection");
|
|
9
|
-
const base_icons_1 = require("@paro.io/base-icons");
|
|
10
|
-
const EscalationIssueCard_1 = require("../../Escalations/EscalationIssueCard");
|
|
11
8
|
const STATUS_COLORS = {
|
|
12
|
-
GOOD:
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
GOOD: 'bg-green-100 text-green-800 border-green-200',
|
|
10
|
+
ATTENTION_NEEDED: 'bg-orange-100 text-orange-800 border-orange-200',
|
|
11
|
+
CRITICAL: 'bg-red-100 text-red-800 border-red-200',
|
|
15
12
|
};
|
|
16
13
|
const STATUS_ICONS = {
|
|
17
|
-
GOOD:
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
GOOD: '✓',
|
|
15
|
+
ATTENTION_NEEDED: '⚠',
|
|
16
|
+
CRITICAL: '✗',
|
|
20
17
|
};
|
|
21
18
|
const HealthIndicator = ({ title, status, description, icon }) => {
|
|
22
19
|
return (react_1.default.createElement("div", { className: "flex items-start space-x-3 p-3 rounded-lg border border-gray-200 hover:shadow-sm transition-shadow" },
|
|
20
|
+
react_1.default.createElement("div", { className: `flex-shrink-0 w-8 h-8 rounded-full border flex items-center justify-center ${STATUS_COLORS[status]}` },
|
|
21
|
+
react_1.default.createElement("span", { className: "text-sm font-medium" }, STATUS_ICONS[status])),
|
|
23
22
|
react_1.default.createElement("div", { className: "flex-1 min-w-0" },
|
|
24
23
|
react_1.default.createElement("div", { className: "flex items-center space-x-2 mb-1" },
|
|
25
24
|
react_1.default.createElement("span", { className: "text-sm" }, icon),
|
|
26
|
-
react_1.default.createElement("
|
|
27
|
-
|
|
28
|
-
react_1.default.createElement("
|
|
25
|
+
react_1.default.createElement("h4", { className: "text-sm font-medium text-gray-900" }, title)),
|
|
26
|
+
react_1.default.createElement("p", { className: "text-sm text-gray-600" }, description),
|
|
27
|
+
react_1.default.createElement("span", { className: `inline-flex items-center px-2 py-0.5 rounded text-xs font-medium mt-2 ${STATUS_COLORS[status]}` }, status === 'GOOD' ? 'On track' : status === 'ATTENTION_NEEDED' ? 'Needs attention' : 'Critical'))));
|
|
29
28
|
};
|
|
30
29
|
const ProjectHealth = ({ healthData, className = '' }) => {
|
|
31
30
|
return (react_1.default.createElement("div", { className: `bg-white rounded-lg shadow-sm border border-gray-200 ${className}` },
|
|
32
|
-
react_1.default.createElement("div", { className: "px-6 py-4 border-b border-gray-200
|
|
33
|
-
react_1.default.createElement(
|
|
31
|
+
react_1.default.createElement("div", { className: "px-6 py-4 border-b border-gray-200" },
|
|
32
|
+
react_1.default.createElement("div", { className: "flex items-center justify-between" },
|
|
33
|
+
react_1.default.createElement("h2", { className: "text-lg font-semibold text-gray-900 flex items-center" }, "\uD83D\uDCCA Project Health")),
|
|
34
34
|
react_1.default.createElement("p", { className: "text-sm text-gray-600 mt-1" }, "Automated insights from client communications and project data")),
|
|
35
35
|
react_1.default.createElement("div", { className: "p-6" },
|
|
36
36
|
react_1.default.createElement("div", { className: "space-y-4" },
|
|
37
|
-
react_1.default.createElement(HealthIndicator, { title: "Communication Flow", status: healthData.communicationFlow.status, description: healthData.communicationFlow.description, icon:
|
|
38
|
-
react_1.default.createElement(HealthIndicator, { title: "Performance Tracking", status: healthData.performanceTracking.status, description: healthData.performanceTracking.description, icon:
|
|
39
|
-
react_1.default.createElement(HealthIndicator, { title: "Process Health", status: healthData.processHealth.status, description: healthData.processHealth.description, icon:
|
|
40
|
-
react_1.default.createElement(HealthIndicator, { title: "Risk Management", status: healthData.riskManagement.status, description: healthData.riskManagement.description, icon:
|
|
37
|
+
react_1.default.createElement(HealthIndicator, { title: "Communication Flow", status: healthData.communicationFlow.status, description: healthData.communicationFlow.description, icon: "\uD83D\uDCAC" }),
|
|
38
|
+
react_1.default.createElement(HealthIndicator, { title: "Performance Tracking", status: healthData.performanceTracking.status, description: healthData.performanceTracking.description, icon: "\uD83D\uDCC8" }),
|
|
39
|
+
react_1.default.createElement(HealthIndicator, { title: "Process Health", status: healthData.processHealth.status, description: healthData.processHealth.description, icon: "\u2699\uFE0F" }),
|
|
40
|
+
react_1.default.createElement(HealthIndicator, { title: "Risk Management", status: healthData.riskManagement.status, description: healthData.riskManagement.description, icon: "\u26A0\uFE0F" })))));
|
|
41
41
|
};
|
|
42
42
|
exports.ProjectHealth = ProjectHealth;
|
|
@@ -5,8 +5,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.TeamSection = exports.Heading = void 0;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
|
-
const
|
|
9
|
-
const
|
|
8
|
+
const Avatar = ({ src, name, size = 'md' }) => {
|
|
9
|
+
const sizeClasses = {
|
|
10
|
+
sm: 'w-8 h-8',
|
|
11
|
+
md: 'w-10 h-10',
|
|
12
|
+
lg: 'w-12 h-12'
|
|
13
|
+
};
|
|
14
|
+
const initials = (name === null || name === void 0 ? void 0 : name.split(' ').map(n => n[0]).join('').toUpperCase()) || '';
|
|
15
|
+
return (react_1.default.createElement("div", { className: `${sizeClasses[size]} rounded-full bg-blue-500 flex items-center justify-center text-white font-medium text-sm` }, src ? (react_1.default.createElement("img", { src: src, alt: name, className: `${sizeClasses[size]} rounded-full object-cover` })) : (react_1.default.createElement("span", null, initials))));
|
|
16
|
+
};
|
|
10
17
|
const Heading = ({ icon, headerText }) => {
|
|
11
18
|
return (react_1.default.createElement("div", { className: "flex flex-row justify-start items-center" },
|
|
12
19
|
icon,
|
|
@@ -16,26 +23,26 @@ exports.Heading = Heading;
|
|
|
16
23
|
const TeamSection = ({ clientTeam, expert, paroTeam }) => {
|
|
17
24
|
return (react_1.default.createElement("div", { className: "space-y-6" },
|
|
18
25
|
react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-6" },
|
|
19
|
-
react_1.default.createElement(
|
|
20
|
-
react_1.default.createElement("div", { className: "space-y-3
|
|
21
|
-
react_1.default.createElement(
|
|
26
|
+
react_1.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 mb-4 flex items-center" }, "\uD83D\uDC65 Client Team"),
|
|
27
|
+
react_1.default.createElement("div", { className: "space-y-3" }, clientTeam === null || clientTeam === void 0 ? void 0 : clientTeam.map((member) => (react_1.default.createElement("div", { key: member.id, className: "flex items-center space-x-3" },
|
|
28
|
+
react_1.default.createElement(Avatar, { src: member.avatar || '', name: member.name }),
|
|
22
29
|
react_1.default.createElement("div", { className: "flex-1 min-w-0" },
|
|
23
|
-
react_1.default.createElement("p", { className: "text-sm font-
|
|
30
|
+
react_1.default.createElement("p", { className: "text-sm font-medium text-gray-900" }, member.name),
|
|
24
31
|
react_1.default.createElement("p", { className: "text-sm text-gray-600" }, member.role),
|
|
25
32
|
member.availability && (react_1.default.createElement("p", { className: "text-xs text-gray-500" }, member.availability)))))))),
|
|
26
33
|
react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-6" },
|
|
27
|
-
react_1.default.createElement(
|
|
28
|
-
react_1.default.createElement("div", { className: "flex items-center space-x-3
|
|
29
|
-
react_1.default.createElement(
|
|
34
|
+
react_1.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 mb-4 flex items-center" }, "\u2B50 Your Expert"),
|
|
35
|
+
react_1.default.createElement("div", { className: "flex items-center space-x-3" },
|
|
36
|
+
react_1.default.createElement(Avatar, { src: expert.avatar, name: expert.name }),
|
|
30
37
|
react_1.default.createElement("div", { className: "flex-1 min-w-0" },
|
|
31
|
-
react_1.default.createElement("p", { className: "text-sm font-
|
|
38
|
+
react_1.default.createElement("p", { className: "text-sm font-medium text-gray-900" }, expert.name),
|
|
32
39
|
react_1.default.createElement("p", { className: "text-sm text-gray-600" }, expert.title)))),
|
|
33
40
|
react_1.default.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-6" },
|
|
34
|
-
react_1.default.createElement(
|
|
35
|
-
react_1.default.createElement("div", { className: "space-y-3
|
|
36
|
-
react_1.default.createElement(
|
|
41
|
+
react_1.default.createElement("h3", { className: "text-lg font-semibold text-gray-900 mb-4 flex items-center" }, "\uD83D\uDD25 Your Paro Team"),
|
|
42
|
+
react_1.default.createElement("div", { className: "space-y-3" }, paroTeam === null || paroTeam === void 0 ? void 0 : paroTeam.map((member) => (react_1.default.createElement("div", { key: member.id || member.name, className: "flex items-center space-x-3" },
|
|
43
|
+
react_1.default.createElement(Avatar, { src: member.avatar || '', name: member.name }),
|
|
37
44
|
react_1.default.createElement("div", { className: "flex-1 min-w-0" },
|
|
38
|
-
react_1.default.createElement("p", { className: "text-sm font-
|
|
45
|
+
react_1.default.createElement("p", { className: "text-sm font-medium text-gray-900" }, member.name),
|
|
39
46
|
react_1.default.createElement("p", { className: "text-sm text-gray-600" }, member.role)))))))));
|
|
40
47
|
};
|
|
41
48
|
exports.TeamSection = TeamSection;
|
|
@@ -12,6 +12,9 @@ interface ProjectIntelligenceProps {
|
|
|
12
12
|
updateOpportunityFocusArea: any;
|
|
13
13
|
isInternal?: boolean;
|
|
14
14
|
handleRouteToDocuments?: () => void;
|
|
15
|
+
updateOpportunityKeyMetrics: any;
|
|
16
|
+
onSaveFocusArea?: any;
|
|
17
|
+
onSaveMissingInformation?: any;
|
|
15
18
|
}
|
|
16
19
|
export declare const ProjectIntelligence: React.FC<ProjectIntelligenceProps>;
|
|
17
20
|
export {};
|
|
@@ -12,8 +12,8 @@ const TeamSection_1 = require("./TeamSection");
|
|
|
12
12
|
const ProjectHealth_1 = require("./ProjectHealth");
|
|
13
13
|
const KeyMetrics_1 = require("./KeyMetrics");
|
|
14
14
|
const MissingInformation_1 = require("./MissingInformation");
|
|
15
|
-
const ProjectIntelligence = ({ checkIfOpportunityInsightsExistData, opportunityInsightsData, selectedOpportunityId, setSelectedOpportunityId, GetOpportunityInsightsDocument, updateOpportunityMissingInformation, documentCenterController = null, updateOpportunityFocusArea, isInternal = false, handleRouteToDocuments, }) => {
|
|
16
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
|
|
15
|
+
const ProjectIntelligence = ({ checkIfOpportunityInsightsExistData, opportunityInsightsData, selectedOpportunityId, setSelectedOpportunityId, GetOpportunityInsightsDocument, updateOpportunityMissingInformation, documentCenterController = null, updateOpportunityFocusArea, isInternal = false, handleRouteToDocuments, updateOpportunityKeyMetrics, onSaveFocusArea, onSaveMissingInformation, }) => {
|
|
16
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10;
|
|
17
17
|
const opportunityInsights = opportunityInsightsData === null || opportunityInsightsData === void 0 ? void 0 : opportunityInsightsData.getOpportunityInsights;
|
|
18
18
|
// Create client tabs from checkIfOpportunityInsightsExistData
|
|
19
19
|
const clientTabs = ((_a = checkIfOpportunityInsightsExistData === null || checkIfOpportunityInsightsExistData === void 0 ? void 0 : checkIfOpportunityInsightsExistData.checkIfOpportunityInsightsExist) === null || _a === void 0 ? void 0 : _a.map((insight) => ({
|
|
@@ -88,18 +88,24 @@ const ProjectIntelligence = ({ checkIfOpportunityInsightsExistData, opportunityI
|
|
|
88
88
|
priority: mapPriority(area === null || area === void 0 ? void 0 : area.priority)
|
|
89
89
|
}));
|
|
90
90
|
};
|
|
91
|
+
const hasNoProjectIntelligence = !(checkIfOpportunityInsightsExistData === null || checkIfOpportunityInsightsExistData === void 0 ? void 0 : checkIfOpportunityInsightsExistData.checkIfOpportunityInsightsExist) ||
|
|
92
|
+
checkIfOpportunityInsightsExistData.checkIfOpportunityInsightsExist.length === 0;
|
|
93
|
+
// If there's no data, show a message
|
|
94
|
+
if (hasNoProjectIntelligence) {
|
|
95
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
96
|
+
react_1.default.createElement("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8" },
|
|
97
|
+
react_1.default.createElement("div", { className: "flex flex-col items-center justify-center h-64 text-center" },
|
|
98
|
+
react_1.default.createElement("i", { className: "fal fa-chart-line text-gray-400 text-6xl mb-4" }),
|
|
99
|
+
react_1.default.createElement("h2", { className: "text-2xl font-bold text-gray-700 mb-2" }, "No project intelligence found"),
|
|
100
|
+
react_1.default.createElement("p", { className: "text-gray-500 max-w-md" }, "No project intelligence found for your won projects. Please check back after you win your next Opportunity!")))));
|
|
101
|
+
}
|
|
91
102
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
92
|
-
react_1.default.createElement("div", { className: "
|
|
93
|
-
react_1.default.createElement("h1", { className: "text-2xl font-bold" }, (opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.opportunityName) || 'Client Engagement Dashboard'),
|
|
94
|
-
react_1.default.createElement("p", { className: "text-gray-600 mt-1" },
|
|
95
|
-
"Engagement dashboard for ",
|
|
96
|
-
(opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.opportunityName) || 'this client')),
|
|
97
|
-
react_1.default.createElement("div", { className: "max-w-[80%] mx-auto px-4 py-8" },
|
|
103
|
+
react_1.default.createElement("div", { className: "mx-auto px-4 py-8" },
|
|
98
104
|
react_1.default.createElement(EngagementHeader_1.EngagementHeader, { clientName: (opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.opportunityName) || '', expertName: ((_b = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.expertInfo) === null || _b === void 0 ? void 0 : _b.name) || '', expertTitle: ((_c = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.expertInfo) === null || _c === void 0 ? void 0 : _c.role) || '', startDate: (opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.startDate) || '', status: (opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.phase) || 'In_Progress', clientTabs: clientTabs, selectedClientId: selectedOpportunityId, onClientChange: handleClientChange }),
|
|
99
105
|
react_1.default.createElement(ProgressTracker_1.ProgressTracker, { percentage: 0, currentPhase: "Kickoff Phase (Day 1 of 3)", nextSteps: "System access & team introductions" }),
|
|
100
106
|
react_1.default.createElement("div", { className: "flex flex-row space-x-4 mt-8" },
|
|
101
107
|
react_1.default.createElement("div", { className: "w-2/3 space-7-4" },
|
|
102
|
-
react_1.default.createElement(FocusAreas_1.FocusAreas, { focusAreas: convertFocusAreas(), onEditFocusAreas: () => { }, updateOpportunityFocusArea: updateOpportunityFocusArea, GetOpportunityInsightsDocument: GetOpportunityInsightsDocument,
|
|
108
|
+
react_1.default.createElement(FocusAreas_1.FocusAreas, { focusAreas: convertFocusAreas(), onEditFocusAreas: () => { }, updateOpportunityFocusArea: updateOpportunityFocusArea, GetOpportunityInsightsDocument: GetOpportunityInsightsDocument, selectedOpportunityId: selectedOpportunityId, onSaveFocusArea: onSaveFocusArea }),
|
|
103
109
|
react_1.default.createElement(ProjectHealth_1.ProjectHealth, { healthData: {
|
|
104
110
|
communicationFlow: {
|
|
105
111
|
status: mapHealthStatus((_e = (_d = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.opportunityHealth) === null || _d === void 0 ? void 0 : _d.communicationFlow) === null || _e === void 0 ? void 0 : _e.status),
|
|
@@ -127,7 +133,7 @@ const ProjectIntelligence = ({ checkIfOpportunityInsightsExistData, opportunityI
|
|
|
127
133
|
category: (item === null || item === void 0 ? void 0 : item.category) || 'N/A',
|
|
128
134
|
status: (item === null || item === void 0 ? void 0 : item.status) || undefined,
|
|
129
135
|
clientResponse: (item === null || item === void 0 ? void 0 : item.clientResponse) || undefined
|
|
130
|
-
})) : [], className: "mt-8", opportunityId: selectedOpportunityId, GetOpportunityInsightsDocument: GetOpportunityInsightsDocument, updateOpportunityMissingInformation: updateOpportunityMissingInformation, documentCenterController: documentCenterController, isInternal: isInternal, handleRouteToDocuments: handleRouteToDocuments })),
|
|
136
|
+
})) : [], className: "mt-8", opportunityId: selectedOpportunityId, GetOpportunityInsightsDocument: GetOpportunityInsightsDocument, updateOpportunityMissingInformation: updateOpportunityMissingInformation, documentCenterController: documentCenterController, isInternal: isInternal, handleRouteToDocuments: handleRouteToDocuments, onSaveMissingInformation: onSaveMissingInformation })),
|
|
131
137
|
react_1.default.createElement("div", { className: "w-1/3 space-y-4" },
|
|
132
138
|
react_1.default.createElement(TeamSection_1.TeamSection, { clientTeam: opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.clientTeam, expert: {
|
|
133
139
|
id: 'expert-1',
|
|
@@ -141,6 +147,18 @@ const ProjectIntelligence = ({ checkIfOpportunityInsightsExistData, opportunityI
|
|
|
141
147
|
daysSinceGoal: ((_z = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.engagementMetrics) === null || _z === void 0 ? void 0 : _z.dayCloseGoal) ?
|
|
142
148
|
parseInt(opportunityInsights.engagementMetrics.dayCloseGoal) : 0,
|
|
143
149
|
totalContractLength: ((_0 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.engagementMetrics) === null || _0 === void 0 ? void 0 : _0.contractLength) || 0
|
|
144
|
-
}
|
|
150
|
+
}, communication: {
|
|
151
|
+
channel: ((_1 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.communication) === null || _1 === void 0 ? void 0 : _1.channel) || 'N/A',
|
|
152
|
+
frequency: ((_2 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.communication) === null || _2 === void 0 ? void 0 : _2.frequency) || 'N/A',
|
|
153
|
+
formalChannel: ((_3 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.communication) === null || _3 === void 0 ? void 0 : _3.formalChannel) || 'N/A',
|
|
154
|
+
weeklyMeeting: ((_4 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.communication) === null || _4 === void 0 ? void 0 : _4.weeklyMeeting) || 'N/A',
|
|
155
|
+
languages: ((_5 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.communication) === null || _5 === void 0 ? void 0 : _5.languages) || []
|
|
156
|
+
}, businessContext: {
|
|
157
|
+
industry: ((_6 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.businessContext) === null || _6 === void 0 ? void 0 : _6.industry) || 'N/A',
|
|
158
|
+
structure: ((_7 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.businessContext) === null || _7 === void 0 ? void 0 : _7.structure) || 'N/A',
|
|
159
|
+
challenge: ((_8 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.businessContext) === null || _8 === void 0 ? void 0 : _8.challenge) || 'N/A',
|
|
160
|
+
opportunity: ((_9 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.businessContext) === null || _9 === void 0 ? void 0 : _9.opportunity) || 'N/A',
|
|
161
|
+
tags: ((_10 = opportunityInsights === null || opportunityInsights === void 0 ? void 0 : opportunityInsights.businessContext) === null || _10 === void 0 ? void 0 : _10.tags) || []
|
|
162
|
+
}, updateOpportunityKeyMetrics: updateOpportunityKeyMetrics, GetOpportunityInsightsDocument: GetOpportunityInsightsDocument, selectedOpportunityId: selectedOpportunityId }))))));
|
|
145
163
|
};
|
|
146
164
|
exports.ProjectIntelligence = ProjectIntelligence;
|
|
@@ -51,12 +51,12 @@ const Pagination = ({ total, currentPage = 1, setCurrentPage, perPageItems = 10,
|
|
|
51
51
|
};
|
|
52
52
|
const numberOfPages = Math.ceil(total / perPageItems);
|
|
53
53
|
return (react_1.default.createElement("div", { className: "bg-white px-4 py-3 border-t border-gray-200 sm:px-6 flex flex-col md:flex-row md:items-center md:justify-between" },
|
|
54
|
-
react_1.default.createElement("div", { className: "pb-2 md:pb-0" }, `Showing
|
|
55
|
-
${perPageItems * (currentPage - 1) + 1}
|
|
56
|
-
to
|
|
57
|
-
${Math.min(total, perPageItems * currentPage)}
|
|
58
|
-
of
|
|
59
|
-
${total}
|
|
54
|
+
react_1.default.createElement("div", { className: "pb-2 md:pb-0" }, `Showing
|
|
55
|
+
${perPageItems * (currentPage - 1) + 1}
|
|
56
|
+
to
|
|
57
|
+
${Math.min(total, perPageItems * currentPage)}
|
|
58
|
+
of
|
|
59
|
+
${total}
|
|
60
60
|
${displayText}`),
|
|
61
61
|
react_1.default.createElement("div", { className: "flex items-center justify-between" },
|
|
62
62
|
react_1.default.createElement("div", { className: "flex-1 flex justify-between sm:hidden" },
|
|
@@ -51,12 +51,12 @@ const isRatingExists = (rating) => {
|
|
|
51
51
|
return false;
|
|
52
52
|
};
|
|
53
53
|
exports.isRatingExists = isRatingExists;
|
|
54
|
-
const StyledButton = (0, styled_components_1.default)(core_2.Button) `
|
|
55
|
-
margin: 0px !important;
|
|
56
|
-
padding: 26px 0 18px 0 !important;
|
|
57
|
-
span {
|
|
58
|
-
color: #248384 !important
|
|
59
|
-
}
|
|
54
|
+
const StyledButton = (0, styled_components_1.default)(core_2.Button) `
|
|
55
|
+
margin: 0px !important;
|
|
56
|
+
padding: 26px 0 18px 0 !important;
|
|
57
|
+
span {
|
|
58
|
+
color: #248384 !important
|
|
59
|
+
}
|
|
60
60
|
`;
|
|
61
61
|
const RatingHeader = ({ ratings, project, index, highlightedRatings, requestStatus, handleRatingRequest, loadingSubmitId, handleAddToProfile, ratingReviewButtonlabel, setOpenClientReviewModal, setShowReviewModelWithRecentlyRatedProjects, enableReviewModal, disableReviewModal, isClientPortal, isInternal, createOrUpdateRating, getParoProjectsDocument, projectIdToShow, }) => {
|
|
62
62
|
var _a, _b, _c, _d;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
{
|
|
2
|
-
"folders": [
|
|
3
|
-
{
|
|
4
|
-
"path": "../../.."
|
|
5
|
-
},
|
|
6
|
-
{
|
|
7
|
-
"path": "../../../../internal-profile-app"
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"path": "../../../../availability-gantt-chart"
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
"path": "../../../../client-portal"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"path": "../../../../expert-portal"
|
|
17
|
-
}
|
|
18
|
-
],
|
|
19
|
-
"settings": {}
|
|
20
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"folders": [
|
|
3
|
+
{
|
|
4
|
+
"path": "../../.."
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
"path": "../../../../internal-profile-app"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"path": "../../../../availability-gantt-chart"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"path": "../../../../client-portal"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"path": "../../../../expert-portal"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"settings": {}
|
|
20
|
+
}
|
|
@@ -34,11 +34,11 @@ const react_hot_toast_1 = __importDefault(require("react-hot-toast"));
|
|
|
34
34
|
const ReviewRequestModal = ({ project, requestModal, setRequestModal, expertName, freelancerId, setRequestStatus, selectedProject, setSelectedProject, clientId, refetchParoProjects, setHighlightedRatings, createOrUpdateRatingRequestMutation, getParoProjectsDocument, }) => {
|
|
35
35
|
var _a;
|
|
36
36
|
const [showError, setShowError] = (0, react_1.useState)(false);
|
|
37
|
-
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},
|
|
38
|
-
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!
|
|
39
|
-
|
|
40
|
-
Thank you in advance for your time and feedback.
|
|
41
|
-
Best regards,
|
|
37
|
+
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},
|
|
38
|
+
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!
|
|
39
|
+
|
|
40
|
+
Thank you in advance for your time and feedback.
|
|
41
|
+
Best regards,
|
|
42
42
|
${expertName}`);
|
|
43
43
|
const handleTextArea = (e) => {
|
|
44
44
|
setTextareaValue(e.target.value);
|
|
@@ -31,20 +31,20 @@ const react_1 = __importStar(require("react"));
|
|
|
31
31
|
const core_1 = require("@material-ui/core");
|
|
32
32
|
const styled_components_1 = __importDefault(require("styled-components"));
|
|
33
33
|
const cdn_1 = require("./constants/cdn");
|
|
34
|
-
const ProfilePhotoPreview = styled_components_1.default.img `
|
|
35
|
-
height: 86px;
|
|
36
|
-
width: 86px;
|
|
37
|
-
border: 4px solid #F8FAFC;
|
|
38
|
-
border-radius: 10px;
|
|
39
|
-
object-fit: cover;
|
|
40
|
-
object-position: top;
|
|
34
|
+
const ProfilePhotoPreview = styled_components_1.default.img `
|
|
35
|
+
height: 86px;
|
|
36
|
+
width: 86px;
|
|
37
|
+
border: 4px solid #F8FAFC;
|
|
38
|
+
border-radius: 10px;
|
|
39
|
+
object-fit: cover;
|
|
40
|
+
object-position: top;
|
|
41
41
|
`;
|
|
42
|
-
const PhotoChangeButton = (0, styled_components_1.default)(core_1.Typography) `
|
|
43
|
-
text-decoration: underline;
|
|
44
|
-
cursor: pointer;
|
|
45
|
-
:active {
|
|
46
|
-
text-decoration: none !important;
|
|
47
|
-
}
|
|
42
|
+
const PhotoChangeButton = (0, styled_components_1.default)(core_1.Typography) `
|
|
43
|
+
text-decoration: underline;
|
|
44
|
+
cursor: pointer;
|
|
45
|
+
:active {
|
|
46
|
+
text-decoration: none !important;
|
|
47
|
+
}
|
|
48
48
|
`;
|
|
49
49
|
exports.defaultAvatar = cdn_1.CDN_URL + 'defaultAvatar.png';
|
|
50
50
|
const Image = ({ imageUrl, getUserDocument, uploadUserPhotoMutation, loadingNewImage, imageUpdateError, legacyFreelancerId, }) => {
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { FieldError } from 'react-hook-form/dist/types/form';
|
|
2
|
-
type SectionContents = {
|
|
3
|
-
defaultValue?: string | number;
|
|
4
|
-
error?: boolean;
|
|
5
|
-
helperText: string | undefined | (FieldError | undefined)[];
|
|
6
|
-
inputRef?: ((instance: any) => void) | null | undefined;
|
|
7
|
-
label?: string;
|
|
8
|
-
multiline?: boolean;
|
|
9
|
-
name?: string;
|
|
10
|
-
placeholder?: string;
|
|
11
|
-
props?: unknown;
|
|
12
|
-
size?: 'small' | 'medium' | undefined;
|
|
13
|
-
onChange?: ((value: any) => void) | undefined;
|
|
14
|
-
width?: boolean;
|
|
15
|
-
InputProps?: any;
|
|
16
|
-
};
|
|
17
|
-
declare const ProfileTextField: ({ defaultValue, error, helperText, inputRef, label, multiline, name, placeholder, props, size, width, onChange, InputProps }: SectionContents) => JSX.Element;
|
|
18
|
-
export default ProfileTextField;
|
|
1
|
+
import { FieldError } from 'react-hook-form/dist/types/form';
|
|
2
|
+
type SectionContents = {
|
|
3
|
+
defaultValue?: string | number;
|
|
4
|
+
error?: boolean;
|
|
5
|
+
helperText: string | undefined | (FieldError | undefined)[];
|
|
6
|
+
inputRef?: ((instance: any) => void) | null | undefined;
|
|
7
|
+
label?: string;
|
|
8
|
+
multiline?: boolean;
|
|
9
|
+
name?: string;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
props?: unknown;
|
|
12
|
+
size?: 'small' | 'medium' | undefined;
|
|
13
|
+
onChange?: ((value: any) => void) | undefined;
|
|
14
|
+
width?: boolean;
|
|
15
|
+
InputProps?: any;
|
|
16
|
+
};
|
|
17
|
+
declare const ProfileTextField: ({ defaultValue, error, helperText, inputRef, label, multiline, name, placeholder, props, size, width, onChange, InputProps }: SectionContents) => JSX.Element;
|
|
18
|
+
export default ProfileTextField;
|
|
@@ -1,16 +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 TextField_1 = __importDefault(require("@material-ui/core/TextField"));
|
|
8
|
-
const ProfileTextField = ({ defaultValue, error, helperText, inputRef, label, multiline = false, name, placeholder, props, size, width = false, onChange, InputProps }) => {
|
|
9
|
-
return (onChange ? react_1.default.createElement(TextField_1.default, Object.assign({ InputProps: InputProps, "x-id": 'TextField' }, props, { defaultValue: defaultValue, error: error, fullWidth: true, helperText: helperText, InputLabelProps: {
|
|
10
|
-
shrink: true
|
|
11
|
-
}, inputRef: inputRef, label: label, margin: 'normal', multiline: multiline, name: name, placeholder: placeholder, size: size, style: Object.assign({ marginTop: '8px' }, (width && { width: '100%' })), variant: 'outlined', onChange: onChange, classes: { root: 'inputCurrency' } })) :
|
|
12
|
-
react_1.default.createElement(TextField_1.default, Object.assign({ InputProps: InputProps, "x-id": 'TextField' }, props, { defaultValue: defaultValue, error: error, fullWidth: true, helperText: helperText, InputLabelProps: {
|
|
13
|
-
shrink: true
|
|
14
|
-
}, inputRef: inputRef, label: label, margin: 'normal', multiline: multiline, name: name, placeholder: placeholder, size: size, style: Object.assign({ marginTop: '8px' }, (width && { width: '100%' })), variant: 'outlined' })));
|
|
15
|
-
};
|
|
16
|
-
exports.default = ProfileTextField;
|
|
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 TextField_1 = __importDefault(require("@material-ui/core/TextField"));
|
|
8
|
+
const ProfileTextField = ({ defaultValue, error, helperText, inputRef, label, multiline = false, name, placeholder, props, size, width = false, onChange, InputProps }) => {
|
|
9
|
+
return (onChange ? react_1.default.createElement(TextField_1.default, Object.assign({ InputProps: InputProps, "x-id": 'TextField' }, props, { defaultValue: defaultValue, error: error, fullWidth: true, helperText: helperText, InputLabelProps: {
|
|
10
|
+
shrink: true
|
|
11
|
+
}, inputRef: inputRef, label: label, margin: 'normal', multiline: multiline, name: name, placeholder: placeholder, size: size, style: Object.assign({ marginTop: '8px' }, (width && { width: '100%' })), variant: 'outlined', onChange: onChange, classes: { root: 'inputCurrency' } })) :
|
|
12
|
+
react_1.default.createElement(TextField_1.default, Object.assign({ InputProps: InputProps, "x-id": 'TextField' }, props, { defaultValue: defaultValue, error: error, fullWidth: true, helperText: helperText, InputLabelProps: {
|
|
13
|
+
shrink: true
|
|
14
|
+
}, inputRef: inputRef, label: label, margin: 'normal', multiline: multiline, name: name, placeholder: placeholder, size: size, style: Object.assign({ marginTop: '8px' }, (width && { width: '100%' })), variant: 'outlined' })));
|
|
15
|
+
};
|
|
16
|
+
exports.default = ProfileTextField;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
declare const StyledActionButtons: ({ closeOnClick, isDisabled, isLoading, handleSubmit }: {
|
|
2
|
-
closeOnClick: () => void;
|
|
3
|
-
isDisabled: boolean;
|
|
4
|
-
isLoading: boolean;
|
|
5
|
-
handleSubmit?: () => void;
|
|
6
|
-
}) => JSX.Element;
|
|
7
|
-
export default StyledActionButtons;
|
|
1
|
+
declare const StyledActionButtons: ({ closeOnClick, isDisabled, isLoading, handleSubmit }: {
|
|
2
|
+
closeOnClick: () => void;
|
|
3
|
+
isDisabled: boolean;
|
|
4
|
+
isLoading: boolean;
|
|
5
|
+
handleSubmit?: () => void;
|
|
6
|
+
}) => JSX.Element;
|
|
7
|
+
export default StyledActionButtons;
|