@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.
Files changed (80) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +2 -2
  3. package/lib/components/ClientReferencesSection/DeleteButton.js +11 -11
  4. package/lib/components/ClientReferencesSection/ParoError.js +10 -10
  5. package/lib/components/ClientReferencesSection/TagsSection.js +2 -2
  6. package/lib/components/ClientReferencesSection/styles/BrandedTypography.js +2 -2
  7. package/lib/components/ClientReferencesSection/styles/Buttons.js +15 -15
  8. package/lib/components/ClientReferencesSection/styles/Name.js +5 -5
  9. package/lib/components/ClientReferencesSection/styles/NullContentConditionalColor.js +4 -4
  10. package/lib/components/ClientReferencesSection/styles/SectionBody.js +11 -11
  11. package/lib/components/ClientReferencesSection/styles/SectionTitle.js +6 -6
  12. package/lib/components/ClientReferencesSection/styles/Tags.js +2 -2
  13. package/lib/components/DiscussionThread/chat.d.ts +22 -22
  14. package/lib/components/DiscussionThread/chat.js +106 -106
  15. package/lib/components/DocumentCenter/DocumentTable.d.ts +15 -15
  16. package/lib/components/DocumentCenter/DocumentTable.js +350 -350
  17. package/lib/components/DocumentCenter/UploadFilesButton.d.ts +6 -6
  18. package/lib/components/DocumentCenter/UploadFilesButton.js +29 -29
  19. package/lib/components/EarningsTracker/ActiveProjectCard.d.ts +52 -52
  20. package/lib/components/EarningsTracker/ActiveProjectCard.js +161 -161
  21. package/lib/components/EarningsTracker/CenterCardUI.d.ts +13 -13
  22. package/lib/components/EarningsTracker/CenterCardUI.js +134 -134
  23. package/lib/components/EarningsTracker/EarningsTracker.d.ts +52 -52
  24. package/lib/components/EarningsTracker/EarningsTracker.js +508 -508
  25. package/lib/components/EarningsTracker/EditDateModal.d.ts +22 -22
  26. package/lib/components/EarningsTracker/EditDateModal.js +149 -149
  27. package/lib/components/EarningsTracker/EmailModal.d.ts +14 -14
  28. package/lib/components/EarningsTracker/EmailModal.js +79 -79
  29. package/lib/components/EarningsTracker/EndProjectModal.d.ts +56 -56
  30. package/lib/components/EarningsTracker/EndProjectModal.js +221 -221
  31. package/lib/components/EarningsTracker/LeftCardUI.d.ts +18 -18
  32. package/lib/components/EarningsTracker/LeftCardUI.js +189 -189
  33. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.d.ts +52 -52
  34. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.js +358 -358
  35. package/lib/components/EarningsTracker/ProgressBar.d.ts +4 -4
  36. package/lib/components/EarningsTracker/ProgressBar.js +66 -66
  37. package/lib/components/EarningsTracker/ReviewRequestModal.d.ts +17 -17
  38. package/lib/components/EarningsTracker/ReviewRequestModal.js +135 -135
  39. package/lib/components/EarningsTracker/RightCardUI.d.ts +46 -46
  40. package/lib/components/EarningsTracker/RightCardUI.js +231 -231
  41. package/lib/components/EarningsTracker/index.d.ts +1 -1
  42. package/lib/components/EarningsTracker/index.js +5 -5
  43. package/lib/components/Escalations/CustomTag.d.ts +3 -3
  44. package/lib/components/Escalations/CustomTag.js +25 -25
  45. package/lib/components/Escalations/ViewReponseModal.d.ts +8 -8
  46. package/lib/components/Escalations/ViewReponseModal.js +27 -27
  47. package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
  48. package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -7
  49. package/lib/components/Invoices/TestDecisionSection.d.ts +1 -1
  50. package/lib/components/Invoices/TestDecisionSection.js +126 -126
  51. package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
  52. package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
  53. package/lib/components/OrganizationChart/PersonCard.js +5 -5
  54. package/lib/components/OrganizationChart/utils.js +79 -79
  55. package/lib/components/ProjectCard/ProgressBar.js +4 -4
  56. package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
  57. package/lib/components/ProjectIntelligence/EngagementHeader/index.js +13 -10
  58. package/lib/components/ProjectIntelligence/FocusAreas/index.d.ts +2 -1
  59. package/lib/components/ProjectIntelligence/FocusAreas/index.js +49 -45
  60. package/lib/components/ProjectIntelligence/KeyMetrics/index.d.ts +19 -0
  61. package/lib/components/ProjectIntelligence/KeyMetrics/index.js +21 -24
  62. package/lib/components/ProjectIntelligence/MissingInformation/index.d.ts +1 -0
  63. package/lib/components/ProjectIntelligence/MissingInformation/index.js +39 -30
  64. package/lib/components/ProjectIntelligence/ProgressTracker/index.js +3 -2
  65. package/lib/components/ProjectIntelligence/ProjectHealth/index.js +18 -18
  66. package/lib/components/ProjectIntelligence/TeamSection/index.js +21 -14
  67. package/lib/components/ProjectIntelligence/index.d.ts +3 -0
  68. package/lib/components/ProjectIntelligence/index.js +29 -11
  69. package/lib/components/Reviews/Pagination.js +6 -6
  70. package/lib/components/ReviewsTab/RatingHeader.js +6 -6
  71. package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
  72. package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
  73. package/lib/components/shared/Image.js +13 -13
  74. package/lib/components/shared/ProfileTextField.d.ts +18 -18
  75. package/lib/components/shared/ProfileTextField.js +16 -16
  76. package/lib/components/shared/StyledActionButtons.d.ts +7 -7
  77. package/lib/components/shared/StyledActionButtons.js +15 -15
  78. package/lib/components/shared/ToastNotification.d.ts +10 -10
  79. package/lib/components/shared/ToastNotification.js +63 -63
  80. 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: 'warning',
