@paro.io/expert-shared-components 1.12.36 → 1.12.38

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 (90) 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/AccountSuspensionBanner.d.ts +5 -0
  44. package/lib/components/Escalations/AccountSuspensionBanner.js +37 -0
  45. package/lib/components/Escalations/AccountSuspensionModal.d.ts +5 -0
  46. package/lib/components/Escalations/AccountSuspensionModal.js +112 -0
  47. package/lib/components/Escalations/CustomTag.d.ts +3 -0
  48. package/lib/components/Escalations/CustomTag.js +25 -0
  49. package/lib/components/Escalations/EscalationChat.d.ts +6 -0
  50. package/lib/components/Escalations/EscalationChat.js +90 -0
  51. package/lib/components/Escalations/EscalationIssueCard.d.ts +15 -0
  52. package/lib/components/Escalations/EscalationIssueCard.js +72 -0
  53. package/lib/components/Escalations/EscalationReportBanner.d.ts +4 -0
  54. package/lib/components/Escalations/EscalationReportBanner.js +20 -0
  55. package/lib/components/Escalations/EscalationRespondForm.d.ts +6 -0
  56. package/lib/components/Escalations/EscalationRespondForm.js +111 -0
  57. package/lib/components/Escalations/EscalationSubmitForm.d.ts +9 -0
  58. package/lib/components/Escalations/EscalationSubmitForm.js +217 -0
  59. package/lib/components/Escalations/EscalationTabs.d.ts +9 -0
  60. package/lib/components/Escalations/EscalationTabs.js +30 -0
  61. package/lib/components/Escalations/EscalationTabsContent.d.ts +17 -0
  62. package/lib/components/Escalations/EscalationTabsContent.js +92 -0
  63. package/lib/components/Escalations/Escalations.d.ts +10 -0
  64. package/lib/components/Escalations/Escalations.js +146 -0
  65. package/lib/components/Escalations/index.d.ts +1 -0
  66. package/lib/components/Escalations/index.js +5 -0
  67. package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
  68. package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -7
  69. package/lib/components/Invoices/TestDecisionSection.d.ts +1 -1
  70. package/lib/components/Invoices/TestDecisionSection.js +126 -126
  71. package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
  72. package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
  73. package/lib/components/OrganizationChart/PersonCard.js +5 -5
  74. package/lib/components/OrganizationChart/utils.js +79 -79
  75. package/lib/components/ProjectCard/ProgressBar.js +4 -4
  76. package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
  77. package/lib/components/Reviews/Pagination.js +6 -6
  78. package/lib/components/ReviewsTab/RatingHeader.js +6 -6
  79. package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
  80. package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
  81. package/lib/components/shared/Image.js +13 -13
  82. package/lib/components/shared/ProfileTextField.d.ts +18 -18
  83. package/lib/components/shared/ProfileTextField.js +16 -16
  84. package/lib/components/shared/StyledActionButtons.d.ts +7 -7
  85. package/lib/components/shared/StyledActionButtons.js +15 -15
  86. package/lib/components/shared/ToastNotification.d.ts +10 -10
  87. package/lib/components/shared/ToastNotification.js +63 -63
  88. package/lib/index.d.ts +1 -0
  89. package/lib/index.js +3 -1
  90. package/package.json +61 -61
