@paro.io/expert-shared-components 1.12.35 → 1.12.37

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 (87) 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/EscalationChat.d.ts +6 -0
  48. package/lib/components/Escalations/EscalationChat.js +89 -0
  49. package/lib/components/Escalations/EscalationReportBanner.d.ts +4 -0
  50. package/lib/components/Escalations/EscalationReportBanner.js +20 -0
  51. package/lib/components/Escalations/EscalationRespondForm.d.ts +6 -0
  52. package/lib/components/Escalations/EscalationRespondForm.js +103 -0
  53. package/lib/components/Escalations/EscalationSubmitForm.d.ts +9 -0
  54. package/lib/components/Escalations/EscalationSubmitForm.js +207 -0
  55. package/lib/components/Escalations/EscalationTabs.d.ts +9 -0
  56. package/lib/components/Escalations/EscalationTabs.js +30 -0
  57. package/lib/components/Escalations/EscalationTabsContent.d.ts +17 -0
  58. package/lib/components/Escalations/EscalationTabsContent.js +123 -0
  59. package/lib/components/Escalations/Escalations.d.ts +10 -0
  60. package/lib/components/Escalations/Escalations.js +143 -0
  61. package/lib/components/Escalations/index.d.ts +1 -0
  62. package/lib/components/Escalations/index.js +5 -0
  63. package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
  64. package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -10
  65. package/lib/components/Invoices/InvoiceCard.js +1 -2
  66. package/lib/components/Invoices/TestDecisionSection.d.ts +1 -1
  67. package/lib/components/Invoices/TestDecisionSection.js +126 -126
  68. package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
  69. package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
  70. package/lib/components/OrganizationChart/PersonCard.js +5 -5
  71. package/lib/components/OrganizationChart/utils.js +79 -79
  72. package/lib/components/ProjectCard/ProgressBar.js +4 -4
  73. package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
  74. package/lib/components/Reviews/Pagination.js +6 -6
  75. package/lib/components/ReviewsTab/RatingHeader.js +6 -6
  76. package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
  77. package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
  78. package/lib/components/shared/Image.js +13 -13
  79. package/lib/components/shared/ProfileTextField.d.ts +18 -18
  80. package/lib/components/shared/ProfileTextField.js +16 -16
  81. package/lib/components/shared/StyledActionButtons.d.ts +7 -7
  82. package/lib/components/shared/StyledActionButtons.js +15 -15
  83. package/lib/components/shared/ToastNotification.d.ts +10 -10
  84. package/lib/components/shared/ToastNotification.js +63 -63
  85. package/lib/index.d.ts +1 -0
  86. package/lib/index.js +3 -1
  87. 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.IconExclamation, { 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,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,89 @@
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 EscalationChat = ({ activeChatIssue, showEscalationChat, setShowEscalationChat }) => {
41
+ const [uploadFiles, setUploadFiles] = (0, react_1.useState)([]);
42
+ const [uploadingFile, setUploadingFile] = (0, react_1.useState)(false);
43
+ const fileInputRef = (0, react_1.useRef)(null);
44
+ const handleFileUpload = (event) => {
45
+ const files = Array.from(event.target.files);
46
+ setUploadFiles(prev => [...prev, ...files]);
47
+ };
48
+ const removeFile = (index) => {
49
+ setUploadFiles(prev => prev.filter((_, i) => i !== index));
50
+ };
51
+ return (react_1.default.createElement(core_1.Dialog, { open: showEscalationChat, onClose: () => setShowEscalationChat(false), maxWidth: 'sm' },
52
+ react_1.default.createElement(core_1.DialogTitle, null,
53
+ 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" },
54
+ react_1.default.createElement("div", { className: "flex flex-col items-start" },
55
+ react_1.default.createElement("div", { className: "flex flex-row items-center" },
56
+ react_1.default.createElement("h1", { className: "text-md font-bold mr-2" },
57
+ "Escalation Chat #",
58
+ activeChatIssue.caseId),
59
+ react_1.default.createElement(base_ui_1.Tag, { label: activeChatIssue.status, color: "info" })),
60
+ react_1.default.createElement("p", { className: "text-xs" },
61
+ activeChatIssue.title,
62
+ " - ",
63
+ activeChatIssue.project)),
64
+ react_1.default.createElement("div", { className: "flex items-center space-x-4" },
65
+ react_1.default.createElement(core_1.IconButton, { onClick: () => setShowEscalationChat(false) },
66
+ react_1.default.createElement(base_icons_1.IconX, null))))),
67
+ react_1.default.createElement(core_1.DialogContent, null,
68
+ react_1.default.createElement("div", { className: "bg-white rounded-lg w-full overflow-hidden flex flex-col p-2 mt-12" },
69
+ react_1.default.createElement(DiscussionSection_1.DiscussionSection //update required
70
+ , { disputeId: '1', currentUser: {}, messages: [], onCreateMessage: (variables) => __awaiter(void 0, void 0, void 0, function* () {
71
+ return Promise.resolve();
72
+ }), isInternal: false }),
73
+ react_1.default.createElement("div", { className: "bg-white mt-2" },
74
+ react_1.default.createElement("div", { className: "space-y-3" },
75
+ react_1.default.createElement("div", { className: "flex items-center justify-between" },
76
+ react_1.default.createElement("div", { className: "flex items-center space-x-2" },
77
+ 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 }),
78
+ 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 }),
79
+ uploadFiles.length > 0 && (react_1.default.createElement("div", { className: "text-sm text-gray-600" },
80
+ uploadFiles.length,
81
+ " file(s) selected"))),
82
+ react_1.default.createElement("div", { className: "flex space-x-2" },
83
+ react_1.default.createElement(base_ui_1.Button, { label: "cancel", onClick: () => setShowEscalationChat(false) }))),
84
+ 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" },
85
+ react_1.default.createElement("span", null, file.name),
86
+ react_1.default.createElement(core_1.IconButton, { onClick: () => removeFile(index) },
87
+ react_1.default.createElement(base_icons_1.IconX, { size: "sm" })))))))))))));
88
+ };
89
+ exports.default = EscalationChat;
@@ -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, null)),
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,103 @@
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: "acknowledge",
34
+ },
35
+ {
36
+ label: "Dispute issue and provide counter-evidence",
37
+ description: "Challenge the client's concerns with documentation",
38
+ value: "dispute",
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
+ return (react_1.default.createElement("div", null,
57
+ react_1.default.createElement("button", { onClick: goBack, className: "flex items-center text-blue-600 mb-6" },
58
+ react_1.default.createElement(base_icons_1.IconChevronLeft, { size: "xs" }),
59
+ " Back"),
60
+ react_1.default.createElement("div", { className: "mb-6" },
61
+ react_1.default.createElement("h2", { className: "text-xl font-bold" }, "Respond to Issue"),
62
+ react_1.default.createElement("p", { className: "text-gray-600 mt-1" }, selectedIssue === 'respond-to-issue-critical' ?
63
+ "Ineo Systrans USA, Inc - Missing Deadlines - Poor Quality Work" :
64
+ "Gene Baker CPA - Lack of Updates - Poor Communication")),
65
+ react_1.default.createElement("div", { className: "border rounded-lg overflow-hidden mb-6" },
66
+ react_1.default.createElement("div", { className: "bg-gray-50 p-3 border-b" },
67
+ react_1.default.createElement("h3", { className: "font-medium" }, "Response Type")),
68
+ react_1.default.createElement("div", { className: "p-4" },
69
+ react_1.default.createElement("div", { className: "space-y-4" },
70
+ react_1.default.createElement("div", null,
71
+ 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" },
72
+ react_1.default.createElement("input", { type: "radio", name: "responseType", className: "mt-1 mr-3", checked: selectedType === type.value, onChange: () => setSelectedType(type.value) }),
73
+ react_1.default.createElement("div", { className: selectedType === type.value
74
+ ? "bg-gray-700 text-white px-3 py-2 rounded-md text-sm font-medium"
75
+ : "border border-gray-300 text-gray-700 px-3 py-2 rounded-md text-sm font-medium" },
76
+ react_1.default.createElement("div", null,
77
+ selectedType === type.value ? "✓ " : "",
78
+ type.label),
79
+ react_1.default.createElement("div", { className: selectedType === type.value
80
+ ? "text-gray-300 text-xs mt-1"
81
+ : "text-gray-500 text-xs mt-1" }, type.description))))))),
82
+ react_1.default.createElement("div", null,
83
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Your Response"),
84
+ react_1.default.createElement(base_ui_1.Input, { type: "text", value: responseInput, placeholder: "Address the client's concerns...", onChange: (e) => setResponseInput(e.target.value) })),
85
+ react_1.default.createElement("div", null,
86
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Supporting Documents (Optional)"),
87
+ react_1.default.createElement("div", { className: "border border-dashed border-gray-300 rounded-md p-6 text-center" },
88
+ react_1.default.createElement("p", { className: "text-sm text-gray-600" }, "Upload any supporting documentation"),
89
+ 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 }),
90
+ 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" }),
91
+ uploadFiles.length > 0 && (react_1.default.createElement("div", { className: "text-sm text-gray-600 mt-2" },
92
+ react_1.default.createElement("ul", { className: "list-disc list-inside" }, uploadFiles.map((f) => (react_1.default.createElement("li", { key: f.name }, f.name)))))))),
93
+ react_1.default.createElement("div", { className: "bg-blue-50 border border-blue-200 rounded-md p-3" },
94
+ react_1.default.createElement("div", { className: "flex items-center" },
95
+ react_1.default.createElement(base_icons_1.IconInfoCircle, { size: "md" }),
96
+ react_1.default.createElement("div", { className: "text-sm text-blue-800 ml-2" },
97
+ react_1.default.createElement("p", { className: "font-medium" }, "Response Guidelines"),
98
+ 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.")))),
99
+ react_1.default.createElement("div", { className: "flex justify-end space-x-3" },
100
+ react_1.default.createElement(base_ui_1.Button, { label: "Cancel", onClick: goBack }),
101
+ react_1.default.createElement(base_ui_1.Button, { label: "Submit Response", color: "primary", onClick: goHome })))))));
102
+ };
103
+ 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;
@@ -0,0 +1,207 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const react_1 = __importStar(require("react"));
30
+ const base_icons_1 = require("@paro.io/base-icons");
31
+ const base_ui_1 = require("@paro.io/base-ui");
32
+ const core_1 = require("@material-ui/core");
33
+ const LogTimeModalAuthenticated_1 = require("../ProjectCard/LogTimeModalAuthenticated");
34
+ const dayjs_1 = __importDefault(require("dayjs"));
35
+ const issueTypeOptions = [
36
+ { value: 'Communication Issues', label: 'Communication Issues' },
37
+ { value: 'Professionalism', label: 'Professionalism' },
38
+ { value: 'Project Abandonment', label: 'Project Abandonment' },
39
+ { value: 'Delayed Deliverables or Deadlines due to Missing Information/Documentation', label: 'Delayed Deliverables or Deadlines due to Missing Information/Documentation' },
40
+ { value: 'Billing Concern', label: 'Billing Concern' },
41
+ { value: 'Other', label: 'Other' },
42
+ ];
43
+ const EscalationSubmitForm = ({ goBack, goHome, experts, projects, isExpert = false }) => {
44
+ const [isChecked, setIsChecked] = (0, react_1.useState)(false);
45
+ const [problemInput, setProblemInput] = (0, react_1.useState)('');
46
+ const [outcomeInput, setOutcomeInput] = (0, react_1.useState)('');
47
+ const [uploadFiles, setUploadFiles] = (0, react_1.useState)([]);
48
+ const [uploadingFile, setUploadingFile] = (0, react_1.useState)(false);
49
+ const [expertOptions, setExpertOptions] = (0, react_1.useState)([]);
50
+ const [selectedExpert, setSelectedExpert] = (0, react_1.useState)(null);
51
+ const [projectOptions, setProjectOptions] = (0, react_1.useState)([]);
52
+ const [selectedProjects, setSelectedProjects] = (0, react_1.useState)([]);
53
+ const [issueType, setIssueType] = (0, react_1.useState)('');
54
+ const [priority, setPriority] = (0, react_1.useState)('');
55
+ const [startDate, setStartDate] = (0, react_1.useState)(undefined);
56
+ const [isDateInvalid, setIsDateInvalid] = (0, react_1.useState)(false);
57
+ const fileInputRef = (0, react_1.useRef)(null);
58
+ (0, react_1.useEffect)(() => {
59
+ if (experts && experts.length > 0) {
60
+ const options = experts.map((expert) => ({
61
+ label: isExpert ? expert.name : expert.freelancerName,
62
+ value: isExpert ? expert.id : expert.freelancerId,
63
+ }));
64
+ setExpertOptions(options);
65
+ }
66
+ }, [experts]);
67
+ (0, react_1.useEffect)(() => {
68
+ if (projects && projects.length > 0) {
69
+ const options = projects
70
+ .filter((p) => {
71
+ if (isExpert) {
72
+ return p.client.id === Number(selectedExpert);
73
+ }
74
+ else {
75
+ return p.freelancer.id === Number(selectedExpert);
76
+ }
77
+ })
78
+ .map((p) => ({
79
+ label: isExpert ? p.name : p.name,
80
+ value: isExpert ? p : p,
81
+ }));
82
+ setProjectOptions(options);
83
+ }
84
+ }, [projects, selectedExpert]);
85
+ const handleFileUpload = (event) => {
86
+ const files = Array.from(event.target.files);
87
+ setUploadFiles(prev => [...prev, ...files]);
88
+ };
89
+ const isFormValid = () => {
90
+ const requiredProjectSelection = isExpert || (!isExpert && selectedProjects.length > 0);
91
+ return (selectedExpert !== null &&
92
+ issueType !== '' &&
93
+ priority !== '' &&
94
+ problemInput.trim() !== '' &&
95
+ outcomeInput.trim() !== '' &&
96
+ isChecked &&
97
+ startDate !== undefined &&
98
+ requiredProjectSelection);
99
+ };
100
+ const handleSubmit = () => {
101
+ if (!isFormValid())
102
+ return;
103
+ const formData = {
104
+ selectedExpert,
105
+ selectedProjects,
106
+ issueType,
107
+ priority,
108
+ startDate,
109
+ problemDescription: problemInput,
110
+ expectedOutcome: outcomeInput,
111
+ supportingDocs: uploadFiles.map(f => f.name),
112
+ };
113
+ console.log('Escalation Submitted:', formData);
114
+ // Redirect or perform additional logic
115
+ goHome();
116
+ };
117
+ const validateDate = (date) => {
118
+ const minDate = LogTimeModalAuthenticated_1.constants.MIN_DATE;
119
+ const maxDate = new Date();
120
+ const isValid = date ? date.setHours(0, 0, 0, 0) < minDate.setHours(0, 0, 0, 0) || date.setHours(0, 0, 0, 0) > maxDate.setHours(0, 0, 0, 0) : true;
121
+ setIsDateInvalid(isValid);
122
+ return !isValid;
123
+ };
124
+ return (react_1.default.createElement("div", { className: 'w-full max-w-full' },
125
+ react_1.default.createElement("button", { onClick: goBack, className: "flex items-center text-blue-600 mb-6" },
126
+ react_1.default.createElement(base_icons_1.IconChevronLeft, { size: "xs" }),
127
+ " Back"),
128
+ react_1.default.createElement("div", { className: "mb-6" },
129
+ react_1.default.createElement("h2", { className: "text-xl font-bold" }, "Report Issue with Your Expert"),
130
+ react_1.default.createElement("p", { className: "text-gray-600 mt-1" }, "Provide details about the issue you're experiencing and we'll resolve it within 4-8 hours")),
131
+ react_1.default.createElement("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4 mb-6" },
132
+ react_1.default.createElement("div", { className: "flex items-start" },
133
+ react_1.default.createElement("span", { className: "mr-3" }, "!"),
134
+ react_1.default.createElement("div", null,
135
+ react_1.default.createElement("p", { className: "font-medium text-red-800" }, "Common Issues We Can Help With"),
136
+ react_1.default.createElement("ul", { className: "mt-1 text-sm text-red-700 list-disc list-inside space-y-1" },
137
+ react_1.default.createElement("li", null, `Communication delays (${isExpert ? 'client' : 'expert'} not responding)`),
138
+ !isExpert && react_1.default.createElement("li", null, "Missed deadlines or project delays"),
139
+ !isExpert && react_1.default.createElement("li", null, "Quality concerns with deliverables"),
140
+ react_1.default.createElement("li", null, "Scope changes or unexpected requests"),
141
+ react_1.default.createElement("li", null, "Billing or payment disputes"))))),
142
+ react_1.default.createElement("div", { className: "border rounded-lg overflow-hidden mb-6" },
143
+ react_1.default.createElement("div", { className: "bg-gray-50 p-3 border-b" },
144
+ react_1.default.createElement("h3", { className: "font-medium" }, "Issue Details")),
145
+ react_1.default.createElement("div", { className: "p-4 space-y-4" },
146
+ react_1.default.createElement("div", null,
147
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, `Which ${isExpert ? 'client' : 'expert'} are you experiencing the issue with?`),
148
+ react_1.default.createElement(core_1.Select, { fullWidth: true, value: selectedExpert !== null && selectedExpert !== void 0 ? selectedExpert : '', onChange: e => setSelectedExpert(e.target.value === '' ? null : Number(e.target.value)), displayEmpty: true, variant: "outlined", placeholder: `Select a ${isExpert ? 'Client' : 'Expert'}` },
149
+ react_1.default.createElement(core_1.MenuItem, { disabled: true, value: "" },
150
+ react_1.default.createElement("em", null, `Select a ${isExpert ? 'Client' : 'Expert'}`)),
151
+ expertOptions.map(option => (react_1.default.createElement(core_1.MenuItem, { key: option.value, value: option.value }, option.label))))),
152
+ react_1.default.createElement("div", null,
153
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Which Project(s)?"),
154
+ react_1.default.createElement(core_1.Select, { multiple: true, fullWidth: true, value: selectedProjects, onChange: (e) => {
155
+ const value = e.target.value;
156
+ setSelectedProjects(Array.isArray(value) ? value : [value]);
157
+ }, variant: "outlined", displayEmpty: true, renderValue: (selected) => {
158
+ if (selected.length === 0) {
159
+ return react_1.default.createElement("span", { className: "text-gray-400" }, "Select project(s)");
160
+ }
161
+ return projectOptions
162
+ .filter(opt => selected.includes(opt.value))
163
+ .map(opt => opt.label)
164
+ .join(', ');
165
+ }, placeholder: `Select a Project(s)` },
166
+ react_1.default.createElement(core_1.MenuItem, { disabled: true, value: "" },
167
+ react_1.default.createElement("em", null, "Select a Project(s)...")),
168
+ projectOptions.map(option => (react_1.default.createElement(core_1.MenuItem, { key: option.value, value: option.value }, option.label))))),
169
+ react_1.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" },
170
+ react_1.default.createElement("div", null,
171
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Issue Type"),
172
+ react_1.default.createElement(core_1.Select, { fullWidth: true, value: issueType, onChange: e => setIssueType(e.target.value), displayEmpty: true, variant: "outlined" },
173
+ react_1.default.createElement(core_1.MenuItem, { disabled: true, value: "" },
174
+ react_1.default.createElement("em", null, "Select issue type...")),
175
+ issueTypeOptions.map(option => (react_1.default.createElement(core_1.MenuItem, { key: option.value, value: option.value }, option.label))))),
176
+ react_1.default.createElement("div", null,
177
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Priority Level"),
178
+ react_1.default.createElement(core_1.Select, { fullWidth: true, value: priority, onChange: e => setPriority(e.target.value), displayEmpty: true, variant: "outlined" },
179
+ react_1.default.createElement(core_1.MenuItem, { disabled: true, value: "" },
180
+ react_1.default.createElement("em", null, "Select priority...")),
181
+ react_1.default.createElement(core_1.MenuItem, { value: "Critical" }, "Critical"),
182
+ react_1.default.createElement(core_1.MenuItem, { value: "High" }, "High"),
183
+ react_1.default.createElement(core_1.MenuItem, { value: "Medium" }, "Medium"),
184
+ react_1.default.createElement(core_1.MenuItem, { value: "Low" }, "Low")))),
185
+ react_1.default.createElement("div", null,
186
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "When did this issue start?"),
187
+ react_1.default.createElement(LogTimeModalAuthenticated_1.SelectDate, { timeLogDate: startDate, setTimeLogDate: setStartDate, isInvalid: false, setIsDateInvalid: setIsDateInvalid, validateDate: validateDate, maxDate: (0, dayjs_1.default)(new Date()).format("MM-DD-YYYY") })),
188
+ react_1.default.createElement("div", null,
189
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "What's the problem?"),
190
+ react_1.default.createElement(base_ui_1.Input, { type: "text", value: problemInput, placeholder: "Describe the issue...", onChange: (e) => setProblemInput(e.target.value) })),
191
+ react_1.default.createElement("div", null,
192
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "What outcome are you looking for?"),
193
+ react_1.default.createElement(base_ui_1.Input, { type: "text", value: outcomeInput, placeholder: "What would you like to see happen?", onChange: (e) => setOutcomeInput(e.target.value) })),
194
+ react_1.default.createElement("div", null,
195
+ react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Supporting Documents (Optional)"),
196
+ react_1.default.createElement("div", { className: "border border-dashed border-gray-300 rounded-md p-6 text-center" },
197
+ react_1.default.createElement("p", { className: "text-sm text-gray-600" }, "Upload screenshots, emails, or documents"),
198
+ react_1.default.createElement("input", { ref: fileInputRef, type: "file", multiple: true, accept: ".pdf,.doc,.docx,.jpeg,.png,.gif,.csv", hidden: true, onChange: handleFileUpload }),
199
+ 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", isLoading: uploadingFile, size: "sm" }),
200
+ uploadFiles.length > 0 && (react_1.default.createElement("ul", { className: "mt-2 text-sm text-gray-600 list-disc list-inside" }, uploadFiles.map(f => react_1.default.createElement("li", { key: f.name }, f.name)))))),
201
+ react_1.default.createElement("div", { className: "bg-[#EFF6FF] p-3 rounded" },
202
+ react_1.default.createElement(base_ui_1.Checkbox, { id: "checkbox-1", label: `I understand this will notify my ${isExpert ? 'client' : 'expert'} and the Paro support team`, name: "acknowledge", isChecked: isChecked, onChange: () => setIsChecked(prev => !prev) })),
203
+ react_1.default.createElement("div", { className: "flex justify-end space-x-3 pt-4" },
204
+ react_1.default.createElement(base_ui_1.Button, { label: "Cancel", onClick: goBack }),
205
+ react_1.default.createElement(base_ui_1.Button, { label: "Submit issue", onClick: handleSubmit, color: "primary", disabled: !isFormValid() }))))));
206
+ };
207
+ exports.default = EscalationSubmitForm;
@@ -0,0 +1,9 @@
1
+ interface EscalationTabProps {
2
+ activeTab: string;
3
+ setActiveTab: (activeTab: string) => void;
4
+ activeIssues: number;
5
+ inProgressIssues: number;
6
+ resolvedIssues: number;
7
+ }
8
+ declare const EscalationTabs: ({ activeTab, setActiveTab, activeIssues, inProgressIssues, resolvedIssues, }: EscalationTabProps) => JSX.Element;
9
+ export default EscalationTabs;
@@ -0,0 +1,30 @@
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
+ ;
8
+ const EscalationTabs = ({ activeTab, setActiveTab, activeIssues = 0, inProgressIssues = 0, resolvedIssues = 0, }) => {
9
+ return (react_1.default.createElement("div", { className: "border-b border-gray-200 mb-6" },
10
+ react_1.default.createElement("nav", { className: "flex space-x-8" },
11
+ react_1.default.createElement("button", { onClick: () => setActiveTab('action-required'), className: `py-2 px-1 border-b-2 font-medium text-sm flex items-center ${activeTab === 'action-required'
12
+ ? 'border-[#EF5360] text-[#EF5360]'
13
+ : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'}` },
14
+ react_1.default.createElement("div", { className: "bg-[#EF5360] w-2 h-2 rounded-full mr-2" }),
15
+ "Action Required",
16
+ react_1.default.createElement("div", { className: "bg-red-100 text-[#EF5360] font-bold rounded-full px-2 py-1 text-xs ml-2" }, activeIssues)),
17
+ react_1.default.createElement("button", { onClick: () => setActiveTab('in-progress'), className: `py-2 px-1 border-b-2 font-medium text-sm flex items-center ${activeTab === 'in-progress'
18
+ ? 'border-blue-500 text-blue-600'
19
+ : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'}` },
20
+ react_1.default.createElement("div", { className: "bg-blue-500 w-2 h-2 rounded-full mr-2" }),
21
+ "In Progress",
22
+ react_1.default.createElement("div", { className: "bg-blue-100 text-blue-800 font-bold rounded-full px-2 py-1 text-xs ml-2" }, inProgressIssues)),
23
+ react_1.default.createElement("button", { onClick: () => setActiveTab('resolved'), className: `py-2 px-1 border-b-2 font-medium text-sm flex items-center ${activeTab === 'resolved'
24
+ ? 'border-green-500 text-green-600'
25
+ : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'}` },
26
+ react_1.default.createElement("div", { className: "bg-green-500 w-2 h-2 rounded-full mr-2" }),
27
+ "Resolved",
28
+ react_1.default.createElement("div", { className: "bg-green-100 text-green-800 font-bold rounded-full px-2 py-1 text-xs ml-2" }, resolvedIssues)))));
29
+ };
30
+ exports.default = EscalationTabs;