13
- Kickoff_Complete: 'success',
14
- In_Progress: 'info',
15
- Completed: 'neutral',
16
- Paused: 'warning',
17
- Cancelled: 'danger',
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(base_ui_1.Button, { key: client.id, label: client.label, onClick: () => onClientChange(client.id), color: "primary" })))),
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(EscalationIssueCard_1.CustomTag, { label: STATUS_LABELS[status] === 'GOOD' ? 'On track' : STATUS_LABELS[status] === 'ATTENTION_NEEDED' ? 'Needs attention' : 'Critical', customColor: `bg-${STATUS_COLORS[status]} border-${STATUS_COLORS[status]}` })))));
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
- opportunityId: string;
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: "success",
37
- IN_PROGRESS: "info",
38
- COMPLETED: "neutral",
39
- AT_RISK: "warning",
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: react_1.default.createElement(base_icons_1.IconCheck, { size: "sm" }),
43
- IN_PROGRESS: react_1.default.createElement(base_icons_1.IconDotsHorizontal, { size: "sm" }),
44
- COMPLETED: react_1.default.createElement(base_icons_1.IconCheck, { size: "sm" }),
45
- AT_RISK: react_1.default.createElement(base_icons_1.IconExclamation, { size: "sm" }),
37
+ CONFIRMED: '✓',
38
+ IN_PROGRESS: '•',
39
+ COMPLETED: '✓',
40
+ AT_RISK: '!',
46
41
  };
