@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.
- package/LICENSE +21 -21
- package/README.md +2 -2
- package/lib/components/ClientReferencesSection/DeleteButton.js +11 -11
- package/lib/components/ClientReferencesSection/ParoError.js +10 -10
- package/lib/components/ClientReferencesSection/TagsSection.js +2 -2
- package/lib/components/ClientReferencesSection/styles/BrandedTypography.js +2 -2
- package/lib/components/ClientReferencesSection/styles/Buttons.js +15 -15
- package/lib/components/ClientReferencesSection/styles/Name.js +5 -5
- package/lib/components/ClientReferencesSection/styles/NullContentConditionalColor.js +4 -4
- package/lib/components/ClientReferencesSection/styles/SectionBody.js +11 -11
- package/lib/components/ClientReferencesSection/styles/SectionTitle.js +6 -6
- package/lib/components/ClientReferencesSection/styles/Tags.js +2 -2
- package/lib/components/DiscussionThread/chat.d.ts +22 -22
- package/lib/components/DiscussionThread/chat.js +106 -106
- package/lib/components/DocumentCenter/DocumentTable.d.ts +15 -15
- package/lib/components/DocumentCenter/DocumentTable.js +350 -350
- package/lib/components/DocumentCenter/UploadFilesButton.d.ts +6 -6
- package/lib/components/DocumentCenter/UploadFilesButton.js +29 -29
- package/lib/components/EarningsTracker/ActiveProjectCard.d.ts +52 -52
- package/lib/components/EarningsTracker/ActiveProjectCard.js +161 -161
- package/lib/components/EarningsTracker/CenterCardUI.d.ts +13 -13
- package/lib/components/EarningsTracker/CenterCardUI.js +134 -134
- package/lib/components/EarningsTracker/EarningsTracker.d.ts +52 -52
- package/lib/components/EarningsTracker/EarningsTracker.js +508 -508
- package/lib/components/EarningsTracker/EditDateModal.d.ts +22 -22
- package/lib/components/EarningsTracker/EditDateModal.js +149 -149
- package/lib/components/EarningsTracker/EmailModal.d.ts +14 -14
- package/lib/components/EarningsTracker/EmailModal.js +79 -79
- package/lib/components/EarningsTracker/EndProjectModal.d.ts +56 -56
- package/lib/components/EarningsTracker/EndProjectModal.js +221 -221
- package/lib/components/EarningsTracker/LeftCardUI.d.ts +18 -18
- package/lib/components/EarningsTracker/LeftCardUI.js +189 -189
- package/lib/components/EarningsTracker/LogTimeModalAuthenticated.d.ts +52 -52
- package/lib/components/EarningsTracker/LogTimeModalAuthenticated.js +358 -358
- package/lib/components/EarningsTracker/ProgressBar.d.ts +4 -4
- package/lib/components/EarningsTracker/ProgressBar.js +66 -66
- package/lib/components/EarningsTracker/ReviewRequestModal.d.ts +17 -17
- package/lib/components/EarningsTracker/ReviewRequestModal.js +135 -135
- package/lib/components/EarningsTracker/RightCardUI.d.ts +46 -46
- package/lib/components/EarningsTracker/RightCardUI.js +231 -231
- package/lib/components/EarningsTracker/index.d.ts +1 -1
- package/lib/components/EarningsTracker/index.js +5 -5
- package/lib/components/Escalations/AccountSuspensionBanner.d.ts +5 -0
- package/lib/components/Escalations/AccountSuspensionBanner.js +37 -0
- package/lib/components/Escalations/AccountSuspensionModal.d.ts +5 -0
- package/lib/components/Escalations/AccountSuspensionModal.js +112 -0
- package/lib/components/Escalations/CustomTag.d.ts +3 -0
- package/lib/components/Escalations/CustomTag.js +25 -0
- package/lib/components/Escalations/EscalationChat.d.ts +6 -0
- package/lib/components/Escalations/EscalationChat.js +90 -0
- package/lib/components/Escalations/EscalationIssueCard.d.ts +15 -0
- package/lib/components/Escalations/EscalationIssueCard.js +72 -0
- package/lib/components/Escalations/EscalationReportBanner.d.ts +4 -0
- package/lib/components/Escalations/EscalationReportBanner.js +20 -0
- package/lib/components/Escalations/EscalationRespondForm.d.ts +6 -0
- package/lib/components/Escalations/EscalationRespondForm.js +111 -0
- package/lib/components/Escalations/EscalationSubmitForm.d.ts +9 -0
- package/lib/components/Escalations/EscalationSubmitForm.js +217 -0
- package/lib/components/Escalations/EscalationTabs.d.ts +9 -0
- package/lib/components/Escalations/EscalationTabs.js +30 -0
- package/lib/components/Escalations/EscalationTabsContent.d.ts +17 -0
- package/lib/components/Escalations/EscalationTabsContent.js +92 -0
- package/lib/components/Escalations/Escalations.d.ts +10 -0
- package/lib/components/Escalations/Escalations.js +146 -0
- package/lib/components/Escalations/index.d.ts +1 -0
- package/lib/components/Escalations/index.js +5 -0
- package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
- package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -7
- package/lib/components/Invoices/TestDecisionSection.d.ts +1 -1
- package/lib/components/Invoices/TestDecisionSection.js +126 -126
- package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
- package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
- package/lib/components/OrganizationChart/PersonCard.js +5 -5
- package/lib/components/OrganizationChart/utils.js +79 -79
- package/lib/components/ProjectCard/ProgressBar.js +4 -4
- package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
- package/lib/components/Reviews/Pagination.js +6 -6
- package/lib/components/ReviewsTab/RatingHeader.js +6 -6
- package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
- package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
- package/lib/components/shared/Image.js +13 -13
- package/lib/components/shared/ProfileTextField.d.ts +18 -18
- package/lib/components/shared/ProfileTextField.js +16 -16
- package/lib/components/shared/StyledActionButtons.d.ts +7 -7
- package/lib/components/shared/StyledActionButtons.js +15 -15
- package/lib/components/shared/ToastNotification.d.ts +10 -10
- package/lib/components/shared/ToastNotification.js +63 -63
- package/lib/index.d.ts +1 -0
- package/lib/index.js +3 -1
- 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,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,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,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,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;
|