@@ -0,0 +1,112 @@
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 base_icons_1 = require("@paro.io/base-icons");
8
+ const core_1 = require("@material-ui/core");
9
+ const AccountSuspensionModal = ({ showSuspensionModal, onClose }) => {
10
+ return (react_1.default.createElement(core_1.Dialog, { open: showSuspensionModal, onClose: onClose, "aria-labelledby": "responsive-dialog-title", maxWidth: "sm", scroll: "paper" },
11
+ react_1.default.createElement("div", { className: "bg-[#0F172A] text-white mb-1 p-1 pl-4 absolute top-0 left-0 w-full flex flex-row justify-between items-center z-50" },
12
+ react_1.default.createElement("b", null, "Automated Suspension Process"),
13
+ react_1.default.createElement(core_1.IconButton, { onClick: () => onClose() },
14
+ react_1.default.createElement(base_icons_1.IconX, { className: "text-white" }))),
15
+ react_1.default.createElement("div", { className: "bg-white rounded-lg mt-14 max-h-[90vh] overflow-y-auto" },
16
+ react_1.default.createElement("div", { className: "p-6" },
17
+ react_1.default.createElement("div", { className: "mb-6" },
18
+ react_1.default.createElement("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4" },
19
+ react_1.default.createElement("div", { className: "flex items-start" },
20
+ react_1.default.createElement(base_icons_1.IconBriefcase, { className: "h-5 w-5 text-red-500 mt-0.5 mr-2 flex-shrink-0" }),
21
+ react_1.default.createElement("div", null,
22
+ react_1.default.createElement("p", { className: "font-medium text-red-800" }, "Critical Information"),
23
+ react_1.default.createElement("p", { className: "text-sm text-red-700 mt-1" }, "Escalations require timely attention to maintain client relationships and project success. Multiple unresolved issues may result in account warnings and potential suspension."))))),
24
+ react_1.default.createElement("div", { className: "space-y-6" },
25
+ react_1.default.createElement("div", { className: "relative" },
26
+ react_1.default.createElement("div", { className: "absolute left-4 top-8 bottom-0 w-0.5 bg-gray-200" }),
27
+ react_1.default.createElement("div", { className: "flex items-start" },
28
+ react_1.default.createElement("div", { className: "bg-green-500 rounded-full p-2 mr-4 relative z-10" },
29
+ react_1.default.createElement(base_icons_1.IconCheckCircle, { className: "h-5 w-5 text-white" })),
30
+ react_1.default.createElement("div", { className: "flex-1 pb-8" },
31
+ react_1.default.createElement("div", { className: "flex justify-between items-start mb-2" },
32
+ react_1.default.createElement("h4", { className: "font-semibold text-green-800" }, "Level 1: Light Issues"),
33
+ react_1.default.createElement("div", { className: "text-xs bg-green-100 text-green-700 px-2 py-1 rounded-full" }, "Coaching Only")),
34
+ react_1.default.createElement("p", { className: "text-sm text-gray-600 mb-2" }, "Email coaching and guidance. No account restrictions."),
35
+ react_1.default.createElement("div", { className: "text-xs text-gray-500" },
36
+ react_1.default.createElement("strong", null, "Examples:"),
37
+ " Forgot to log time, personal emergency, availability changes, minor communication delays"))),
38
+ react_1.default.createElement("div", { className: "flex items-start" },
39
+ react_1.default.createElement("div", { className: "bg-orange-500 rounded-full p-2 mr-4 relative z-10" },
40
+ react_1.default.createElement(base_icons_1.IconExclamationCircle, { className: "h-5 w-5 text-white" })),
41
+ react_1.default.createElement("div", { className: "flex-1 pb-8" },
42
+ react_1.default.createElement("div", { className: "flex justify-between items-start mb-2" },
43
+ react_1.default.createElement("h4", { className: "font-semibold text-orange-800" }, "Level 2: Medium Severity"),
44
+ react_1.default.createElement("div", { className: "text-xs bg-orange-100 text-orange-700 px-2 py-1 rounded-full" }, "3 Warnings System")),
45
+ react_1.default.createElement("p", { className: "text-sm text-gray-600 mb-2" },
46
+ react_1.default.createElement("span", { className: "font-medium text-orange-800" }, "After 3 warnings: 30-day suspension"),
47
+ " + mandatory retraining before reinstatement"),
48
+ react_1.default.createElement("div", { className: "text-xs text-gray-500" },
49
+ react_1.default.createElement("strong", null, "Examples:"),
50
+ " Poor client communication, missed project deadlines, quality concerns, repeated light violations"))),
51
+ react_1.default.createElement("div", { className: "flex items-start" },
52
+ react_1.default.createElement("div", { className: "bg-red-500 rounded-full p-2 mr-4 relative z-10" },
53
+ react_1.default.createElement(base_icons_1.IconExclamation, { className: "h-5 w-5 text-white" })),
54
+ react_1.default.createElement("div", { className: "flex-1 pb-8" },
55
+ react_1.default.createElement("div", { className: "flex justify-between items-start mb-2" },
56
+ react_1.default.createElement("h4", { className: "font-semibold text-red-800" }, "Level 3: High Severity"),
57
+ react_1.default.createElement("div", { className: "text-xs bg-red-100 text-red-700 px-2 py-1 rounded-full" }, "2 Warnings System")),
58
+ react_1.default.createElement("p", { className: "text-sm text-gray-600 mb-2" },
59
+ react_1.default.createElement("span", { className: "font-medium text-red-800" }, "After 2 warnings: 60-day suspension"),
60
+ " + comprehensive retraining required"),
61
+ react_1.default.createElement("div", { className: "text-xs text-gray-500" },
62
+ react_1.default.createElement("strong", null, "Examples:"),
63
+ " Significant project failures, client relationship damage, contract violations, repeated medium violations"))),
64
+ react_1.default.createElement("div", { className: "flex items-start" },
65
+ react_1.default.createElement("div", { className: "bg-black rounded-full p-2 mr-4 relative z-10" },
66
+ react_1.default.createElement(base_icons_1.IconX, { className: "h-5 w-5 text-white" })),
67
+ react_1.default.createElement("div", { className: "flex-1" },
68
+ react_1.default.createElement("div", { className: "flex justify-between items-start mb-2" },
69
+ react_1.default.createElement("h4", { className: "font-semibold text-gray-900" }, "Level 4: Critical Severity"),
70
+ react_1.default.createElement("div", { className: "text-xs bg-gray-800 text-white px-2 py-1 rounded-full" }, "One Time Offense")),
71
+ react_1.default.createElement("p", { className: "text-sm text-gray-600 mb-2" },
72
+ react_1.default.createElement("span", { className: "font-medium text-gray-900" }, "Immediate permanent suspension and account removal")),
73
+ react_1.default.createElement("div", { className: "text-xs text-gray-500" },
74
+ react_1.default.createElement("strong", null, "Examples:"),
75
+ " Project abandonment, terms of service violations, non-circumvention breaches, fraudulent activity, severe misconduct"))))),
76
+ react_1.default.createElement("div", { className: "mt-6 bg-blue-50 rounded-lg p-4" },
77
+ react_1.default.createElement("h4", { className: "font-medium text-blue-900 mb-2" }, "Progressive Warning System"),
78
+ react_1.default.createElement("div", { className: "space-y-3" },
79
+ react_1.default.createElement("div", { className: "flex items-center text-sm" },
80
+ react_1.default.createElement("div", { className: "w-3 h-3 bg-yellow-400 rounded-full mr-3" }),
81
+ react_1.default.createElement("span", null,
82
+ react_1.default.createElement("strong", null, "Medium (3 warnings):"),
83
+ " Expert coaching and performance improvement plan")),
84
+ react_1.default.createElement("div", { className: "flex items-center text-sm" },
85
+ react_1.default.createElement("div", { className: "w-3 h-3 bg-orange-500 rounded-full mr-3" }),
86
+ react_1.default.createElement("span", null,
87
+ react_1.default.createElement("strong", null, "High (2 warnings):"),
88
+ " Escalated coaching with enhanced monitoring")),
89
+ react_1.default.createElement("div", { className: "flex items-center text-sm" },
90
+ react_1.default.createElement("div", { className: "w-3 h-3 bg-red-500 rounded-full mr-3" }),
91
+ react_1.default.createElement("span", null,
92
+ react_1.default.createElement("strong", null, "Final warning:"),
93
+ " Automatic suspension with mandatory training")),
94
+ react_1.default.createElement("div", { className: "flex items-center text-sm" },
95
+ react_1.default.createElement("div", { className: "w-3 h-3 bg-black rounded-full mr-3" }),
96
+ react_1.default.createElement("span", null,
97
+ react_1.default.createElement("strong", null, "Critical offense:"),
98
+ " Immediate permanent account removal")),
99
+ react_1.default.createElement("div", { className: "flex items-center text-sm" },
100
+ react_1.default.createElement("div", { className: "w-3 h-3 bg-gray-400 rounded-full mr-3" }),
101
+ react_1.default.createElement("span", null,
102
+ react_1.default.createElement("strong", null, "Reset:"),
103
+ " Warnings reset after 6 months of good standing")))),
104
+ react_1.default.createElement("div", { className: "mt-6 bg-gray-50 rounded-lg p-4" },
105
+ react_1.default.createElement("h4", { className: "font-medium text-gray-900 mb-2" }, "Important Reminders"),
106
+ react_1.default.createElement("ul", { className: "text-sm text-gray-600 space-y-1" },
107
+ react_1.default.createElement("li", null, "\u2022 All escalations are tracked and contribute to your warning count"),
108
+ react_1.default.createElement("li", null, "\u2022 Training completion is required before suspension can be lifted"),
109
+ react_1.default.createElement("li", null, "\u2022 Warnings are cumulative across all severity levels"),
110
+ react_1.default.createElement("li", null, "\u2022 All actions are logged and affect your expert rating")))))));
111
+ };
112
+ exports.default = AccountSuspensionModal;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const CustomTag: (label: any) => React.JSX.Element;
3
+ export default CustomTag;
@@ -0,0 +1,25 @@
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 getBackgroundColor = (type) => {
8
+ switch (type) {
9
+ case 'Critical':
10
+ return 'danger';
11
+ case 'High':
12
+ return 'warning';
13
+ case 'Medium':
14
+ return 'info';
15
+ case 'Low':
16
+ return 'default';
17
+ default:
18
+ return 'default';
19
+ }
20
+ };
21
+ const CustomTag = (label) => {
22
+ const color = getBackgroundColor(label);
23
+ return (react_1.default.createElement("div", { className: `border box-border text-center px-4 pb-0.5 pt-1 text-sm inline-block break-words text-white cursor-pointer rounded-full bg-${color} border-${color}` }, label));
24
+ };
25
+ exports.default = CustomTag;
@@ -0,0 +1,6 @@
1
+ declare const EscalationChat: ({ activeChatIssue, showEscalationChat, setShowEscalationChat }: {
2
+ activeChatIssue: any;
3
+ showEscalationChat: boolean;
4
+ setShowEscalationChat: (showEscalationChat: boolean) => void;
5
+ }) => JSX.Element;
6
+ export default EscalationChat;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ const react_1 = __importStar(require("react"));
36
+ const base_icons_1 = require("@paro.io/base-icons");
37
+ const base_ui_1 = require("@paro.io/base-ui");
38
+ const core_1 = require("@material-ui/core");
39
+ const DiscussionSection_1 = require("../Invoices/DiscussionSection");
40
+ const EscalationIssueCard_1 = require("./EscalationIssueCard");
41
+ const EscalationChat = ({ activeChatIssue, showEscalationChat, setShowEscalationChat }) => {
42
+ const [uploadFiles, setUploadFiles] = (0, react_1.useState)([]);
43
+ const [uploadingFile, setUploadingFile] = (0, react_1.useState)(false);
44
+ const fileInputRef = (0, react_1.useRef)(null);
45
+ const handleFileUpload = (event) => {
46
+ const files = Array.from(event.target.files);
47
+ setUploadFiles(prev => [...prev, ...files]);
48
+ };
49
+ const removeFile = (index) => {
50
+ setUploadFiles(prev => prev.filter((_, i) => i !== index));
51
+ };
52
+ return (react_1.default.createElement(core_1.Dialog, { open: showEscalationChat, onClose: () => setShowEscalationChat(false), maxWidth: 'sm' },
53
+ react_1.default.createElement(core_1.DialogTitle, null,
54
+ react_1.default.createElement("div", { className: "bg-[#B1BDD1] text-black mb-1 p-2 pl-4 absolute top-0 left-0 w-full flex flex-row justify-between items-center z-50" },
55
+ react_1.default.createElement("div", { className: "flex flex-col items-start" },
56
+ react_1.default.createElement("div", { className: "flex flex-row items-center" },
57
+ react_1.default.createElement("h1", { className: "text-md font-bold mr-2" },
58
+ "Escalation Chat #",
59
+ activeChatIssue.caseId),
60
+ react_1.default.createElement(EscalationIssueCard_1.CustomTag, { label: activeChatIssue.status })),
61
+ react_1.default.createElement("p", { className: "text-xs" },
62
+ activeChatIssue.title,
63
+ " - ",
64
+ activeChatIssue.project)),
65
+ react_1.default.createElement("div", { className: "flex items-center space-x-4" },
66
+ react_1.default.createElement(core_1.IconButton, { onClick: () => setShowEscalationChat(false) },
67
+ react_1.default.createElement(base_icons_1.IconX, null))))),
68
+ react_1.default.createElement(core_1.DialogContent, null,
69
+ react_1.default.createElement("div", { className: "bg-white rounded-lg w-full overflow-hidden flex flex-col p-2 mt-12" },
70
+ react_1.default.createElement(DiscussionSection_1.DiscussionSection //update required
71
+ , { disputeId: '1', currentUser: {}, messages: [], onCreateMessage: (variables) => __awaiter(void 0, void 0, void 0, function* () {
72
+ return Promise.resolve();
73
+ }), isInternal: false }),
74
+ react_1.default.createElement("div", { className: "bg-white mt-2" },
75
+ react_1.default.createElement("div", { className: "space-y-3" },
76
+ react_1.default.createElement("div", { className: "flex items-center justify-between" },
77
+ react_1.default.createElement("div", { className: "flex items-center space-x-2" },
78
+ react_1.default.createElement("input", { id: "upload-file", type: "file", multiple: true, accept: ".pdf,.doc,.docx,.jpeg,.png,.gif,.csv", style: { display: 'none' }, ref: fileInputRef, onChange: handleFileUpload }),
79
+ react_1.default.createElement(base_ui_1.Button, { label: "Attach Files", iconLeft: react_1.default.createElement(base_icons_1.IconPlus, { size: "sm" }), onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, color: "info", className: "mx-2", isLoading: uploadingFile }),
80
+ uploadFiles.length > 0 && (react_1.default.createElement("div", { className: "text-sm text-gray-600" },
81
+ uploadFiles.length,
82
+ " file(s) selected"))),
83
+ react_1.default.createElement("div", { className: "flex space-x-2" },
84
+ react_1.default.createElement(base_ui_1.Button, { label: "cancel", onClick: () => setShowEscalationChat(false) }))),
85
+ uploadFiles.length > 0 && (react_1.default.createElement("div", { className: "space-y-1" }, uploadFiles.map((file, index) => (react_1.default.createElement("div", { key: index, className: "flex items-center justify-between bg-gray-50 px-2 py-1 rounded text-sm" },
86
+ react_1.default.createElement("span", null, file.name),
87
+ react_1.default.createElement(core_1.IconButton, { onClick: () => removeFile(index) },
88
+ react_1.default.createElement(base_icons_1.IconX, { size: "sm" })))))))))))));
89
+ };
90
+ exports.default = EscalationChat;
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { EscalationChatDetails } from "./EscalationTabsContent";
3
+ export declare const CustomTag: ({ label }: {
4
+ label: any;
5
+ }) => React.JSX.Element;
6
+ type EscalationIssueCardProps = {
7
+ issues: any[];
8
+ isExpert: boolean;
9
+ openEscalationChat: (details: EscalationChatDetails) => void;
10
+ showRespondButton?: boolean;
11
+ setSelectedIssueId?: (id: number) => void;
12
+ showMarkResolvedButton?: boolean;
13
+ };
14
+ declare const EscalationIssueCard: React.FC<EscalationIssueCardProps>;
15
+ export default EscalationIssueCard;
@@ -0,0 +1,72 @@
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
+ exports.CustomTag = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const base_ui_1 = require("@paro.io/base-ui");
9
+ const getBackgroundColor = (type) => {
10
+ switch (type) {
11
+ case 'Critical':
12
+ return 'danger';
13
+ case 'High':
14
+ return 'warning';
15
+ case 'Medium':
16
+ return 'info';
17
+ case 'Low':
18
+ return 'default';
19
+ default:
20
+ return 'default';
21
+ }
22
+ };
23
+ const CustomTag = ({ label }) => {
24
+ const color = getBackgroundColor(label);
25
+ return (react_1.default.createElement("div", { className: `border box-border text-center px-4 pb-0.5 pt-1 text-sm inline-block break-words ${color === 'default' ? 'text-black' : 'text-white'} rounded-full bg-${color} border-${color} ml-2` }, label.toUpperCase()));
26
+ };
27
+ exports.CustomTag = CustomTag;
28
+ const EscalationIssueCard = ({ issues, isExpert, openEscalationChat, showRespondButton = false, setSelectedIssueId, showMarkResolvedButton = false, }) => {
29
+ if (!issues.length)
30
+ return react_1.default.createElement("div", null, "No issues.");
31
+ return (react_1.default.createElement("div", { className: "space-y-4" }, issues.map((issue) => {
32
+ const project = issue.projectName && Array.isArray(issue.projectName) && issue.projectName.length > 0
33
+ ? `${issue.projectName[0]}${issue.projectName.length > 1 ? ` +${issue.projectName.length - 1} more` : ''} `
34
+ : '';
35
+ const docs = [...issue.expertSupportingDocuments, ...issue.clientSupportingDocuments];
36
+ return (react_1.default.createElement("div", { key: issue.id, className: "border border-gray-200 rounded-lg bg-white p-4" },
37
+ react_1.default.createElement("div", { className: "flex items-center justify-between mb-3" },
38
+ react_1.default.createElement("div", { className: "flex-1 ml-2" },
39
+ react_1.default.createElement("div", { className: "font-bold" }, issue.problem),
40
+ react_1.default.createElement("div", { className: "text-xs text-gray-500 font-bold" },
41
+ project,
42
+ " \u2022 Case #",
43
+ issue.id)),
44
+ react_1.default.createElement("div", { className: "flex flex-row gap-2" },
45
+ react_1.default.createElement(exports.CustomTag, { label: issue.severityLevel }),
46
+ react_1.default.createElement(exports.CustomTag, { label: issue.issueType }))),
47
+ react_1.default.createElement("div", { className: "bg-gray-50 rounded-md p-3 mb-4 border" },
48
+ react_1.default.createElement("div", { className: "flex items-center justify-between mb-2" }, issue.updateLabel ? (react_1.default.createElement("div", { className: "text-sm text-gray-500" },
49
+ "Updated By: ",
50
+ react_1.default.createElement("span", { className: "font-bold" }, issue.updateLabel),
51
+ " \u2022 Updated on: ",
52
+ react_1.default.createElement("span", { className: "font-bold" }, issue.updateTime))) : (react_1.default.createElement("div", { className: "text-sm text-gray-500" },
53
+ "Submitted by: ",
54
+ react_1.default.createElement("span", { className: "font-bold" }, issue.submittedBy),
55
+ " \u2022 Submitted on: ",
56
+ react_1.default.createElement("span", { className: "font-bold" }, issue.createdAt)))),
57
+ react_1.default.createElement("div", { className: "text-sm text-gray-600 mb-3" }, issue.expectedOutcome)),
58
+ docs && docs.length > 0 && (react_1.default.createElement("div", { className: "flex flex-wrap gap-2 m-1 mb-3" },
59
+ react_1.default.createElement("span", { className: "font-bold" }, "Supporting Documents: "),
60
+ docs.map((d, idx) => (react_1.default.createElement(exports.CustomTag, { key: idx, label: d }))))),
61
+ react_1.default.createElement("div", { className: "flex flex-wrap gap-2" },
62
+ react_1.default.createElement(base_ui_1.Button, { onClick: () => openEscalationChat({
63
+ title: issue.problem,
64
+ project: issue.projectName,
65
+ id: issue.id,
66
+ status: issue.status
67
+ }), label: "Chat", color: "primary" }),
68
+ showRespondButton && setSelectedIssueId && (react_1.default.createElement(base_ui_1.Button, { label: "Respond to Escalation", onClick: () => setSelectedIssueId(issue.id), color: 'primary' })),
69
+ showMarkResolvedButton && !isExpert && (react_1.default.createElement(base_ui_1.Button, { onClick: issue.markResolved, label: "Mark as Resolved", color: "primary" })))));
70
+ })));
71
+ };
72
+ exports.default = EscalationIssueCard;
@@ -0,0 +1,4 @@
1
+ declare const EscalationReportBanner: ({ onReport }: {
2
+ onReport: () => void;
3
+ }) => JSX.Element;
4
+ export default EscalationReportBanner;
@@ -0,0 +1,20 @@
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 base_icons_1 = require("@paro.io/base-icons");
8
+ const base_ui_1 = require("@paro.io/base-ui");
9
+ const EscalationReportBanner = ({ onReport }) => {
10
+ return (react_1.default.createElement("div", { className: "bg-[#EF5360] rounded-lg p-2 mb-4 shadow-lg" },
11
+ react_1.default.createElement("div", { className: "flex items-center justify-between" },
12
+ react_1.default.createElement("div", { className: "flex items-center" },
13
+ react_1.default.createElement("div", { className: "bg-white bg-opacity-20 rounded-full p-2 mr-4" },
14
+ react_1.default.createElement(base_icons_1.IconExclamation, { className: "text-white" })),
15
+ react_1.default.createElement("div", null,
16
+ react_1.default.createElement("h3", { className: "text-xl font-bold text-white" }, "Having Issues with Your Expert?"),
17
+ react_1.default.createElement("p", { className: "text-red-100 text-sm mt-1" }, "Report communication problems, quality concerns, or missed deadlines. We'll resolve it within 4-8 hours."))),
18
+ react_1.default.createElement(base_ui_1.Button, { label: "Report issue now", onClick: onReport, size: "sm", color: "danger", className: "bg-white hover:bg-warning text-danger-dark hover:text-white" }))));
19
+ };
20
+ exports.default = EscalationReportBanner;
@@ -0,0 +1,6 @@
1
+ declare const EscalationRespondForm: ({ goBack, selectedIssue, goHome }: {
2
+ goBack: () => void;
3
+ selectedIssue: any;
4
+ goHome: () => void;
5
+ }) => JSX.Element;
6
+ export default EscalationRespondForm;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const react_1 = __importStar(require("react"));
27
+ const base_icons_1 = require("@paro.io/base-icons");
28
+ const base_ui_1 = require("@paro.io/base-ui");
29
+ const responseTypes = [
30
+ {
31
+ label: "Acknowledge issue and provide resolution plan",
32
+ description: "Explain circumstances and apologize",
33
+ value: "Acknowledged",
34
+ },
35
+ {
36
+ label: "Dispute issue and provide counter-evidence",
37
+ description: "Challenge the client's concerns with documentation",
38
+ value: "Disputed",
39
+ },
40
+ {
41
+ label: "Request clarification",
42
+ description: "Ask for more details about the issue",
43
+ value: "Clarification",
44
+ },
45
+ ];
46
+ const EscalationRespondForm = ({ goBack, selectedIssue, goHome }) => {
47
+ const [selectedType, setSelectedType] = (0, react_1.useState)(responseTypes[0].value);
48
+ const [responseInput, setResponseInput] = (0, react_1.useState)('');
49
+ const [uploadFiles, setUploadFiles] = (0, react_1.useState)([]);
50
+ const [uploadingFile, setUploadingFile] = (0, react_1.useState)(false);
51
+ const fileInputRef = (0, react_1.useRef)(null);
52
+ const handleFileUpload = (event) => {
53
+ const files = Array.from(event.target.files);
54
+ setUploadFiles(prev => [...prev, ...files]);
55
+ };
56
+ const submitResponse = () => {
57
+ const responseData = {
58
+ responseType: selectedType,
59
+ responseText: responseInput,
60
+ uploadedFiles: uploadFiles.map(file => file.name),
61
+ selectedIssue: selectedIssue
62
+ };
63
+ console.log("Collected Response Data:", responseData);
64
+ goHome();
65
+ };
66
+ return (react_1.default.createElement("div", null,
67
+ react_1.default.createElement("button", { onClick: goBack, className: "flex items-center text-blue-600 mb-6" },
68
+ react_1.default.createElement(base_icons_1.IconChevronLeft, { size: "xs" }),
69
+ " Back"),
70
+ react_1.default.createElement("div", { className: "mb-6" },
71
+ react_1.default.createElement("h2", { className: "text-xl font-bold" }, "Respond to Issue"),
72
+ react_1.default.createElement("p", { className: "text-gray-600 mt-1" }, selectedIssue.problem)),
73
+ react_1.default.createElement("div", { className: "border rounded-lg overflow-hidden mb-6" },
74
+ react_1.default.createElement("div", { className: "bg-gray-50 p-3 border-b" },
75
+ react_1.default.createElement("h3", { className: "font-medium" }, "Response Type")),
76
+ react_1.default.createElement("div", { className: "p-4" },
77
+ react_1.default.createElement("div", { className: "space-y-4" },
78
+ react_1.default.createElement("div", null,
79
+ react_1.default.createElement("div", { className: "space-y-3" }, responseTypes.map((type) => (react_1.default.createElement("label", { key: type.value, className: "flex items-start cursor-pointer" },
80
+ react_1.default.createElement("input", { type: "radio", name: "responseType", className: "mt-1 mr-3", checked: selectedType === type.value, onChange: () => setSelectedType(type.value) }),
81
+ react_1.default.createElement("div", { className: selectedType === type.value
82
+ ? "bg-gray-700 text-white px-3 py-2 rounded-md text-sm font-medium"
83
+ : "border border-gray-300 text-gray-700 px-3 py-2 rounded-md text-sm font-medium" },
84
+ react_1.default.createElement("div", null,
85
+ selectedType === type.value ? "✓ " : "",
86
+ type.label),
87
+ react_1.default.createElement("div", { className: selectedType === type.value
88
+ ? "text-gray-300 text-xs mt-1"
89
+ : "text-gray-500 text-xs mt-1" }, type.description))))))),
90
+ react_1.default.createElement("div", null,
91
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Your Response"),
92
+ react_1.default.createElement(base_ui_1.Input, { type: "text", value: responseInput, placeholder: "Address the concern...", onChange: (e) => setResponseInput(e.target.value) })),
93
+ react_1.default.createElement("div", null,
94
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Supporting Documents (Optional)"),
95
+ react_1.default.createElement("div", { className: "border border-dashed border-gray-300 rounded-md p-6 text-center" },
96
+ react_1.default.createElement("p", { className: "text-sm text-gray-600" }, "Upload any supporting documentation"),
97
+ react_1.default.createElement("input", { id: "upload-file", type: "file", multiple: true, accept: ".pdf,.doc,.docx,.jpeg,.png,.gif,.csv", style: { display: 'none' }, ref: fileInputRef, onChange: handleFileUpload }),
98
+ react_1.default.createElement(base_ui_1.Button, { label: "Attach Files", iconLeft: react_1.default.createElement(base_icons_1.IconPlus, { size: "sm" }), onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, color: "info", className: "mx-2", isLoading: uploadingFile, size: "sm" }),
99
+ uploadFiles.length > 0 && (react_1.default.createElement("div", { className: "text-sm text-gray-600 mt-2" },
100
+ react_1.default.createElement("ul", { className: "list-disc list-inside" }, uploadFiles.map((f) => (react_1.default.createElement("li", { key: f.name }, f.name)))))))),
101
+ react_1.default.createElement("div", { className: "bg-blue-50 border border-blue-200 rounded-md p-3" },
102
+ react_1.default.createElement("div", { className: "flex items-center" },
103
+ react_1.default.createElement(base_icons_1.IconInfoCircle, { size: "md" }),
104
+ react_1.default.createElement("div", { className: "text-sm text-blue-800 ml-2" },
105
+ react_1.default.createElement("p", { className: "font-medium" }, "Response Guidelines"),
106
+ react_1.default.createElement("p", { className: "mt-1" }, "Your response will be visible to the client and Paro support team. Be professional and focus on resolution.")))),
107
+ react_1.default.createElement("div", { className: "flex justify-end space-x-3" },
108
+ react_1.default.createElement(base_ui_1.Button, { label: "Cancel", onClick: goBack }),
109
+ react_1.default.createElement(base_ui_1.Button, { label: "Submit Response", color: "primary", onClick: submitResponse })))))));
110
+ };
111
+ exports.default = EscalationRespondForm;
@@ -0,0 +1,9 @@
1
+ interface EscalationSubmitProps {
2
+ goBack: () => void;
3
+ goHome: () => void;
4
+ experts: any[];
5
+ projects: any[];
6
+ isExpert: boolean;
7
+ }
8
+ declare const EscalationSubmitForm: ({ goBack, goHome, experts, projects, isExpert }: EscalationSubmitProps) => JSX.Element;
9
+ export default EscalationSubmitForm;