47
42
  const PRIORITY_COLORS = {
48
- HIGH: 'danger',
49
- MEDIUM: 'warning',
50
- LOW: 'info',
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, opportunityId, }) => {
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: `0063l00000nqlm2AAA`,
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(core_1.Dialog, { open: isOpen, onClose: onClose, fullWidth: true },
93
- react_1.default.createElement(core_1.DialogTitle, null,
94
- react_1.default.createElement("div", { className: "text-black mb-1 p-2 pl-4 absolute top-0 left-0 w-full flex flex-row justify-between items-center z-50" },
95
- "Edit Focus Area",
96
- react_1.default.createElement(core_1.IconButton, { onClick: onClose },
97
- react_1.default.createElement(base_icons_1.IconX, null)))),
98
- react_1.default.createElement(core_1.DialogContent, null,
99
- react_1.default.createElement("div", { className: "space-y-4 mt-4" },
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("textarea", { id: "title", 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..." })),
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(base_ui_1.Button, { label: "cancel", onClick: handleCancel }),
108
- react_1.default.createElement(base_ui_1.Button, { label: "save", onClick: handleSave, color: "primary" })))));
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, onEditFocusAreas, updateOpportunityFocusArea, GetOpportunityInsightsDocument, opportunityId, }) => {
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: "flex items-center justify-between px-6 py-4 border-b border-gray-200" },
134
- react_1.default.createElement(TeamSection_1.Heading, { icon: react_1.default.createElement(base_icons_1.IconTarget, { size: "sm", className: "mr-4" }), headerText: "Focus Areas" }),
135
- react_1.default.createElement("p", { className: "text-sm text-gray-600 mt-1" }, "Time-sensitive tasks that need attention today/this week")),
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("div", { className: "text-sm font-bold" }, area.title),
142
- react_1.default.createElement(EscalationIssueCard_1.CustomTag, { label: area.status.replace('_', ' '), iconLeft: STATUS_ICONS[area.status], customColor: `bg-${STATUS_COLORS[area.status]} border-${STATUS_COLORS[area.status]}` })),
143
- react_1.default.createElement(base_ui_1.Button, { label: "Edit focus area", iconLeft: react_1.default.createElement(base_icons_1.IconPencil, { size: "sm" }), onClick: () => handleEditClick(area), color: "success", size: 'sm' })),
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 text-sm font-medium space-x-2" },
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", null, "\u2022"),
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(react_1.default.Fragment, null,
152
- react_1.default.createElement("span", null, "\u2022"),
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("div", { className: "flex flex-col space-y-4" },
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(TeamSection_1.Heading, { icon: react_1.default.createElement(base_icons_1.IconViewGrid, { size: "sm", className: "mr-4" }), headerText: "Engagement Metrics" }),
96
- react_1.default.createElement("div", { className: "grid grid-cols-2 gap-4 mt-2" },
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(TeamSection_1.Heading, { icon: react_1.default.createElement(base_icons_1.IconChat, { size: "sm", className: "mr-4" }), headerText: "Communication" }),
115
- react_1.default.createElement("div", { className: "space-y-2 text-sm text-gray-600 mt-2" },
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" }, "Microsoft Teams")),
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" }, "Email")),
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" }, "Mondays 11 AM EST")),
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" }, "English & Spanish")))),
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(TeamSection_1.Heading, { icon: react_1.default.createElement(base_icons_1.IconChartBar, { size: "sm", className: "mr-4" }), headerText: "Business Context" }),
130
- react_1.default.createElement("div", { className: "space-y-2 text-sm text-gray-600 mt-2" },
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" }, "NetSuite software development")),
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" }, "US clients, Colombian delivery team")),
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" }, "Manual consolidation processes")),
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" }, "NetSuite automation & efficiency"))),
143
- react_1.default.createElement("div", { className: "flex items-center space-x-2 mt-4" },
144
- react_1.default.createElement(EscalationIssueCard_1.CustomTag, { label: "NetSuite", customColor: `bg-info border-info` }),
145
- react_1.default.createElement(EscalationIssueCard_1.CustomTag, { label: "Bilingual Team", customColor: `bg-success border-success` }))),
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;
@@ -19,6 +19,7 @@ interface MissingInformationProps {
19
19
  } | null;
20
20
  isInternal: boolean;
21
21
  handleRouteToDocuments?: () => void;
22
+ onSaveMissingInformation?: any;
22
23
  }
23
24
  export declare const MissingInformation: React.FC<MissingInformationProps>;
24
25
  export {};