@bbearai/react 0.1.8 → 0.1.9
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/dist/index.d.mts +15 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.js +794 -213
- package/dist/index.mjs +795 -214
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -58,7 +58,17 @@ var BugBearContext = (0, import_react.createContext)({
|
|
|
58
58
|
endSession: async () => ({ success: false }),
|
|
59
59
|
addFinding: async () => ({ success: false }),
|
|
60
60
|
refreshSession: async () => {
|
|
61
|
-
}
|
|
61
|
+
},
|
|
62
|
+
// Messaging
|
|
63
|
+
threads: [],
|
|
64
|
+
unreadCount: 0,
|
|
65
|
+
refreshThreads: async () => {
|
|
66
|
+
},
|
|
67
|
+
getThreadMessages: async () => [],
|
|
68
|
+
sendMessage: async () => false,
|
|
69
|
+
markAsRead: async () => {
|
|
70
|
+
},
|
|
71
|
+
createThread: async () => ({ success: false })
|
|
62
72
|
});
|
|
63
73
|
function useBugBear() {
|
|
64
74
|
return (0, import_react.useContext)(BugBearContext);
|
|
@@ -73,6 +83,8 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
73
83
|
const hasInitialized = (0, import_react.useRef)(false);
|
|
74
84
|
const [activeSession, setActiveSession] = (0, import_react.useState)(null);
|
|
75
85
|
const [sessionFindings, setSessionFindings] = (0, import_react.useState)([]);
|
|
86
|
+
const [threads, setThreads] = (0, import_react.useState)([]);
|
|
87
|
+
const [unreadCount, setUnreadCount] = (0, import_react.useState)(0);
|
|
76
88
|
const refreshAssignments = (0, import_react.useCallback)(async () => {
|
|
77
89
|
if (!client) return;
|
|
78
90
|
const newAssignments = await client.getAssignedTests();
|
|
@@ -117,6 +129,38 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
117
129
|
}
|
|
118
130
|
return result;
|
|
119
131
|
}, [client, activeSession]);
|
|
132
|
+
const refreshThreads = (0, import_react.useCallback)(async () => {
|
|
133
|
+
if (!client) return;
|
|
134
|
+
const newThreads = await client.getThreadsForTester();
|
|
135
|
+
setThreads(newThreads);
|
|
136
|
+
const totalUnread = newThreads.reduce((sum, t) => sum + t.unreadCount, 0);
|
|
137
|
+
setUnreadCount(totalUnread);
|
|
138
|
+
}, [client]);
|
|
139
|
+
const getThreadMessages = (0, import_react.useCallback)(async (threadId) => {
|
|
140
|
+
if (!client) return [];
|
|
141
|
+
return client.getThreadMessages(threadId);
|
|
142
|
+
}, [client]);
|
|
143
|
+
const sendMessage = (0, import_react.useCallback)(async (threadId, content) => {
|
|
144
|
+
if (!client) return false;
|
|
145
|
+
const success = await client.sendMessage(threadId, content);
|
|
146
|
+
if (success) {
|
|
147
|
+
await refreshThreads();
|
|
148
|
+
}
|
|
149
|
+
return success;
|
|
150
|
+
}, [client, refreshThreads]);
|
|
151
|
+
const markAsRead = (0, import_react.useCallback)(async (threadId) => {
|
|
152
|
+
if (!client) return;
|
|
153
|
+
await client.markThreadAsRead(threadId);
|
|
154
|
+
await refreshThreads();
|
|
155
|
+
}, [client, refreshThreads]);
|
|
156
|
+
const createThread = (0, import_react.useCallback)(async (options) => {
|
|
157
|
+
if (!client) return { success: false, error: "Client not initialized" };
|
|
158
|
+
const result = await client.createThread(options);
|
|
159
|
+
if (result.success) {
|
|
160
|
+
await refreshThreads();
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}, [client, refreshThreads]);
|
|
120
164
|
const initializeBugBear = (0, import_react.useCallback)(async (bugBearClient) => {
|
|
121
165
|
setIsLoading(true);
|
|
122
166
|
try {
|
|
@@ -129,12 +173,16 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
129
173
|
setTesterInfo(info);
|
|
130
174
|
setIsTester(!!info);
|
|
131
175
|
if (info && qaEnabled) {
|
|
132
|
-
const [newAssignments, session] = await Promise.all([
|
|
176
|
+
const [newAssignments, session, newThreads] = await Promise.all([
|
|
133
177
|
bugBearClient.getAssignedTests(),
|
|
134
|
-
bugBearClient.getActiveSession()
|
|
178
|
+
bugBearClient.getActiveSession(),
|
|
179
|
+
bugBearClient.getThreadsForTester()
|
|
135
180
|
]);
|
|
136
181
|
setAssignments(newAssignments);
|
|
137
182
|
setActiveSession(session);
|
|
183
|
+
setThreads(newThreads);
|
|
184
|
+
const totalUnread = newThreads.reduce((sum, t) => sum + t.unreadCount, 0);
|
|
185
|
+
setUnreadCount(totalUnread);
|
|
138
186
|
if (session) {
|
|
139
187
|
const findings = await bugBearClient.getSessionFindings(session.id);
|
|
140
188
|
setSessionFindings(findings);
|
|
@@ -200,7 +248,15 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
200
248
|
startSession,
|
|
201
249
|
endSession,
|
|
202
250
|
addFinding,
|
|
203
|
-
refreshSession
|
|
251
|
+
refreshSession,
|
|
252
|
+
// Messaging
|
|
253
|
+
threads,
|
|
254
|
+
unreadCount,
|
|
255
|
+
refreshThreads,
|
|
256
|
+
getThreadMessages,
|
|
257
|
+
sendMessage,
|
|
258
|
+
markAsRead,
|
|
259
|
+
createThread
|
|
204
260
|
},
|
|
205
261
|
children
|
|
206
262
|
}
|
|
@@ -279,13 +335,77 @@ function BugBearPanel({
|
|
|
279
335
|
defaultCollapsed = false,
|
|
280
336
|
draggable = true
|
|
281
337
|
}) {
|
|
282
|
-
const { client, shouldShowWidget, testerInfo, assignments, currentAssignment, refreshAssignments, isLoading, onNavigate, updateTesterProfile, refreshTesterInfo, activeSession, sessionFindings, startSession, endSession, addFinding } = useBugBear();
|
|
338
|
+
const { client, shouldShowWidget, testerInfo, assignments, currentAssignment, refreshAssignments, isLoading, onNavigate, updateTesterProfile, refreshTesterInfo, activeSession, sessionFindings, startSession, endSession, addFinding, threads, unreadCount, refreshThreads, getThreadMessages, sendMessage, markAsRead, createThread } = useBugBear();
|
|
283
339
|
const [collapsed, setCollapsed] = (0, import_react2.useState)(defaultCollapsed);
|
|
284
340
|
const [activeTab, setActiveTab] = (0, import_react2.useState)("tests");
|
|
285
341
|
const [showSteps, setShowSteps] = (0, import_react2.useState)(false);
|
|
286
342
|
const [testView, setTestView] = (0, import_react2.useState)("detail");
|
|
287
343
|
const [selectedTestId, setSelectedTestId] = (0, import_react2.useState)(null);
|
|
344
|
+
const [messageView, setMessageView] = (0, import_react2.useState)("list");
|
|
345
|
+
const [selectedThread, setSelectedThread] = (0, import_react2.useState)(null);
|
|
346
|
+
const [threadMessages, setThreadMessages] = (0, import_react2.useState)([]);
|
|
347
|
+
const [replyText, setReplyText] = (0, import_react2.useState)("");
|
|
348
|
+
const [sendingReply, setSendingReply] = (0, import_react2.useState)(false);
|
|
349
|
+
const [loadingMessages, setLoadingMessages] = (0, import_react2.useState)(false);
|
|
350
|
+
const [composeSubject, setComposeSubject] = (0, import_react2.useState)("");
|
|
351
|
+
const [composeMessage, setComposeMessage] = (0, import_react2.useState)("");
|
|
352
|
+
const [sendingNewMessage, setSendingNewMessage] = (0, import_react2.useState)(false);
|
|
288
353
|
const displayedAssignment = selectedTestId ? assignments.find((a) => a.id === selectedTestId) || currentAssignment : currentAssignment;
|
|
354
|
+
const groupedAssignments = (0, import_react2.useMemo)(() => {
|
|
355
|
+
const groups = /* @__PURE__ */ new Map();
|
|
356
|
+
for (const assignment of assignments) {
|
|
357
|
+
const groupId = assignment.testCase.group?.id || "ungrouped";
|
|
358
|
+
const group = assignment.testCase.group || null;
|
|
359
|
+
if (!groups.has(groupId)) {
|
|
360
|
+
groups.set(groupId, {
|
|
361
|
+
group,
|
|
362
|
+
assignments: [],
|
|
363
|
+
stats: { total: 0, passed: 0, failed: 0, pending: 0, skipped: 0 }
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
const folder = groups.get(groupId);
|
|
367
|
+
folder.assignments.push(assignment);
|
|
368
|
+
folder.stats.total++;
|
|
369
|
+
if (assignment.status === "passed") folder.stats.passed++;
|
|
370
|
+
else if (assignment.status === "failed") folder.stats.failed++;
|
|
371
|
+
else if (assignment.status === "skipped") folder.stats.skipped++;
|
|
372
|
+
else folder.stats.pending++;
|
|
373
|
+
}
|
|
374
|
+
const sortedGroups = Array.from(groups.values()).sort((a, b) => {
|
|
375
|
+
if (!a.group && !b.group) return 0;
|
|
376
|
+
if (!a.group) return 1;
|
|
377
|
+
if (!b.group) return -1;
|
|
378
|
+
return a.group.sortOrder - b.group.sortOrder;
|
|
379
|
+
});
|
|
380
|
+
return sortedGroups;
|
|
381
|
+
}, [assignments]);
|
|
382
|
+
const toggleFolderCollapse = (0, import_react2.useCallback)((groupId) => {
|
|
383
|
+
setCollapsedFolders((prev) => {
|
|
384
|
+
const next = new Set(prev);
|
|
385
|
+
if (next.has(groupId)) {
|
|
386
|
+
next.delete(groupId);
|
|
387
|
+
} else {
|
|
388
|
+
next.add(groupId);
|
|
389
|
+
}
|
|
390
|
+
return next;
|
|
391
|
+
});
|
|
392
|
+
}, []);
|
|
393
|
+
const getStatusBadge = (status) => {
|
|
394
|
+
switch (status) {
|
|
395
|
+
case "passed":
|
|
396
|
+
return { icon: "\u2705", label: "Passed", className: "bg-green-900/30 text-green-400" };
|
|
397
|
+
case "failed":
|
|
398
|
+
return { icon: "\u274C", label: "Failed", className: "bg-red-900/30 text-red-400" };
|
|
399
|
+
case "skipped":
|
|
400
|
+
return { icon: "\u23ED\uFE0F", label: "Skipped", className: "bg-yellow-900/30 text-yellow-400" };
|
|
401
|
+
case "in_progress":
|
|
402
|
+
return { icon: "\u{1F504}", label: "In Progress", className: "bg-blue-900/30 text-blue-400" };
|
|
403
|
+
case "blocked":
|
|
404
|
+
return { icon: "\u{1F6AB}", label: "Blocked", className: "bg-orange-900/30 text-orange-400" };
|
|
405
|
+
default:
|
|
406
|
+
return { icon: "\u23F3", label: "Pending", className: "bg-zinc-700 text-zinc-400" };
|
|
407
|
+
}
|
|
408
|
+
};
|
|
289
409
|
const [panelPosition, setPanelPosition] = (0, import_react2.useState)(null);
|
|
290
410
|
const [isDragging, setIsDragging] = (0, import_react2.useState)(false);
|
|
291
411
|
const dragStartRef = (0, import_react2.useRef)(null);
|
|
@@ -307,6 +427,10 @@ function BugBearPanel({
|
|
|
307
427
|
expectedResultUnclear: false
|
|
308
428
|
});
|
|
309
429
|
const [criteriaResults, setCriteriaResults] = (0, import_react2.useState)({});
|
|
430
|
+
const [showSkipModal, setShowSkipModal] = (0, import_react2.useState)(false);
|
|
431
|
+
const [selectedSkipReason, setSelectedSkipReason] = (0, import_react2.useState)(null);
|
|
432
|
+
const [skipNotes, setSkipNotes] = (0, import_react2.useState)("");
|
|
433
|
+
const [skipping, setSkipping] = (0, import_react2.useState)(false);
|
|
310
434
|
const [profileEditing, setProfileEditing] = (0, import_react2.useState)(false);
|
|
311
435
|
const [profileName, setProfileName] = (0, import_react2.useState)("");
|
|
312
436
|
const [profileAdditionalEmails, setProfileAdditionalEmails] = (0, import_react2.useState)([]);
|
|
@@ -315,6 +439,7 @@ function BugBearPanel({
|
|
|
315
439
|
const [savingProfile, setSavingProfile] = (0, import_react2.useState)(false);
|
|
316
440
|
const [profileSaved, setProfileSaved] = (0, import_react2.useState)(false);
|
|
317
441
|
const [showProfileOverlay, setShowProfileOverlay] = (0, import_react2.useState)(false);
|
|
442
|
+
const [collapsedFolders, setCollapsedFolders] = (0, import_react2.useState)(/* @__PURE__ */ new Set());
|
|
318
443
|
const [startingSession, setStartingSession] = (0, import_react2.useState)(false);
|
|
319
444
|
const [sessionFocusArea, setSessionFocusArea] = (0, import_react2.useState)("");
|
|
320
445
|
const [sessionPlatform, setSessionPlatform] = (0, import_react2.useState)("web");
|
|
@@ -518,6 +643,35 @@ function BugBearPanel({
|
|
|
518
643
|
expectedResultUnclear: false
|
|
519
644
|
});
|
|
520
645
|
};
|
|
646
|
+
const handleOpenSkipModal = () => {
|
|
647
|
+
setShowSkipModal(true);
|
|
648
|
+
setSelectedSkipReason(null);
|
|
649
|
+
setSkipNotes("");
|
|
650
|
+
};
|
|
651
|
+
const handleSkip = async () => {
|
|
652
|
+
if (!client || !displayedAssignment || !selectedSkipReason) return;
|
|
653
|
+
setSkipping(true);
|
|
654
|
+
const result = await client.skipAssignment(
|
|
655
|
+
displayedAssignment.id,
|
|
656
|
+
selectedSkipReason,
|
|
657
|
+
skipNotes.trim() || void 0
|
|
658
|
+
);
|
|
659
|
+
if (result.success) {
|
|
660
|
+
await refreshAssignments();
|
|
661
|
+
setShowSkipModal(false);
|
|
662
|
+
setSelectedSkipReason(null);
|
|
663
|
+
setSkipNotes("");
|
|
664
|
+
setSelectedTestId(null);
|
|
665
|
+
setTestView("detail");
|
|
666
|
+
}
|
|
667
|
+
setSkipping(false);
|
|
668
|
+
};
|
|
669
|
+
const skipReasonOptions = [
|
|
670
|
+
{ value: "blocked", label: "Blocked", description: "Environment issue or external blocker" },
|
|
671
|
+
{ value: "not_ready", label: "Not Ready", description: "Feature not yet implemented" },
|
|
672
|
+
{ value: "dependency", label: "Dependency", description: "Waiting on another test or task" },
|
|
673
|
+
{ value: "other", label: "Other", description: "Other reason (please specify)" }
|
|
674
|
+
];
|
|
521
675
|
const handleSubmitFeedback = async (skipFeedback = false) => {
|
|
522
676
|
if (!client || !displayedAssignment) return;
|
|
523
677
|
setSubmitting(true);
|
|
@@ -713,6 +867,87 @@ function BugBearPanel({
|
|
|
713
867
|
}
|
|
714
868
|
return `${m}:${s.toString().padStart(2, "0")}`;
|
|
715
869
|
};
|
|
870
|
+
const formatRelativeTime = (dateString) => {
|
|
871
|
+
const date = new Date(dateString);
|
|
872
|
+
const now = /* @__PURE__ */ new Date();
|
|
873
|
+
const diffMs = now.getTime() - date.getTime();
|
|
874
|
+
const diffMins = Math.floor(diffMs / 6e4);
|
|
875
|
+
const diffHours = Math.floor(diffMs / 36e5);
|
|
876
|
+
const diffDays = Math.floor(diffMs / 864e5);
|
|
877
|
+
if (diffMins < 1) return "Just now";
|
|
878
|
+
if (diffMins < 60) return `${diffMins}m ago`;
|
|
879
|
+
if (diffHours < 24) return `${diffHours}h ago`;
|
|
880
|
+
if (diffDays === 1) return "Yesterday";
|
|
881
|
+
if (diffDays < 7) return `${diffDays}d ago`;
|
|
882
|
+
return date.toLocaleDateString();
|
|
883
|
+
};
|
|
884
|
+
const formatMessageTime = (dateString) => {
|
|
885
|
+
const date = new Date(dateString);
|
|
886
|
+
return date.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
|
|
887
|
+
};
|
|
888
|
+
const getThreadTypeIcon = (type) => {
|
|
889
|
+
switch (type) {
|
|
890
|
+
case "announcement":
|
|
891
|
+
return "\u{1F4E2}";
|
|
892
|
+
case "direct":
|
|
893
|
+
return "\u{1F4AC}";
|
|
894
|
+
case "report":
|
|
895
|
+
return "\u{1F41B}";
|
|
896
|
+
case "general_note":
|
|
897
|
+
return "\u{1F4DD}";
|
|
898
|
+
default:
|
|
899
|
+
return "\u{1F4AC}";
|
|
900
|
+
}
|
|
901
|
+
};
|
|
902
|
+
const handleOpenThread = async (thread) => {
|
|
903
|
+
setSelectedThread(thread);
|
|
904
|
+
setMessageView("thread");
|
|
905
|
+
setLoadingMessages(true);
|
|
906
|
+
const messages = await getThreadMessages(thread.id);
|
|
907
|
+
setThreadMessages(messages);
|
|
908
|
+
setLoadingMessages(false);
|
|
909
|
+
if (thread.unreadCount > 0) {
|
|
910
|
+
await markAsRead(thread.id);
|
|
911
|
+
}
|
|
912
|
+
};
|
|
913
|
+
const handleSendReply = async () => {
|
|
914
|
+
if (!selectedThread || !replyText.trim()) return;
|
|
915
|
+
setSendingReply(true);
|
|
916
|
+
const success = await sendMessage(selectedThread.id, replyText.trim());
|
|
917
|
+
if (success) {
|
|
918
|
+
setReplyText("");
|
|
919
|
+
const messages = await getThreadMessages(selectedThread.id);
|
|
920
|
+
setThreadMessages(messages);
|
|
921
|
+
}
|
|
922
|
+
setSendingReply(false);
|
|
923
|
+
};
|
|
924
|
+
const handleBackToThreadList = () => {
|
|
925
|
+
setMessageView("list");
|
|
926
|
+
setSelectedThread(null);
|
|
927
|
+
setThreadMessages([]);
|
|
928
|
+
setReplyText("");
|
|
929
|
+
setComposeSubject("");
|
|
930
|
+
setComposeMessage("");
|
|
931
|
+
};
|
|
932
|
+
const handleStartNewMessage = () => {
|
|
933
|
+
setMessageView("compose");
|
|
934
|
+
setComposeSubject("");
|
|
935
|
+
setComposeMessage("");
|
|
936
|
+
};
|
|
937
|
+
const handleSendNewMessage = async () => {
|
|
938
|
+
if (!composeSubject.trim() || !composeMessage.trim()) return;
|
|
939
|
+
setSendingNewMessage(true);
|
|
940
|
+
const result = await createThread({
|
|
941
|
+
subject: composeSubject.trim(),
|
|
942
|
+
message: composeMessage.trim()
|
|
943
|
+
});
|
|
944
|
+
if (result.success) {
|
|
945
|
+
setComposeSubject("");
|
|
946
|
+
setComposeMessage("");
|
|
947
|
+
setMessageView("list");
|
|
948
|
+
}
|
|
949
|
+
setSendingNewMessage(false);
|
|
950
|
+
};
|
|
716
951
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
717
952
|
"div",
|
|
718
953
|
{
|
|
@@ -735,22 +970,22 @@ function BugBearPanel({
|
|
|
735
970
|
onClick: () => setCollapsed(false),
|
|
736
971
|
"data-drag-handle": true,
|
|
737
972
|
onDoubleClick: handleDoubleClick,
|
|
738
|
-
className: "flex items-center gap-2 px-3 py-2 bg-
|
|
973
|
+
className: "flex items-center gap-2 px-3 py-2 bg-blue-500 text-white rounded-full shadow-lg hover:bg-blue-600 transition-colors",
|
|
739
974
|
style: { cursor: draggable ? "grab" : "pointer" },
|
|
740
975
|
children: [
|
|
741
976
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(BugBearIcon, { size: 24 }),
|
|
742
977
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: "BugBear" }),
|
|
743
|
-
pendingCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "bg-white text-
|
|
978
|
+
pendingCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "bg-white text-blue-400 text-xs font-bold px-1.5 py-0.5 rounded-full", children: pendingCount })
|
|
744
979
|
]
|
|
745
980
|
}
|
|
746
981
|
),
|
|
747
|
-
!collapsed && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "w-80 bg-
|
|
982
|
+
!collapsed && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "w-80 bg-zinc-900 rounded-xl shadow-2xl border border-zinc-800 overflow-hidden", children: [
|
|
748
983
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
749
984
|
"div",
|
|
750
985
|
{
|
|
751
986
|
"data-drag-handle": true,
|
|
752
987
|
onDoubleClick: handleDoubleClick,
|
|
753
|
-
className: "bg-
|
|
988
|
+
className: "bg-zinc-950 text-white px-4 py-3 flex items-center justify-between border-b border-zinc-800",
|
|
754
989
|
style: { cursor: draggable ? isDragging ? "grabbing" : "grab" : "default" },
|
|
755
990
|
children: [
|
|
756
991
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
@@ -758,13 +993,13 @@ function BugBearPanel({
|
|
|
758
993
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
759
994
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("h3", { className: "font-semibold text-sm flex items-center gap-2", children: [
|
|
760
995
|
"BugBear",
|
|
761
|
-
draggable && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-
|
|
996
|
+
draggable && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-zinc-500 text-xs", title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
|
|
762
997
|
] }),
|
|
763
998
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
764
999
|
"button",
|
|
765
1000
|
{
|
|
766
1001
|
onClick: handleOpenProfile,
|
|
767
|
-
className: "text-
|
|
1002
|
+
className: "text-zinc-400 text-xs flex items-center gap-1 hover:text-white transition-colors",
|
|
768
1003
|
children: [
|
|
769
1004
|
testerInfo?.name,
|
|
770
1005
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-[10px]", children: "\u270E" })
|
|
@@ -777,23 +1012,33 @@ function BugBearPanel({
|
|
|
777
1012
|
"button",
|
|
778
1013
|
{
|
|
779
1014
|
onClick: () => setCollapsed(true),
|
|
780
|
-
className: "p-1 hover:bg-
|
|
1015
|
+
className: "p-1 hover:bg-zinc-800 rounded",
|
|
781
1016
|
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) })
|
|
782
1017
|
}
|
|
783
1018
|
)
|
|
784
1019
|
]
|
|
785
1020
|
}
|
|
786
1021
|
),
|
|
787
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex
|
|
1022
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex border-b border-zinc-800 bg-zinc-900", children: [
|
|
788
1023
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
789
1024
|
"button",
|
|
790
1025
|
{
|
|
791
1026
|
onClick: () => setActiveTab("tests"),
|
|
792
|
-
className: `flex-1 py-
|
|
1027
|
+
className: `flex-1 py-3 text-sm font-medium transition-all flex items-center justify-center gap-1.5 border-b-2 ${activeTab === "tests" ? "border-blue-500 text-blue-400" : "border-transparent text-zinc-500 hover:text-zinc-300"}`,
|
|
793
1028
|
children: [
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
1029
|
+
"Tests ",
|
|
1030
|
+
pendingCount > 0 && `(${pendingCount})`
|
|
1031
|
+
]
|
|
1032
|
+
}
|
|
1033
|
+
),
|
|
1034
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1035
|
+
"button",
|
|
1036
|
+
{
|
|
1037
|
+
onClick: () => setActiveTab("messages"),
|
|
1038
|
+
className: `flex-1 py-3 text-sm font-medium transition-all flex items-center justify-center gap-1.5 relative border-b-2 ${activeTab === "messages" ? "border-blue-500 text-blue-400" : "border-transparent text-zinc-500 hover:text-zinc-300"}`,
|
|
1039
|
+
children: [
|
|
1040
|
+
"Messages",
|
|
1041
|
+
unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "absolute top-1.5 ml-16 min-w-[18px] h-[18px] px-1 bg-blue-500 rounded-full text-[10px] text-white font-bold flex items-center justify-center", children: unreadCount })
|
|
797
1042
|
]
|
|
798
1043
|
}
|
|
799
1044
|
),
|
|
@@ -801,100 +1046,165 @@ function BugBearPanel({
|
|
|
801
1046
|
"button",
|
|
802
1047
|
{
|
|
803
1048
|
onClick: () => setActiveTab("session"),
|
|
804
|
-
className: `flex-1 py-
|
|
1049
|
+
className: `flex-1 py-3 text-sm font-medium transition-all flex items-center justify-center gap-1.5 relative border-b-2 ${activeTab === "session" ? "border-blue-500 text-blue-400" : "border-transparent text-zinc-500 hover:text-zinc-300"}`,
|
|
805
1050
|
children: [
|
|
806
|
-
|
|
807
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", {
|
|
808
|
-
activeSession && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "absolute -top-1 -right-1 w-3 h-3 bg-green-500 rounded-full border-2 border-white animate-pulse" })
|
|
1051
|
+
"Explore",
|
|
1052
|
+
activeSession && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "absolute top-2 ml-14 w-2 h-2 bg-green-500 rounded-full animate-pulse" })
|
|
809
1053
|
]
|
|
810
1054
|
}
|
|
1055
|
+
),
|
|
1056
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1057
|
+
"button",
|
|
1058
|
+
{
|
|
1059
|
+
onClick: () => setActiveTab("report"),
|
|
1060
|
+
className: `flex-1 py-3 text-sm font-medium transition-all flex items-center justify-center gap-1.5 border-b-2 ${activeTab === "report" ? "border-blue-500 text-blue-400" : "border-transparent text-zinc-500 hover:text-zinc-300"}`,
|
|
1061
|
+
children: "Report"
|
|
1062
|
+
}
|
|
811
1063
|
)
|
|
812
1064
|
] }),
|
|
813
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex justify-center py-1.5 border-b border-gray-200 bg-white", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
814
|
-
"button",
|
|
815
|
-
{
|
|
816
|
-
onClick: () => setActiveTab("report"),
|
|
817
|
-
className: `px-4 py-1 text-xs font-medium transition-colors rounded-full ${activeTab === "report" ? "bg-red-50 text-red-600 border border-red-200" : "text-gray-500 hover:text-gray-700 hover:bg-gray-50"}`,
|
|
818
|
-
children: "\u{1F41B} Report Bug / Feedback"
|
|
819
|
-
}
|
|
820
|
-
) }),
|
|
821
1065
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "p-4 max-h-96 overflow-y-auto", children: [
|
|
822
1066
|
activeTab === "tests" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: assignments.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-8", children: [
|
|
823
1067
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u2705" }),
|
|
824
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
825
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
1068
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-400 mt-2 font-medium", children: "All caught up!" }),
|
|
1069
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-sm", children: "No tests assigned" })
|
|
826
1070
|
] }) : testView === "list" ? (
|
|
827
|
-
/* List View - Show
|
|
828
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "space-y-
|
|
829
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
"
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
1071
|
+
/* List View - Show tests grouped by folder */
|
|
1072
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "space-y-3", children: [
|
|
1073
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mb-2 px-1", children: [
|
|
1074
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs font-medium text-zinc-500", children: [
|
|
1075
|
+
assignments.length,
|
|
1076
|
+
" test",
|
|
1077
|
+
assignments.length !== 1 ? "s" : "",
|
|
1078
|
+
" assigned"
|
|
1079
|
+
] }),
|
|
1080
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 text-xs", children: [
|
|
1081
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-green-400", children: [
|
|
1082
|
+
"\u2705 ",
|
|
1083
|
+
assignments.filter((a) => a.status === "passed").length
|
|
1084
|
+
] }),
|
|
1085
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-red-400", children: [
|
|
1086
|
+
"\u274C ",
|
|
1087
|
+
assignments.filter((a) => a.status === "failed").length
|
|
1088
|
+
] }),
|
|
1089
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-zinc-500", children: [
|
|
1090
|
+
"\u23F3 ",
|
|
1091
|
+
assignments.filter((a) => a.status === "pending" || a.status === "in_progress").length
|
|
1092
|
+
] })
|
|
1093
|
+
] })
|
|
1094
|
+
] }),
|
|
1095
|
+
groupedAssignments.map((folder) => {
|
|
1096
|
+
const groupId = folder.group?.id || "ungrouped";
|
|
1097
|
+
const isCollapsed = collapsedFolders.has(groupId);
|
|
1098
|
+
const completedCount = folder.stats.passed + folder.stats.failed + folder.stats.skipped;
|
|
1099
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "border border-zinc-700 rounded-lg overflow-hidden", children: [
|
|
1100
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1101
|
+
"button",
|
|
1102
|
+
{
|
|
1103
|
+
onClick: () => toggleFolderCollapse(groupId),
|
|
1104
|
+
className: "w-full flex items-center justify-between p-2.5 bg-zinc-800 hover:bg-zinc-700 transition-colors",
|
|
1105
|
+
children: [
|
|
1106
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
1107
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-sm", children: isCollapsed ? "\u{1F4C1}" : "\u{1F4C2}" }),
|
|
1108
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium text-sm text-zinc-100", children: folder.group?.name || "Other Tests" }),
|
|
1109
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs text-zinc-500", children: [
|
|
1110
|
+
"(",
|
|
1111
|
+
completedCount,
|
|
1112
|
+
"/",
|
|
1113
|
+
folder.stats.total,
|
|
1114
|
+
")"
|
|
1115
|
+
] })
|
|
1116
|
+
] }),
|
|
1117
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
1118
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-16 h-1.5 bg-zinc-700 rounded-full overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1119
|
+
"div",
|
|
1120
|
+
{
|
|
1121
|
+
className: "h-full bg-green-500 transition-all",
|
|
1122
|
+
style: { width: `${completedCount / folder.stats.total * 100}%` }
|
|
1123
|
+
}
|
|
1124
|
+
) }),
|
|
1125
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-zinc-500 text-xs", children: isCollapsed ? "\u25B6" : "\u25BC" })
|
|
1126
|
+
] })
|
|
1127
|
+
]
|
|
1128
|
+
}
|
|
1129
|
+
),
|
|
1130
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "divide-y divide-zinc-800", children: folder.assignments.map((assignment) => {
|
|
1131
|
+
const statusBadge = getStatusBadge(assignment.status);
|
|
1132
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1133
|
+
"button",
|
|
1134
|
+
{
|
|
1135
|
+
onClick: () => {
|
|
1136
|
+
setSelectedTestId(assignment.id);
|
|
1137
|
+
setTestView("detail");
|
|
1138
|
+
setShowSteps(false);
|
|
1139
|
+
},
|
|
1140
|
+
className: `w-full text-left p-3 transition-colors ${assignment.id === currentAssignment?.id ? "bg-blue-950/30" : "bg-zinc-900 hover:bg-zinc-800"}`,
|
|
1141
|
+
children: [
|
|
1142
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-start justify-between mb-1", children: [
|
|
1143
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
1144
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs font-mono text-zinc-500", children: assignment.testCase.testKey }),
|
|
1145
|
+
assignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs px-1.5 py-0.5 rounded bg-green-900/30 text-green-400 font-medium", children: "\u{1F527} Verify" })
|
|
1146
|
+
] }),
|
|
1147
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-1.5", children: [
|
|
1148
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${statusBadge.className}`, children: [
|
|
1149
|
+
statusBadge.icon,
|
|
1150
|
+
" ",
|
|
1151
|
+
statusBadge.label
|
|
1152
|
+
] }),
|
|
1153
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${assignment.testCase.priority === "P0" ? "bg-red-900/30 text-red-400" : assignment.testCase.priority === "P1" ? "bg-orange-900/30 text-orange-400" : "bg-zinc-700 text-zinc-400"}`, children: assignment.testCase.priority })
|
|
1154
|
+
] })
|
|
1155
|
+
] }),
|
|
1156
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h4", { className: "font-medium text-zinc-100 text-sm line-clamp-2", children: assignment.testCase.title }),
|
|
1157
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 mt-1 text-xs text-zinc-500", children: [
|
|
1158
|
+
assignment.testCase.track && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1159
|
+
"span",
|
|
1160
|
+
{
|
|
1161
|
+
className: "px-1 py-0.5 rounded text-white",
|
|
1162
|
+
style: { backgroundColor: assignment.testCase.track.color },
|
|
1163
|
+
children: templateInfo[assignment.testCase.track.testTemplate || "steps"].icon
|
|
1164
|
+
}
|
|
1165
|
+
),
|
|
1166
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
|
|
1167
|
+
assignment.testCase.steps.length,
|
|
1168
|
+
" ",
|
|
1169
|
+
assignment.testCase.track?.testTemplate === "checklist" ? "items" : assignment.testCase.track?.testTemplate === "rubric" ? "criteria" : "steps"
|
|
1170
|
+
] }),
|
|
1171
|
+
assignment.id === currentAssignment?.id && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-blue-400 font-medium", children: "\u2022 Current" })
|
|
1172
|
+
] })
|
|
1173
|
+
]
|
|
1174
|
+
},
|
|
1175
|
+
assignment.id
|
|
1176
|
+
);
|
|
1177
|
+
}) })
|
|
1178
|
+
] }, groupId);
|
|
1179
|
+
})
|
|
870
1180
|
] })
|
|
871
1181
|
) : showFeedbackPrompt && displayedAssignment ? (
|
|
872
1182
|
/* Feedback prompt after completing a test */
|
|
873
1183
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "p-3", children: [
|
|
874
1184
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center mb-4", children: [
|
|
875
1185
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-3xl", children: pendingFeedbackStatus === "passed" ? "\u2713" : "\u2717" }),
|
|
876
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `font-semibold mt-1 ${pendingFeedbackStatus === "passed" ? "text-green-
|
|
1186
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `font-semibold mt-1 ${pendingFeedbackStatus === "passed" ? "text-green-400" : "text-red-400"}`, children: pendingFeedbackStatus === "passed" ? "Test Passed!" : "Test Failed" })
|
|
877
1187
|
] }),
|
|
878
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-
|
|
879
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
880
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
1188
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-blue-950/30 border border-blue-900 rounded-lg p-3 mb-4", children: [
|
|
1189
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-blue-300 text-sm font-medium mb-1", children: "Help us improve this test" }),
|
|
1190
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-blue-400 text-xs", children: "Your feedback shapes better tests for everyone." })
|
|
881
1191
|
] }),
|
|
882
1192
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
883
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1193
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-400 mb-2", children: "How was this test?" }),
|
|
884
1194
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center gap-1 justify-center", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
885
1195
|
"button",
|
|
886
1196
|
{
|
|
887
1197
|
type: "button",
|
|
888
1198
|
onClick: () => setFeedbackRating(star),
|
|
889
|
-
className: `text-2xl transition-colors ${star <= feedbackRating ? "text-yellow-400" : "text-
|
|
1199
|
+
className: `text-2xl transition-colors ${star <= feedbackRating ? "text-yellow-400" : "text-zinc-600"} hover:text-yellow-400`,
|
|
890
1200
|
children: "\u2605"
|
|
891
1201
|
},
|
|
892
1202
|
star
|
|
893
1203
|
)) }),
|
|
894
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-center text-xs text-
|
|
1204
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-center text-xs text-zinc-500 mt-1", children: feedbackRating === 1 ? "Needs work" : feedbackRating === 2 ? "Could be better" : feedbackRating === 3 ? "Okay" : feedbackRating === 4 ? "Good" : "Great!" })
|
|
895
1205
|
] }),
|
|
896
1206
|
feedbackRating < 4 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
897
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1207
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-400 mb-2", children: "What could be improved?" }),
|
|
898
1208
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "grid grid-cols-2 gap-2", children: [
|
|
899
1209
|
{ key: "stepsUnclear", label: "Steps unclear" },
|
|
900
1210
|
{ key: "expectedResultUnclear", label: "Expected result unclear" },
|
|
@@ -905,21 +1215,21 @@ function BugBearPanel({
|
|
|
905
1215
|
{
|
|
906
1216
|
type: "button",
|
|
907
1217
|
onClick: () => setFeedbackFlags((prev) => ({ ...prev, [key]: !prev[key] })),
|
|
908
|
-
className: `px-2 py-1.5 rounded text-xs font-medium border transition-colors ${feedbackFlags[key] ? "bg-
|
|
1218
|
+
className: `px-2 py-1.5 rounded text-xs font-medium border transition-colors ${feedbackFlags[key] ? "bg-blue-900/50 border-blue-700 text-blue-300" : "bg-zinc-800 border-zinc-700 text-zinc-400 hover:border-blue-800"}`,
|
|
909
1219
|
children: label
|
|
910
1220
|
},
|
|
911
1221
|
key
|
|
912
1222
|
)) })
|
|
913
1223
|
] }),
|
|
914
1224
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
915
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1225
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-400 mb-1", children: "Suggestions? (optional)" }),
|
|
916
1226
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
917
1227
|
"textarea",
|
|
918
1228
|
{
|
|
919
1229
|
value: feedbackNote,
|
|
920
1230
|
onChange: (e) => setFeedbackNote(e.target.value),
|
|
921
1231
|
placeholder: "How could this test be improved?",
|
|
922
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
1232
|
+
className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-700 rounded-lg resize-none focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent placeholder:text-zinc-500",
|
|
923
1233
|
rows: 2
|
|
924
1234
|
}
|
|
925
1235
|
)
|
|
@@ -930,7 +1240,7 @@ function BugBearPanel({
|
|
|
930
1240
|
{
|
|
931
1241
|
onClick: handleSkipFeedback,
|
|
932
1242
|
disabled: submitting,
|
|
933
|
-
className: "flex-1 px-3 py-2 text-sm font-medium text-
|
|
1243
|
+
className: "flex-1 px-3 py-2 text-sm font-medium text-zinc-400 bg-zinc-700 rounded-lg hover:bg-zinc-700 transition-colors disabled:opacity-50",
|
|
934
1244
|
children: "Skip"
|
|
935
1245
|
}
|
|
936
1246
|
),
|
|
@@ -939,7 +1249,7 @@ function BugBearPanel({
|
|
|
939
1249
|
{
|
|
940
1250
|
onClick: () => handleSubmitFeedback(false),
|
|
941
1251
|
disabled: submitting,
|
|
942
|
-
className: "flex-1 px-3 py-2 text-sm font-medium text-white bg-
|
|
1252
|
+
className: "flex-1 px-3 py-2 text-sm font-medium text-white bg-blue-500 rounded-lg hover:bg-blue-600 transition-colors disabled:opacity-50",
|
|
943
1253
|
children: submitting ? "Submitting..." : "Submit Feedback"
|
|
944
1254
|
}
|
|
945
1255
|
)
|
|
@@ -949,8 +1259,8 @@ function BugBearPanel({
|
|
|
949
1259
|
/* Success state after passing */
|
|
950
1260
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-8", children: [
|
|
951
1261
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-5xl", children: "\u2713" }),
|
|
952
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-green-
|
|
953
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
1262
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-green-400 mt-3 font-semibold text-lg", children: "Passed!" }),
|
|
1263
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-sm mt-1", children: "Loading next test..." })
|
|
954
1264
|
] })
|
|
955
1265
|
) : displayedAssignment ? (
|
|
956
1266
|
/* Detail View - Show single test */
|
|
@@ -962,7 +1272,7 @@ function BugBearPanel({
|
|
|
962
1272
|
setTestView("list");
|
|
963
1273
|
setSelectedTestId(null);
|
|
964
1274
|
},
|
|
965
|
-
className: "flex items-center gap-1 text-xs text-
|
|
1275
|
+
className: "flex items-center gap-1 text-xs text-blue-400 font-medium hover:text-blue-300 mb-2",
|
|
966
1276
|
children: [
|
|
967
1277
|
"\u2190 All Tests (",
|
|
968
1278
|
assignments.length,
|
|
@@ -970,9 +1280,53 @@ function BugBearPanel({
|
|
|
970
1280
|
]
|
|
971
1281
|
}
|
|
972
1282
|
),
|
|
973
|
-
|
|
1283
|
+
(() => {
|
|
1284
|
+
const currentGroup = displayedAssignment.testCase.group;
|
|
1285
|
+
const groupAssignments = currentGroup ? assignments.filter((a) => a.testCase.group?.id === currentGroup.id) : assignments;
|
|
1286
|
+
const completed = groupAssignments.filter(
|
|
1287
|
+
(a) => a.status === "passed" || a.status === "failed" || a.status === "skipped"
|
|
1288
|
+
).length;
|
|
1289
|
+
const total = groupAssignments.length;
|
|
1290
|
+
const progressPercent = total > 0 ? completed / total * 100 : 0;
|
|
1291
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3 p-2 bg-blue-950/30 rounded-lg", children: [
|
|
1292
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mb-1.5", children: [
|
|
1293
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs font-medium text-blue-300", children: currentGroup ? `\u{1F4C1} ${currentGroup.name}` : "\u{1F4CB} All Tests" }),
|
|
1294
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs text-blue-400", children: [
|
|
1295
|
+
completed,
|
|
1296
|
+
"/",
|
|
1297
|
+
total,
|
|
1298
|
+
" complete"
|
|
1299
|
+
] })
|
|
1300
|
+
] }),
|
|
1301
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-full h-2 bg-zinc-700 rounded-full overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1302
|
+
"div",
|
|
1303
|
+
{
|
|
1304
|
+
className: "h-full bg-blue-500 transition-all duration-300",
|
|
1305
|
+
style: { width: `${progressPercent}%` }
|
|
1306
|
+
}
|
|
1307
|
+
) }),
|
|
1308
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex justify-between mt-1 text-[10px] text-blue-400", children: [
|
|
1309
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
|
|
1310
|
+
"\u2705 ",
|
|
1311
|
+
groupAssignments.filter((a) => a.status === "passed").length,
|
|
1312
|
+
" passed"
|
|
1313
|
+
] }),
|
|
1314
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
|
|
1315
|
+
"\u274C ",
|
|
1316
|
+
groupAssignments.filter((a) => a.status === "failed").length,
|
|
1317
|
+
" failed"
|
|
1318
|
+
] }),
|
|
1319
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
|
|
1320
|
+
"\u23ED\uFE0F ",
|
|
1321
|
+
groupAssignments.filter((a) => a.status === "skipped").length,
|
|
1322
|
+
" skipped"
|
|
1323
|
+
] })
|
|
1324
|
+
] })
|
|
1325
|
+
] });
|
|
1326
|
+
})(),
|
|
1327
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 rounded-lg p-3 mb-3", children: [
|
|
974
1328
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-start justify-between mb-2", children: [
|
|
975
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs font-mono text-
|
|
1329
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs font-mono text-zinc-500", children: displayedAssignment.testCase.testKey }),
|
|
976
1330
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-1", children: [
|
|
977
1331
|
displayedAssignment.testCase.track && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
978
1332
|
"span",
|
|
@@ -982,11 +1336,11 @@ function BugBearPanel({
|
|
|
982
1336
|
children: templateInfo[displayedAssignment.testCase.track.testTemplate || "steps"].icon
|
|
983
1337
|
}
|
|
984
1338
|
),
|
|
985
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${displayedAssignment.testCase.priority === "P0" ? "bg-red-
|
|
1339
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${displayedAssignment.testCase.priority === "P0" ? "bg-red-900/30 text-red-400" : displayedAssignment.testCase.priority === "P1" ? "bg-orange-900/30 text-orange-400" : "bg-zinc-700 text-zinc-400"}`, children: displayedAssignment.testCase.priority })
|
|
986
1340
|
] })
|
|
987
1341
|
] }),
|
|
988
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h4", { className: "font-medium text-
|
|
989
|
-
displayedAssignment.status === "in_progress" && displayedAssignment.startedAt && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-1.5 mb-2 text-xs text-green-
|
|
1342
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h4", { className: "font-medium text-zinc-100 text-sm mb-1", children: displayedAssignment.testCase.title }),
|
|
1343
|
+
displayedAssignment.status === "in_progress" && displayedAssignment.startedAt && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-1.5 mb-2 text-xs text-green-400 bg-green-900/20 px-2 py-1 rounded", children: [
|
|
990
1344
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "relative flex h-2 w-2", children: [
|
|
991
1345
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75" }),
|
|
992
1346
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "relative inline-flex rounded-full h-2 w-2 bg-green-500" })
|
|
@@ -994,12 +1348,12 @@ function BugBearPanel({
|
|
|
994
1348
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: "Testing" }),
|
|
995
1349
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-mono", children: formatElapsedTime(assignmentElapsedTime) })
|
|
996
1350
|
] }),
|
|
997
|
-
displayedAssignment.testCase.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
1351
|
+
displayedAssignment.testCase.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-xs mb-2", children: displayedAssignment.testCase.description }),
|
|
998
1352
|
displayedAssignment.testCase.targetRoute && onNavigate && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
999
1353
|
"button",
|
|
1000
1354
|
{
|
|
1001
1355
|
onClick: () => onNavigate(displayedAssignment.testCase.targetRoute),
|
|
1002
|
-
className: "w-full mb-2 py-1.5 px-3 bg-blue-
|
|
1356
|
+
className: "w-full mb-2 py-1.5 px-3 bg-blue-900/20 text-blue-300 border border-blue-800 rounded-lg text-xs font-medium hover:bg-blue-900/30 transition-colors flex items-center justify-center gap-1",
|
|
1003
1357
|
children: [
|
|
1004
1358
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "Go to test location" }),
|
|
1005
1359
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "\u2192" })
|
|
@@ -1022,7 +1376,7 @@ function BugBearPanel({
|
|
|
1022
1376
|
children: [
|
|
1023
1377
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: info.icon }),
|
|
1024
1378
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: info.name }),
|
|
1025
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-
|
|
1379
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-zinc-500", children: [
|
|
1026
1380
|
"\u2022 ",
|
|
1027
1381
|
info.action
|
|
1028
1382
|
] })
|
|
@@ -1033,7 +1387,7 @@ function BugBearPanel({
|
|
|
1033
1387
|
"button",
|
|
1034
1388
|
{
|
|
1035
1389
|
onClick: () => setShowSteps(!showSteps),
|
|
1036
|
-
className: "text-
|
|
1390
|
+
className: "text-blue-400 text-xs font-medium hover:text-blue-300 flex items-center gap-1",
|
|
1037
1391
|
children: [
|
|
1038
1392
|
showSteps ? "\u25BC" : "\u25B6",
|
|
1039
1393
|
" ",
|
|
@@ -1042,10 +1396,10 @@ function BugBearPanel({
|
|
|
1042
1396
|
}
|
|
1043
1397
|
),
|
|
1044
1398
|
showSteps && template === "steps" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "mt-2 space-y-2", children: steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex gap-2 text-xs", children: [
|
|
1045
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "w-5 h-5 rounded-full bg-
|
|
1399
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "w-5 h-5 rounded-full bg-blue-900/50 text-blue-300 flex items-center justify-center flex-shrink-0 font-medium", children: step.stepNumber }),
|
|
1046
1400
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1047
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
1048
|
-
step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-
|
|
1401
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-300", children: step.action }),
|
|
1402
|
+
step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-zinc-500 mt-0.5", children: [
|
|
1049
1403
|
"\u2192 ",
|
|
1050
1404
|
step.expectedResult
|
|
1051
1405
|
] })
|
|
@@ -1064,39 +1418,39 @@ function BugBearPanel({
|
|
|
1064
1418
|
}
|
|
1065
1419
|
return newResults;
|
|
1066
1420
|
}),
|
|
1067
|
-
className: `w-full flex items-center gap-2 text-xs p-2 rounded border transition-colors text-left ${criteriaResults[idx] === true ? "bg-green-
|
|
1421
|
+
className: `w-full flex items-center gap-2 text-xs p-2 rounded border transition-colors text-left ${criteriaResults[idx] === true ? "bg-green-900/20 border-green-700" : "bg-zinc-900 border-zinc-700 hover:bg-zinc-800"}`,
|
|
1068
1422
|
children: [
|
|
1069
1423
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `w-5 h-5 rounded border-2 flex items-center justify-center ${criteriaResults[idx] === true ? "bg-green-500 border-green-500 text-white" : "border-cyan-400 text-cyan-600"}`, children: criteriaResults[idx] === true ? "\u2713" : "" }),
|
|
1070
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `flex-1 ${criteriaResults[idx] === true ? "text-green-
|
|
1424
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `flex-1 ${criteriaResults[idx] === true ? "text-green-400" : "text-zinc-300"}`, children: step.action })
|
|
1071
1425
|
]
|
|
1072
1426
|
},
|
|
1073
1427
|
idx
|
|
1074
1428
|
)),
|
|
1075
1429
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mt-2", children: [
|
|
1076
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-
|
|
1430
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500", children: "Tap to check off each item." }),
|
|
1077
1431
|
Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1078
1432
|
"button",
|
|
1079
1433
|
{
|
|
1080
1434
|
onClick: () => setCriteriaResults({}),
|
|
1081
|
-
className: "text-xs text-
|
|
1435
|
+
className: "text-xs text-zinc-500 hover:text-red-500 transition-colors",
|
|
1082
1436
|
children: "\u21BA Reset"
|
|
1083
1437
|
}
|
|
1084
1438
|
)
|
|
1085
1439
|
] })
|
|
1086
1440
|
] }),
|
|
1087
1441
|
showSteps && template === "rubric" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mt-2 space-y-2", children: [
|
|
1088
|
-
steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-
|
|
1442
|
+
steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 p-2 rounded border border-zinc-700", children: [
|
|
1089
1443
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 text-xs mb-1", children: [
|
|
1090
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "w-5 h-5 rounded bg-
|
|
1091
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
1444
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "w-5 h-5 rounded bg-blue-900/50 text-blue-300 flex items-center justify-center font-medium", children: idx + 1 }),
|
|
1445
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-100 font-medium flex-1", children: step.action })
|
|
1092
1446
|
] }),
|
|
1093
|
-
step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-
|
|
1447
|
+
step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500 ml-7 mb-2", children: step.expectedResult }),
|
|
1094
1448
|
rubricMode === "pass_fail" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex gap-2 ml-7", children: [
|
|
1095
1449
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1096
1450
|
"button",
|
|
1097
1451
|
{
|
|
1098
1452
|
onClick: () => setCriteriaResults((prev) => ({ ...prev, [idx]: true })),
|
|
1099
|
-
className: `flex-1 py-1 px-2 rounded text-xs font-medium transition-colors ${criteriaResults[idx] === true ? "bg-green-500 text-white" : "bg-
|
|
1453
|
+
className: `flex-1 py-1 px-2 rounded text-xs font-medium transition-colors ${criteriaResults[idx] === true ? "bg-green-500 text-white" : "bg-zinc-700 text-zinc-400 hover:bg-green-900/30"}`,
|
|
1100
1454
|
children: "\u2713 Pass"
|
|
1101
1455
|
}
|
|
1102
1456
|
),
|
|
@@ -1104,7 +1458,7 @@ function BugBearPanel({
|
|
|
1104
1458
|
"button",
|
|
1105
1459
|
{
|
|
1106
1460
|
onClick: () => setCriteriaResults((prev) => ({ ...prev, [idx]: false })),
|
|
1107
|
-
className: `flex-1 py-1 px-2 rounded text-xs font-medium transition-colors ${criteriaResults[idx] === false ? "bg-red-500 text-white" : "bg-
|
|
1461
|
+
className: `flex-1 py-1 px-2 rounded text-xs font-medium transition-colors ${criteriaResults[idx] === false ? "bg-red-500 text-white" : "bg-zinc-700 text-zinc-400 hover:bg-red-900/30"}`,
|
|
1108
1462
|
children: "\u2717 Fail"
|
|
1109
1463
|
}
|
|
1110
1464
|
)
|
|
@@ -1113,28 +1467,28 @@ function BugBearPanel({
|
|
|
1113
1467
|
"button",
|
|
1114
1468
|
{
|
|
1115
1469
|
onClick: () => setCriteriaResults((prev) => ({ ...prev, [idx]: n })),
|
|
1116
|
-
className: `w-8 h-8 rounded font-medium text-sm transition-colors ${criteriaResults[idx] === n ? "bg-
|
|
1470
|
+
className: `w-8 h-8 rounded font-medium text-sm transition-colors ${criteriaResults[idx] === n ? "bg-blue-500 text-white" : "bg-zinc-700 text-zinc-400 hover:bg-blue-900/50"}`,
|
|
1117
1471
|
children: n
|
|
1118
1472
|
},
|
|
1119
1473
|
n
|
|
1120
1474
|
)) })
|
|
1121
1475
|
] }, idx)),
|
|
1122
1476
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mt-2", children: [
|
|
1123
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-
|
|
1477
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500", children: rubricMode === "rating" ? "Rate 1-5 for each criterion." : "Mark each criterion as Pass or Fail." }),
|
|
1124
1478
|
Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1125
1479
|
"button",
|
|
1126
1480
|
{
|
|
1127
1481
|
onClick: () => setCriteriaResults({}),
|
|
1128
|
-
className: "text-xs text-
|
|
1482
|
+
className: "text-xs text-zinc-500 hover:text-red-500 transition-colors",
|
|
1129
1483
|
children: "\u21BA Reset"
|
|
1130
1484
|
}
|
|
1131
1485
|
)
|
|
1132
1486
|
] })
|
|
1133
1487
|
] }),
|
|
1134
|
-
showSteps && template === "freeform" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mt-2 p-2 bg-amber-
|
|
1135
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-amber-
|
|
1136
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-amber-
|
|
1137
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("ul", { className: "text-amber-
|
|
1488
|
+
showSteps && template === "freeform" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mt-2 p-2 bg-amber-900/20 rounded border border-amber-800 text-xs", children: [
|
|
1489
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-amber-300 font-medium mb-1", children: "\u{1F4AD} Open Observation" }),
|
|
1490
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-amber-400", children: "Review the area described above and note:" }),
|
|
1491
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("ul", { className: "text-amber-400 mt-1 ml-4 list-disc", children: [
|
|
1138
1492
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: "What works well" }),
|
|
1139
1493
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: "Issues or concerns" }),
|
|
1140
1494
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: "Suggestions" })
|
|
@@ -1142,7 +1496,7 @@ function BugBearPanel({
|
|
|
1142
1496
|
] })
|
|
1143
1497
|
] });
|
|
1144
1498
|
})(),
|
|
1145
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mt-3 p-2 bg-green-
|
|
1499
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mt-3 p-2 bg-green-900/20 rounded text-xs text-green-400", children: [
|
|
1146
1500
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: displayedAssignment.testCase.track?.testTemplate === "checklist" ? "Pass criteria:" : displayedAssignment.testCase.track?.testTemplate === "rubric" ? "Target score:" : "Expected:" }),
|
|
1147
1501
|
" ",
|
|
1148
1502
|
displayedAssignment.testCase.expectedResult
|
|
@@ -1153,69 +1507,279 @@ function BugBearPanel({
|
|
|
1153
1507
|
"button",
|
|
1154
1508
|
{
|
|
1155
1509
|
onClick: handleFail,
|
|
1156
|
-
disabled: submitting,
|
|
1157
|
-
className: "flex-1 py-2 px-3 bg-red-
|
|
1510
|
+
disabled: submitting || skipping,
|
|
1511
|
+
className: "flex-1 py-2 px-3 bg-red-900/30 text-red-400 rounded-lg font-medium text-sm hover:bg-red-800/30 disabled:opacity-50 transition-colors",
|
|
1158
1512
|
children: "\u2717 Fail"
|
|
1159
1513
|
}
|
|
1160
1514
|
),
|
|
1515
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1516
|
+
"button",
|
|
1517
|
+
{
|
|
1518
|
+
onClick: handleOpenSkipModal,
|
|
1519
|
+
disabled: submitting || skipping,
|
|
1520
|
+
className: "py-2 px-3 bg-yellow-900/30 text-yellow-400 rounded-lg font-medium text-sm hover:bg-yellow-800/30 disabled:opacity-50 transition-colors",
|
|
1521
|
+
children: "\u23ED\uFE0F Skip"
|
|
1522
|
+
}
|
|
1523
|
+
),
|
|
1161
1524
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1162
1525
|
"button",
|
|
1163
1526
|
{
|
|
1164
1527
|
onClick: handlePass,
|
|
1165
|
-
disabled: submitting,
|
|
1528
|
+
disabled: submitting || skipping,
|
|
1166
1529
|
className: "flex-1 py-2 px-3 bg-green-600 text-white rounded-lg font-medium text-sm hover:bg-green-700 disabled:opacity-50 transition-colors",
|
|
1167
1530
|
children: submitting ? "..." : "\u2713 Pass"
|
|
1168
1531
|
}
|
|
1169
1532
|
)
|
|
1170
|
-
] })
|
|
1533
|
+
] }),
|
|
1534
|
+
showSkipModal && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", onClick: () => setShowSkipModal(false), children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 rounded-xl p-4 w-72 shadow-xl border border-zinc-700", onClick: (e) => e.stopPropagation(), children: [
|
|
1535
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100 mb-3", children: "Skip Test" }),
|
|
1536
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500 mb-3", children: "Please select a reason for skipping this test." }),
|
|
1537
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-2 mb-4", children: skipReasonOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1538
|
+
"button",
|
|
1539
|
+
{
|
|
1540
|
+
onClick: () => setSelectedSkipReason(option.value),
|
|
1541
|
+
className: `w-full text-left p-2.5 rounded-lg border transition-colors ${selectedSkipReason === option.value ? "bg-yellow-900/20 border-yellow-700 text-yellow-300" : "bg-zinc-800 border-zinc-700 text-zinc-300 hover:border-yellow-800"}`,
|
|
1542
|
+
children: [
|
|
1543
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "font-medium text-sm", children: option.label }),
|
|
1544
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "text-xs text-zinc-500", children: option.description })
|
|
1545
|
+
]
|
|
1546
|
+
},
|
|
1547
|
+
option.value
|
|
1548
|
+
)) }),
|
|
1549
|
+
selectedSkipReason === "other" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
1550
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-400 mb-1", children: "Notes (required)" }),
|
|
1551
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1552
|
+
"textarea",
|
|
1553
|
+
{
|
|
1554
|
+
value: skipNotes,
|
|
1555
|
+
onChange: (e) => setSkipNotes(e.target.value),
|
|
1556
|
+
placeholder: "Please explain why you're skipping...",
|
|
1557
|
+
className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-700 rounded-lg resize-none focus:outline-none focus:ring-2 focus:ring-yellow-500 focus:border-transparent placeholder:text-zinc-500",
|
|
1558
|
+
rows: 2
|
|
1559
|
+
}
|
|
1560
|
+
)
|
|
1561
|
+
] }),
|
|
1562
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex gap-2", children: [
|
|
1563
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1564
|
+
"button",
|
|
1565
|
+
{
|
|
1566
|
+
onClick: () => setShowSkipModal(false),
|
|
1567
|
+
className: "flex-1 py-2 px-3 text-sm font-medium text-zinc-400 bg-zinc-700 rounded-lg hover:bg-zinc-700 transition-colors",
|
|
1568
|
+
children: "Cancel"
|
|
1569
|
+
}
|
|
1570
|
+
),
|
|
1571
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1572
|
+
"button",
|
|
1573
|
+
{
|
|
1574
|
+
onClick: handleSkip,
|
|
1575
|
+
disabled: !selectedSkipReason || selectedSkipReason === "other" && !skipNotes.trim() || skipping,
|
|
1576
|
+
className: "flex-1 py-2 px-3 text-sm font-medium text-white bg-yellow-500 rounded-lg hover:bg-yellow-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
|
|
1577
|
+
children: skipping ? "Skipping..." : "Skip Test"
|
|
1578
|
+
}
|
|
1579
|
+
)
|
|
1580
|
+
] })
|
|
1581
|
+
] }) })
|
|
1171
1582
|
] })
|
|
1172
1583
|
) : null }),
|
|
1584
|
+
activeTab === "messages" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: messageView === "compose" ? (
|
|
1585
|
+
/* Compose New Message */
|
|
1586
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1587
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1588
|
+
"button",
|
|
1589
|
+
{
|
|
1590
|
+
onClick: handleBackToThreadList,
|
|
1591
|
+
className: "text-sm text-zinc-400 hover:text-zinc-200 mb-3 flex items-center gap-1",
|
|
1592
|
+
children: "\u2190 Back to Messages"
|
|
1593
|
+
}
|
|
1594
|
+
),
|
|
1595
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center mb-4", children: [
|
|
1596
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100", children: "New Message" }),
|
|
1597
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-xs mt-1", children: "Send a message to the QA team" })
|
|
1598
|
+
] }),
|
|
1599
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "space-y-3", children: [
|
|
1600
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1601
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Subject" }),
|
|
1602
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1603
|
+
"input",
|
|
1604
|
+
{
|
|
1605
|
+
type: "text",
|
|
1606
|
+
value: composeSubject,
|
|
1607
|
+
onChange: (e) => setComposeSubject(e.target.value),
|
|
1608
|
+
placeholder: "What's this about?",
|
|
1609
|
+
maxLength: 100,
|
|
1610
|
+
className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500"
|
|
1611
|
+
}
|
|
1612
|
+
)
|
|
1613
|
+
] }),
|
|
1614
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1615
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Message" }),
|
|
1616
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1617
|
+
"textarea",
|
|
1618
|
+
{
|
|
1619
|
+
value: composeMessage,
|
|
1620
|
+
onChange: (e) => setComposeMessage(e.target.value),
|
|
1621
|
+
placeholder: "Write your message...",
|
|
1622
|
+
maxLength: 2e3,
|
|
1623
|
+
rows: 6,
|
|
1624
|
+
className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500 resize-none"
|
|
1625
|
+
}
|
|
1626
|
+
)
|
|
1627
|
+
] }),
|
|
1628
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1629
|
+
"button",
|
|
1630
|
+
{
|
|
1631
|
+
onClick: handleSendNewMessage,
|
|
1632
|
+
disabled: !composeSubject.trim() || !composeMessage.trim() || sendingNewMessage,
|
|
1633
|
+
className: "w-full py-2 px-4 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
|
|
1634
|
+
children: sendingNewMessage ? "Sending..." : "Send Message"
|
|
1635
|
+
}
|
|
1636
|
+
)
|
|
1637
|
+
] })
|
|
1638
|
+
] })
|
|
1639
|
+
) : messageView === "thread" && selectedThread ? (
|
|
1640
|
+
/* Thread Detail View */
|
|
1641
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1642
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1643
|
+
"button",
|
|
1644
|
+
{
|
|
1645
|
+
onClick: handleBackToThreadList,
|
|
1646
|
+
className: "text-sm text-zinc-400 hover:text-zinc-200 mb-3 flex items-center gap-1",
|
|
1647
|
+
children: "\u2190 Back to Messages"
|
|
1648
|
+
}
|
|
1649
|
+
),
|
|
1650
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 mb-4 pb-3 border-b border-zinc-700", children: [
|
|
1651
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-lg", children: getThreadTypeIcon(selectedThread.threadType) }),
|
|
1652
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100 text-sm leading-tight", children: selectedThread.subject || "No subject" })
|
|
1653
|
+
] }),
|
|
1654
|
+
loadingMessages ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "text-center py-6", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-sm", children: "Loading messages..." }) }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-3 mb-4", children: threadMessages.map((message) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1655
|
+
"div",
|
|
1656
|
+
{
|
|
1657
|
+
className: `p-3 rounded-lg ${message.senderType === "tester" ? "bg-blue-900/30 border border-blue-800 ml-6" : "bg-zinc-800 border border-zinc-700 mr-6"}`,
|
|
1658
|
+
children: [
|
|
1659
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `text-xs font-medium mb-1 ${message.senderType === "tester" ? "text-blue-300" : "text-zinc-300"}`, children: message.senderType === "tester" ? "You" : message.senderName }),
|
|
1660
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `text-sm ${message.senderType === "tester" ? "text-blue-100" : "text-zinc-200"}`, children: message.content }),
|
|
1661
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `text-[10px] mt-1 ${message.senderType === "tester" ? "text-blue-400/60" : "text-zinc-500"}`, children: formatMessageTime(message.createdAt) })
|
|
1662
|
+
]
|
|
1663
|
+
},
|
|
1664
|
+
message.id
|
|
1665
|
+
)) }),
|
|
1666
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex gap-2 pt-3 border-t border-zinc-700", children: [
|
|
1667
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1668
|
+
"input",
|
|
1669
|
+
{
|
|
1670
|
+
type: "text",
|
|
1671
|
+
value: replyText,
|
|
1672
|
+
onChange: (e) => setReplyText(e.target.value),
|
|
1673
|
+
placeholder: "Type a reply...",
|
|
1674
|
+
maxLength: 1e3,
|
|
1675
|
+
className: "flex-1 px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500",
|
|
1676
|
+
onKeyDown: (e) => e.key === "Enter" && !e.shiftKey && handleSendReply()
|
|
1677
|
+
}
|
|
1678
|
+
),
|
|
1679
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1680
|
+
"button",
|
|
1681
|
+
{
|
|
1682
|
+
onClick: handleSendReply,
|
|
1683
|
+
disabled: !replyText.trim() || sendingReply,
|
|
1684
|
+
className: "px-3 py-2 bg-blue-500 text-white text-sm rounded-lg hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
|
|
1685
|
+
children: sendingReply ? "..." : "Send"
|
|
1686
|
+
}
|
|
1687
|
+
)
|
|
1688
|
+
] })
|
|
1689
|
+
] })
|
|
1690
|
+
) : (
|
|
1691
|
+
/* Thread List View */
|
|
1692
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1693
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1694
|
+
"button",
|
|
1695
|
+
{
|
|
1696
|
+
onClick: handleStartNewMessage,
|
|
1697
|
+
className: "w-full flex items-center justify-center gap-2 py-2 px-4 mb-3 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 transition-colors",
|
|
1698
|
+
children: "\u2709\uFE0F New Message"
|
|
1699
|
+
}
|
|
1700
|
+
),
|
|
1701
|
+
threads.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-8", children: [
|
|
1702
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u{1F4AC}" }),
|
|
1703
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-400 mt-2 font-medium", children: "No messages yet" }),
|
|
1704
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-sm", children: "Start a conversation or wait for messages from admins" })
|
|
1705
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-2", children: threads.map((thread) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1706
|
+
"button",
|
|
1707
|
+
{
|
|
1708
|
+
onClick: () => handleOpenThread(thread),
|
|
1709
|
+
className: `w-full text-left p-3 rounded-lg border transition-colors ${thread.unreadCount > 0 ? "bg-blue-900/20 border-blue-800 hover:bg-blue-900/30" : "bg-zinc-800 border-zinc-700 hover:bg-zinc-700"}`,
|
|
1710
|
+
children: [
|
|
1711
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mb-1", children: [
|
|
1712
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-1.5 min-w-0 flex-1", children: [
|
|
1713
|
+
thread.isPinned && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs", children: "\u{1F4CC}" }),
|
|
1714
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs", children: getThreadTypeIcon(thread.threadType) }),
|
|
1715
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-sm truncate ${thread.unreadCount > 0 ? "font-semibold text-zinc-100" : "text-zinc-300"}`, children: thread.subject || "No subject" })
|
|
1716
|
+
] }),
|
|
1717
|
+
(thread.priority === "high" || thread.priority === "urgent") && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `w-2 h-2 rounded-full flex-shrink-0 ml-2 ${thread.priority === "urgent" ? "bg-red-500" : "bg-orange-500"}` })
|
|
1718
|
+
] }),
|
|
1719
|
+
thread.lastMessage && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-xs text-zinc-500 truncate", children: [
|
|
1720
|
+
thread.lastMessage.senderName,
|
|
1721
|
+
": ",
|
|
1722
|
+
thread.lastMessage.content
|
|
1723
|
+
] }),
|
|
1724
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mt-1.5", children: [
|
|
1725
|
+
thread.unreadCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-[10px] px-1.5 py-0.5 bg-blue-500 text-white rounded-full font-medium", children: [
|
|
1726
|
+
thread.unreadCount,
|
|
1727
|
+
" new"
|
|
1728
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-[10px] text-zinc-600", children: "Read" }),
|
|
1729
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-[10px] text-zinc-600", children: formatRelativeTime(thread.lastMessageAt) })
|
|
1730
|
+
] })
|
|
1731
|
+
]
|
|
1732
|
+
},
|
|
1733
|
+
thread.id
|
|
1734
|
+
)) })
|
|
1735
|
+
] })
|
|
1736
|
+
) }),
|
|
1173
1737
|
activeTab === "session" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: !activeSession ? (
|
|
1174
1738
|
/* Start Session View */
|
|
1175
1739
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1176
1740
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center mb-4", children: [
|
|
1177
1741
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u{1F50D}" }),
|
|
1178
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-
|
|
1179
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
1742
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100 mt-2", children: "Exploratory QA Session" }),
|
|
1743
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-xs mt-1", children: "Explore freely and capture findings as you go" })
|
|
1180
1744
|
] }),
|
|
1181
1745
|
focusAreas.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
1182
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("label", { className: "block text-xs font-medium text-
|
|
1746
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("label", { className: "block text-xs font-medium text-zinc-300 mb-2", children: [
|
|
1183
1747
|
"\u{1F4CC} Focus Areas",
|
|
1184
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "ml-1 text-[10px] text-
|
|
1748
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "ml-1 text-[10px] text-zinc-500 font-normal", children: "from your team" })
|
|
1185
1749
|
] }),
|
|
1186
1750
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-1.5", children: focusAreas.map((area) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1187
1751
|
"button",
|
|
1188
1752
|
{
|
|
1189
1753
|
onClick: () => setSessionFocusArea(area.name),
|
|
1190
|
-
className: `w-full text-left px-3 py-2 rounded-lg text-xs transition-colors border ${sessionFocusArea === area.name ? "bg-amber-
|
|
1754
|
+
className: `w-full text-left px-3 py-2 rounded-lg text-xs transition-colors border ${sessionFocusArea === area.name ? "bg-amber-900/20 border-amber-700 text-amber-400" : "bg-amber-900/20/50 border-amber-800 text-zinc-300 hover:bg-amber-900/20"}`,
|
|
1191
1755
|
children: [
|
|
1192
1756
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
1193
1757
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: area.name }),
|
|
1194
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-[10px] px-1.5 py-0.5 rounded ${area.priority >= 70 ? "bg-red-
|
|
1758
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-[10px] px-1.5 py-0.5 rounded ${area.priority >= 70 ? "bg-red-900/30 text-red-400" : area.priority >= 50 ? "bg-amber-900/30 text-amber-400" : "bg-zinc-700 text-zinc-500"}`, children: area.priority >= 70 ? "Urgent" : area.priority >= 50 ? "Important" : "Suggested" })
|
|
1195
1759
|
] }),
|
|
1196
|
-
area.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-[10px] text-
|
|
1760
|
+
area.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-[10px] text-zinc-500 mt-0.5 line-clamp-2", children: area.description })
|
|
1197
1761
|
]
|
|
1198
1762
|
},
|
|
1199
1763
|
area.id
|
|
1200
1764
|
)) })
|
|
1201
1765
|
] }),
|
|
1202
1766
|
suggestedRoutes.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
1203
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1767
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-2", children: "\u{1F3AF} Suggested Routes to Explore" }),
|
|
1204
1768
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-1.5 max-h-32 overflow-y-auto", children: suggestedRoutes.map((suggestion, idx) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1205
1769
|
"button",
|
|
1206
1770
|
{
|
|
1207
1771
|
onClick: () => setSessionFocusArea(suggestion.route),
|
|
1208
|
-
className: `w-full text-left px-3 py-2 rounded-lg text-xs transition-colors border ${sessionFocusArea === suggestion.route ? "bg-
|
|
1772
|
+
className: `w-full text-left px-3 py-2 rounded-lg text-xs transition-colors border ${sessionFocusArea === suggestion.route ? "bg-blue-950/30 border-blue-700 text-blue-300" : "bg-zinc-800 border-zinc-700 text-zinc-300 hover:bg-zinc-700"}`,
|
|
1209
1773
|
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
1210
1774
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium truncate", children: suggestion.route }),
|
|
1211
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-[10px] px-1.5 py-0.5 rounded ${suggestion.priorityScore >= 40 ? "bg-red-
|
|
1775
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-[10px] px-1.5 py-0.5 rounded ${suggestion.priorityScore >= 40 ? "bg-red-900/30 text-red-400" : suggestion.priorityScore >= 25 ? "bg-amber-900/30 text-amber-400" : "bg-zinc-700 text-zinc-500"}`, children: suggestion.reason })
|
|
1212
1776
|
] })
|
|
1213
1777
|
},
|
|
1214
1778
|
idx
|
|
1215
1779
|
)) })
|
|
1216
1780
|
] }),
|
|
1217
1781
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
|
|
1218
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1782
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Focus Area (optional)" }),
|
|
1219
1783
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1220
1784
|
"input",
|
|
1221
1785
|
{
|
|
@@ -1223,12 +1787,12 @@ function BugBearPanel({
|
|
|
1223
1787
|
value: sessionFocusArea,
|
|
1224
1788
|
onChange: (e) => setSessionFocusArea(e.target.value),
|
|
1225
1789
|
placeholder: "e.g., checkout flow, settings page",
|
|
1226
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
1790
|
+
className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500"
|
|
1227
1791
|
}
|
|
1228
1792
|
)
|
|
1229
1793
|
] }),
|
|
1230
1794
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
1231
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1795
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Platform" }),
|
|
1232
1796
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex gap-2", children: [
|
|
1233
1797
|
{ key: "web", label: "\u{1F310} Web" },
|
|
1234
1798
|
{ key: "ios", label: "\u{1F4F1} iOS" },
|
|
@@ -1237,7 +1801,7 @@ function BugBearPanel({
|
|
|
1237
1801
|
"button",
|
|
1238
1802
|
{
|
|
1239
1803
|
onClick: () => setSessionPlatform(key),
|
|
1240
|
-
className: `flex-1 py-2 px-3 rounded-lg text-xs font-medium transition-colors border-2 ${sessionPlatform === key ? "bg-
|
|
1804
|
+
className: `flex-1 py-2 px-3 rounded-lg text-xs font-medium transition-colors border-2 ${sessionPlatform === key ? "bg-blue-950/30 border-blue-500 text-blue-300" : "bg-zinc-800 border-transparent text-zinc-400 hover:bg-zinc-700"}`,
|
|
1241
1805
|
children: label
|
|
1242
1806
|
},
|
|
1243
1807
|
key
|
|
@@ -1261,8 +1825,8 @@ function BugBearPanel({
|
|
|
1261
1825
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1262
1826
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center mb-4", children: [
|
|
1263
1827
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u270B" }),
|
|
1264
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-
|
|
1265
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-
|
|
1828
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100 mt-2", children: "End Session?" }),
|
|
1829
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-zinc-500 text-xs mt-1", children: [
|
|
1266
1830
|
"Duration: ",
|
|
1267
1831
|
formatElapsedTime(sessionElapsedTime),
|
|
1268
1832
|
" \u2022 ",
|
|
@@ -1272,7 +1836,7 @@ function BugBearPanel({
|
|
|
1272
1836
|
] })
|
|
1273
1837
|
] }),
|
|
1274
1838
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
1275
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1839
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Session Notes (optional)" }),
|
|
1276
1840
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1277
1841
|
"textarea",
|
|
1278
1842
|
{
|
|
@@ -1280,7 +1844,7 @@ function BugBearPanel({
|
|
|
1280
1844
|
onChange: (e) => setSessionNotes(e.target.value),
|
|
1281
1845
|
placeholder: "Any overall observations from this session...",
|
|
1282
1846
|
rows: 3,
|
|
1283
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
1847
|
+
className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500 resize-none"
|
|
1284
1848
|
}
|
|
1285
1849
|
)
|
|
1286
1850
|
] }),
|
|
@@ -1289,7 +1853,7 @@ function BugBearPanel({
|
|
|
1289
1853
|
"button",
|
|
1290
1854
|
{
|
|
1291
1855
|
onClick: () => setShowEndConfirm(false),
|
|
1292
|
-
className: "flex-1 py-2 px-3 bg-
|
|
1856
|
+
className: "flex-1 py-2 px-3 bg-zinc-700 text-zinc-300 rounded-lg font-medium text-sm hover:bg-zinc-700 transition-colors",
|
|
1293
1857
|
children: "Cancel"
|
|
1294
1858
|
}
|
|
1295
1859
|
),
|
|
@@ -1308,12 +1872,12 @@ function BugBearPanel({
|
|
|
1308
1872
|
/* Add Finding Form */
|
|
1309
1873
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1310
1874
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [
|
|
1311
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-
|
|
1875
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100 text-sm", children: "Add Finding" }),
|
|
1312
1876
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1313
1877
|
"button",
|
|
1314
1878
|
{
|
|
1315
1879
|
onClick: () => setShowAddFinding(false),
|
|
1316
|
-
className: "text-
|
|
1880
|
+
className: "text-zinc-500 hover:text-zinc-400",
|
|
1317
1881
|
children: "\u2715"
|
|
1318
1882
|
}
|
|
1319
1883
|
)
|
|
@@ -1327,25 +1891,25 @@ function BugBearPanel({
|
|
|
1327
1891
|
"button",
|
|
1328
1892
|
{
|
|
1329
1893
|
onClick: () => setFindingType(type),
|
|
1330
|
-
className: `flex-1 py-1.5 px-2 rounded text-xs font-medium transition-colors ${findingType === type ? color === "red" ? "bg-red-
|
|
1894
|
+
className: `flex-1 py-1.5 px-2 rounded text-xs font-medium transition-colors ${findingType === type ? color === "red" ? "bg-red-900/30 text-red-400 ring-2 ring-red-400" : color === "orange" ? "bg-orange-900/30 text-orange-400 ring-2 ring-orange-400" : color === "blue" ? "bg-blue-900/30 text-blue-300 ring-2 ring-blue-400" : "bg-blue-900/50 text-blue-300 ring-2 ring-blue-400" : "bg-zinc-700 text-zinc-400 hover:bg-zinc-700"}`,
|
|
1331
1895
|
children: label
|
|
1332
1896
|
},
|
|
1333
1897
|
type
|
|
1334
1898
|
)) }),
|
|
1335
1899
|
findingType === "bug" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
|
|
1336
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1900
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Severity" }),
|
|
1337
1901
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex gap-1", children: ["critical", "high", "medium", "low", "observation"].map((sev) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1338
1902
|
"button",
|
|
1339
1903
|
{
|
|
1340
1904
|
onClick: () => setFindingSeverity(sev),
|
|
1341
|
-
className: `flex-1 py-1 px-1 rounded text-xs font-medium capitalize transition-colors ${findingSeverity === sev ? sev === "critical" ? "bg-red-600 text-white" : sev === "high" ? "bg-orange-500 text-white" : sev === "medium" ? "bg-yellow-500 text-black" : sev === "low" ? "bg-
|
|
1905
|
+
className: `flex-1 py-1 px-1 rounded text-xs font-medium capitalize transition-colors ${findingSeverity === sev ? sev === "critical" ? "bg-red-600 text-white" : sev === "high" ? "bg-orange-500 text-white" : sev === "medium" ? "bg-yellow-500 text-black" : sev === "low" ? "bg-zinc-8000 text-white" : "bg-blue-500 text-white" : "bg-zinc-700 text-zinc-400 hover:bg-zinc-700"}`,
|
|
1342
1906
|
children: sev === "observation" ? "obs" : sev
|
|
1343
1907
|
},
|
|
1344
1908
|
sev
|
|
1345
1909
|
)) })
|
|
1346
1910
|
] }),
|
|
1347
1911
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
|
|
1348
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1912
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Title *" }),
|
|
1349
1913
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1350
1914
|
"input",
|
|
1351
1915
|
{
|
|
@@ -1353,12 +1917,12 @@ function BugBearPanel({
|
|
|
1353
1917
|
value: findingTitle,
|
|
1354
1918
|
onChange: (e) => setFindingTitle(e.target.value),
|
|
1355
1919
|
placeholder: "Brief description of what you found",
|
|
1356
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
1920
|
+
className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500"
|
|
1357
1921
|
}
|
|
1358
1922
|
)
|
|
1359
1923
|
] }),
|
|
1360
1924
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
|
|
1361
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1925
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Details (optional)" }),
|
|
1362
1926
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1363
1927
|
"textarea",
|
|
1364
1928
|
{
|
|
@@ -1366,7 +1930,7 @@ function BugBearPanel({
|
|
|
1366
1930
|
onChange: (e) => setFindingDescription(e.target.value),
|
|
1367
1931
|
placeholder: "Steps to reproduce, expected behavior, etc.",
|
|
1368
1932
|
rows: 2,
|
|
1369
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
1933
|
+
className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500 resize-none"
|
|
1370
1934
|
}
|
|
1371
1935
|
)
|
|
1372
1936
|
] }),
|
|
@@ -1375,7 +1939,7 @@ function BugBearPanel({
|
|
|
1375
1939
|
{
|
|
1376
1940
|
onClick: handleAddFinding,
|
|
1377
1941
|
disabled: addingFinding || !findingTitle.trim(),
|
|
1378
|
-
className: "w-full py-2 px-4 bg-
|
|
1942
|
+
className: "w-full py-2 px-4 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
|
|
1379
1943
|
children: addingFinding ? "Adding..." : "Add Finding"
|
|
1380
1944
|
}
|
|
1381
1945
|
)
|
|
@@ -1383,15 +1947,15 @@ function BugBearPanel({
|
|
|
1383
1947
|
) : (
|
|
1384
1948
|
/* Active Session View */
|
|
1385
1949
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1386
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-green-
|
|
1950
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-green-900/20 rounded-lg p-3 mb-3 border border-green-800", children: [
|
|
1387
1951
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
1388
1952
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
1389
1953
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "w-2 h-2 bg-green-500 rounded-full animate-pulse" }),
|
|
1390
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium text-green-
|
|
1954
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium text-green-300 text-sm", children: "Session Active" })
|
|
1391
1955
|
] }),
|
|
1392
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-mono text-green-
|
|
1956
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-mono text-green-400 text-lg font-semibold", children: formatElapsedTime(sessionElapsedTime) })
|
|
1393
1957
|
] }),
|
|
1394
|
-
activeSession.focusArea && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-green-
|
|
1958
|
+
activeSession.focusArea && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-green-400 text-xs mt-1", children: [
|
|
1395
1959
|
"Focus: ",
|
|
1396
1960
|
activeSession.focusArea
|
|
1397
1961
|
] })
|
|
@@ -1400,7 +1964,7 @@ function BugBearPanel({
|
|
|
1400
1964
|
"button",
|
|
1401
1965
|
{
|
|
1402
1966
|
onClick: () => setShowAddFinding(true),
|
|
1403
|
-
className: "w-full py-3 px-4 bg-
|
|
1967
|
+
className: "w-full py-3 px-4 bg-blue-500 text-white rounded-lg font-semibold text-sm hover:bg-blue-600 transition-colors flex items-center justify-center gap-2 mb-3",
|
|
1404
1968
|
children: [
|
|
1405
1969
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "+" }),
|
|
1406
1970
|
" Add Finding"
|
|
@@ -1408,23 +1972,23 @@ function BugBearPanel({
|
|
|
1408
1972
|
}
|
|
1409
1973
|
),
|
|
1410
1974
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
|
|
1411
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center justify-between mb-2", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs font-medium text-
|
|
1975
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center justify-between mb-2", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs font-medium text-zinc-500", children: [
|
|
1412
1976
|
"Findings (",
|
|
1413
1977
|
sessionFindings.length,
|
|
1414
1978
|
")"
|
|
1415
1979
|
] }) }),
|
|
1416
|
-
sessionFindings.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-4 bg-
|
|
1417
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
1418
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
1980
|
+
sessionFindings.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-4 bg-zinc-800 rounded-lg", children: [
|
|
1981
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-xs", children: "No findings yet" }),
|
|
1982
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-xs", children: "Explore and add findings as you go" })
|
|
1419
1983
|
] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-2 max-h-32 overflow-y-auto", children: sessionFindings.map((finding) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1420
1984
|
"div",
|
|
1421
1985
|
{
|
|
1422
|
-
className: `p-2 rounded-lg border text-xs ${finding.type === "bug" ? "bg-red-
|
|
1986
|
+
className: `p-2 rounded-lg border text-xs ${finding.type === "bug" ? "bg-red-900/20 border-red-800" : finding.type === "concern" ? "bg-orange-900/20 border-orange-200" : finding.type === "suggestion" ? "bg-blue-900/20 border-blue-800" : "bg-blue-950/30 border-blue-800"}`,
|
|
1423
1987
|
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-start gap-2", children: [
|
|
1424
1988
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: finding.type === "bug" ? "\u{1F41B}" : finding.type === "concern" ? "\u26A0\uFE0F" : finding.type === "suggestion" ? "\u{1F4A1}" : "\u2753" }),
|
|
1425
1989
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
1426
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "font-medium text-
|
|
1427
|
-
finding.severity && finding.type === "bug" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `inline-block mt-0.5 px-1 py-0.5 rounded text-[10px] font-medium ${finding.severity === "critical" ? "bg-red-
|
|
1990
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "font-medium text-zinc-100 truncate", children: finding.title }),
|
|
1991
|
+
finding.severity && finding.type === "bug" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `inline-block mt-0.5 px-1 py-0.5 rounded text-[10px] font-medium ${finding.severity === "critical" ? "bg-red-900/40 text-red-300" : finding.severity === "high" ? "bg-orange-900/40 text-orange-300" : finding.severity === "medium" ? "bg-yellow-900/40 text-yellow-300" : "bg-zinc-700 text-zinc-300"}`, children: finding.severity })
|
|
1428
1992
|
] })
|
|
1429
1993
|
] })
|
|
1430
1994
|
},
|
|
@@ -1435,7 +1999,7 @@ function BugBearPanel({
|
|
|
1435
1999
|
"button",
|
|
1436
2000
|
{
|
|
1437
2001
|
onClick: () => setShowEndConfirm(true),
|
|
1438
|
-
className: "w-full py-2 px-4 bg-
|
|
2002
|
+
className: "w-full py-2 px-4 bg-zinc-700 text-zinc-300 rounded-lg font-medium text-sm hover:bg-zinc-700 transition-colors",
|
|
1439
2003
|
children: "End Session"
|
|
1440
2004
|
}
|
|
1441
2005
|
)
|
|
@@ -1443,7 +2007,7 @@ function BugBearPanel({
|
|
|
1443
2007
|
) }),
|
|
1444
2008
|
activeTab === "report" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: submitted ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-8", children: [
|
|
1445
2009
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u{1F389}" }),
|
|
1446
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
2010
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-400 mt-2 font-medium", children: "Report submitted!" })
|
|
1447
2011
|
] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
1448
2012
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex gap-2 mb-4", children: [
|
|
1449
2013
|
{ type: "bug", label: "\u{1F41B} Bug", color: "red" },
|
|
@@ -1453,25 +2017,25 @@ function BugBearPanel({
|
|
|
1453
2017
|
"button",
|
|
1454
2018
|
{
|
|
1455
2019
|
onClick: () => setReportType(type),
|
|
1456
|
-
className: `flex-1 py-1.5 px-2 rounded-lg text-xs font-medium transition-colors ${reportType === type ? color === "red" ? "bg-red-
|
|
2020
|
+
className: `flex-1 py-1.5 px-2 rounded-lg text-xs font-medium transition-colors ${reportType === type ? color === "red" ? "bg-red-900/30 text-red-400 ring-2 ring-red-500" : color === "blue" ? "bg-blue-900/30 text-blue-300 ring-2 ring-blue-500" : "bg-blue-900/50 text-blue-300 ring-2 ring-blue-500" : "bg-zinc-700 text-zinc-400 hover:bg-zinc-700"}`,
|
|
1457
2021
|
children: label
|
|
1458
2022
|
},
|
|
1459
2023
|
type
|
|
1460
2024
|
)) }),
|
|
1461
2025
|
(reportType === "bug" || reportType === "test_fail") && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
|
|
1462
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
2026
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Severity" }),
|
|
1463
2027
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex gap-1", children: ["critical", "high", "medium", "low"].map((sev) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1464
2028
|
"button",
|
|
1465
2029
|
{
|
|
1466
2030
|
onClick: () => setSeverity(sev),
|
|
1467
|
-
className: `flex-1 py-1 px-2 rounded text-xs font-medium capitalize transition-colors ${severity === sev ? sev === "critical" ? "bg-red-600 text-white" : sev === "high" ? "bg-orange-500 text-white" : sev === "medium" ? "bg-yellow-500 text-black" : "bg-
|
|
2031
|
+
className: `flex-1 py-1 px-2 rounded text-xs font-medium capitalize transition-colors ${severity === sev ? sev === "critical" ? "bg-red-600 text-white" : sev === "high" ? "bg-orange-500 text-white" : sev === "medium" ? "bg-yellow-500 text-black" : "bg-zinc-8000 text-white" : "bg-zinc-700 text-zinc-400 hover:bg-zinc-700"}`,
|
|
1468
2032
|
children: sev
|
|
1469
2033
|
},
|
|
1470
2034
|
sev
|
|
1471
2035
|
)) })
|
|
1472
2036
|
] }),
|
|
1473
2037
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
|
|
1474
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
2038
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "What happened?" }),
|
|
1475
2039
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1476
2040
|
"textarea",
|
|
1477
2041
|
{
|
|
@@ -1479,7 +2043,7 @@ function BugBearPanel({
|
|
|
1479
2043
|
onChange: (e) => setDescription(e.target.value),
|
|
1480
2044
|
placeholder: "Describe the issue...",
|
|
1481
2045
|
rows: 3,
|
|
1482
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
2046
|
+
className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500 resize-none"
|
|
1483
2047
|
}
|
|
1484
2048
|
)
|
|
1485
2049
|
] }),
|
|
@@ -1488,19 +2052,19 @@ function BugBearPanel({
|
|
|
1488
2052
|
{
|
|
1489
2053
|
onClick: handleSubmitReport,
|
|
1490
2054
|
disabled: submitting || !description.trim(),
|
|
1491
|
-
className: "w-full py-2 px-4 bg-
|
|
2055
|
+
className: "w-full py-2 px-4 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
|
|
1492
2056
|
children: submitting ? "Submitting..." : "Submit Report"
|
|
1493
2057
|
}
|
|
1494
2058
|
)
|
|
1495
2059
|
] }) })
|
|
1496
2060
|
] }),
|
|
1497
|
-
showProfileOverlay && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "absolute inset-0 bg-
|
|
1498
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-
|
|
2061
|
+
showProfileOverlay && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "absolute inset-0 bg-zinc-900 z-50 flex flex-col rounded-xl overflow-hidden", children: [
|
|
2062
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-950 text-white px-4 py-3 flex items-center justify-between border-b border-zinc-800", children: [
|
|
1499
2063
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1500
2064
|
"button",
|
|
1501
2065
|
{
|
|
1502
2066
|
onClick: handleCloseProfile,
|
|
1503
|
-
className: "text-sm text-
|
|
2067
|
+
className: "text-sm text-zinc-400 hover:text-white transition-colors",
|
|
1504
2068
|
children: "\u2190 Back"
|
|
1505
2069
|
}
|
|
1506
2070
|
),
|
|
@@ -1510,23 +2074,23 @@ function BugBearPanel({
|
|
|
1510
2074
|
] }),
|
|
1511
2075
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex-1 overflow-y-auto p-4", children: profileSaved ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-8", children: [
|
|
1512
2076
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u2705" }),
|
|
1513
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-
|
|
2077
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-400 mt-2 font-medium", children: "Profile saved!" })
|
|
1514
2078
|
] }) : profileEditing ? (
|
|
1515
2079
|
/* Edit Profile Form */
|
|
1516
2080
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1517
2081
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mb-4", children: [
|
|
1518
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-
|
|
2082
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100", children: "Edit Profile" }),
|
|
1519
2083
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1520
2084
|
"button",
|
|
1521
2085
|
{
|
|
1522
2086
|
onClick: handleCancelEditProfile,
|
|
1523
|
-
className: "text-sm text-
|
|
2087
|
+
className: "text-sm text-zinc-500 hover:text-zinc-300",
|
|
1524
2088
|
children: "Cancel"
|
|
1525
2089
|
}
|
|
1526
2090
|
)
|
|
1527
2091
|
] }),
|
|
1528
2092
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
1529
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
2093
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Name" }),
|
|
1530
2094
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1531
2095
|
"input",
|
|
1532
2096
|
{
|
|
@@ -1534,27 +2098,27 @@ function BugBearPanel({
|
|
|
1534
2098
|
value: profileName,
|
|
1535
2099
|
onChange: (e) => setProfileName(e.target.value),
|
|
1536
2100
|
placeholder: "Your name",
|
|
1537
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
2101
|
+
className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500"
|
|
1538
2102
|
}
|
|
1539
2103
|
)
|
|
1540
2104
|
] }),
|
|
1541
2105
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
1542
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1543
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "px-3 py-2 bg-
|
|
1544
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-
|
|
1545
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-
|
|
2106
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Primary Email" }),
|
|
2107
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "px-3 py-2 bg-zinc-800 rounded-lg", children: [
|
|
2108
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-zinc-300", children: testerInfo?.email }),
|
|
2109
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500 mt-0.5", children: "Main communication email" })
|
|
1546
2110
|
] })
|
|
1547
2111
|
] }),
|
|
1548
2112
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
1549
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1550
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-
|
|
2113
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Additional Testing Emails" }),
|
|
2114
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500 mb-2", children: "Add other emails you use to test on different accounts" }),
|
|
1551
2115
|
profileAdditionalEmails.map((email) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
1552
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "flex-1 px-3 py-1.5 bg-
|
|
2116
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "flex-1 px-3 py-1.5 bg-blue-950/30 text-blue-300 text-sm rounded-full", children: email }),
|
|
1553
2117
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1554
2118
|
"button",
|
|
1555
2119
|
{
|
|
1556
2120
|
onClick: () => handleRemoveEmail(email),
|
|
1557
|
-
className: "text-
|
|
2121
|
+
className: "text-blue-400 hover:text-red-500 text-sm",
|
|
1558
2122
|
children: "\u2715"
|
|
1559
2123
|
}
|
|
1560
2124
|
)
|
|
@@ -1567,7 +2131,7 @@ function BugBearPanel({
|
|
|
1567
2131
|
value: newEmailInput,
|
|
1568
2132
|
onChange: (e) => setNewEmailInput(e.target.value),
|
|
1569
2133
|
placeholder: "email@example.com",
|
|
1570
|
-
className: "flex-1 px-3 py-2 text-sm border border-
|
|
2134
|
+
className: "flex-1 px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500",
|
|
1571
2135
|
onKeyDown: (e) => e.key === "Enter" && handleAddEmail()
|
|
1572
2136
|
}
|
|
1573
2137
|
),
|
|
@@ -1576,15 +2140,15 @@ function BugBearPanel({
|
|
|
1576
2140
|
{
|
|
1577
2141
|
onClick: handleAddEmail,
|
|
1578
2142
|
disabled: !newEmailInput.trim(),
|
|
1579
|
-
className: "px-3 py-2 bg-
|
|
2143
|
+
className: "px-3 py-2 bg-blue-500 text-white text-sm rounded-lg hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed",
|
|
1580
2144
|
children: "Add"
|
|
1581
2145
|
}
|
|
1582
2146
|
)
|
|
1583
2147
|
] })
|
|
1584
2148
|
] }),
|
|
1585
2149
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
|
|
1586
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-
|
|
1587
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-
|
|
2150
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Testing Platforms" }),
|
|
2151
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500 mb-2", children: "Select the platforms you can test on" }),
|
|
1588
2152
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex gap-2", children: [
|
|
1589
2153
|
{ key: "ios", label: "\u{1F4F1} iOS" },
|
|
1590
2154
|
{ key: "android", label: "\u{1F916} Android" },
|
|
@@ -1593,7 +2157,7 @@ function BugBearPanel({
|
|
|
1593
2157
|
"button",
|
|
1594
2158
|
{
|
|
1595
2159
|
onClick: () => handleTogglePlatform(key),
|
|
1596
|
-
className: `flex-1 py-2 px-3 rounded-lg text-sm font-medium transition-colors border-2 ${profilePlatforms.includes(key) ? "bg-
|
|
2160
|
+
className: `flex-1 py-2 px-3 rounded-lg text-sm font-medium transition-colors border-2 ${profilePlatforms.includes(key) ? "bg-blue-950/30 border-blue-500 text-blue-300" : "bg-zinc-800 border-transparent text-zinc-400 hover:bg-zinc-700"}`,
|
|
1597
2161
|
children: label
|
|
1598
2162
|
},
|
|
1599
2163
|
key
|
|
@@ -1612,31 +2176,31 @@ function BugBearPanel({
|
|
|
1612
2176
|
) : (
|
|
1613
2177
|
/* Profile View */
|
|
1614
2178
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1615
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-
|
|
1616
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-16 h-16 mx-auto bg-
|
|
1617
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-
|
|
1618
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-
|
|
1619
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-center gap-6 mt-4 pt-4 border-t border-
|
|
2179
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 rounded-lg p-4 text-center mb-4", children: [
|
|
2180
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-16 h-16 mx-auto bg-blue-500 rounded-full flex items-center justify-center mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-2xl font-semibold text-white", children: testerInfo?.name?.charAt(0)?.toUpperCase() || "?" }) }),
|
|
2181
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100", children: testerInfo?.name }),
|
|
2182
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-zinc-500", children: testerInfo?.email }),
|
|
2183
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-center gap-6 mt-4 pt-4 border-t border-zinc-700", children: [
|
|
1620
2184
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center", children: [
|
|
1621
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xl font-bold text-
|
|
1622
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-
|
|
2185
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xl font-bold text-blue-400", children: testerInfo?.assignedTests || 0 }),
|
|
2186
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500", children: "Assigned" })
|
|
1623
2187
|
] }),
|
|
1624
2188
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center", children: [
|
|
1625
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xl font-bold text-
|
|
1626
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-
|
|
2189
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xl font-bold text-blue-400", children: testerInfo?.completedTests || 0 }),
|
|
2190
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500", children: "Completed" })
|
|
1627
2191
|
] })
|
|
1628
2192
|
] })
|
|
1629
2193
|
] }),
|
|
1630
|
-
(testerInfo?.additionalEmails?.length || 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-
|
|
1631
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs font-medium text-
|
|
1632
|
-
testerInfo?.additionalEmails?.map((email) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-
|
|
2194
|
+
(testerInfo?.additionalEmails?.length || 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 rounded-lg p-3 mb-3", children: [
|
|
2195
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs font-medium text-zinc-500 uppercase tracking-wide mb-2", children: "Additional Emails" }),
|
|
2196
|
+
testerInfo?.additionalEmails?.map((email) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-zinc-300", children: email }, email))
|
|
1633
2197
|
] }),
|
|
1634
|
-
(testerInfo?.platforms?.length || 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-
|
|
1635
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs font-medium text-
|
|
2198
|
+
(testerInfo?.platforms?.length || 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 rounded-lg p-3 mb-3", children: [
|
|
2199
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs font-medium text-zinc-500 uppercase tracking-wide mb-2", children: "Testing Platforms" }),
|
|
1636
2200
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex flex-wrap gap-2", children: testerInfo?.platforms?.map((platform) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1637
2201
|
"span",
|
|
1638
2202
|
{
|
|
1639
|
-
className: "px-2 py-1 bg-
|
|
2203
|
+
className: "px-2 py-1 bg-blue-900/50 text-blue-300 text-xs rounded-full font-medium",
|
|
1640
2204
|
children: platform === "ios" ? "\u{1F4F1} iOS" : platform === "android" ? "\u{1F916} Android" : "\u{1F310} Web"
|
|
1641
2205
|
},
|
|
1642
2206
|
platform
|
|
@@ -1646,14 +2210,31 @@ function BugBearPanel({
|
|
|
1646
2210
|
"button",
|
|
1647
2211
|
{
|
|
1648
2212
|
onClick: handleStartEditProfile,
|
|
1649
|
-
className: "w-full py-2 px-4 bg-
|
|
2213
|
+
className: "w-full py-2 px-4 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 transition-colors",
|
|
1650
2214
|
children: "Edit Profile"
|
|
1651
2215
|
}
|
|
1652
2216
|
)
|
|
1653
2217
|
] })
|
|
1654
2218
|
) })
|
|
1655
2219
|
] }),
|
|
1656
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.
|
|
2220
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "px-4 py-2 bg-zinc-950 border-t border-zinc-800 flex items-center justify-between text-xs text-zinc-500", children: activeTab === "messages" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
2221
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
|
|
2222
|
+
threads.length,
|
|
2223
|
+
" thread",
|
|
2224
|
+
threads.length !== 1 ? "s" : "",
|
|
2225
|
+
" \xB7 ",
|
|
2226
|
+
unreadCount,
|
|
2227
|
+
" unread"
|
|
2228
|
+
] }),
|
|
2229
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2230
|
+
"button",
|
|
2231
|
+
{
|
|
2232
|
+
onClick: refreshThreads,
|
|
2233
|
+
className: "hover:text-zinc-300",
|
|
2234
|
+
children: "\u21BB Refresh"
|
|
2235
|
+
}
|
|
2236
|
+
)
|
|
2237
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
1657
2238
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
|
|
1658
2239
|
pendingCount,
|
|
1659
2240
|
" pending \xB7 ",
|
|
@@ -1664,11 +2245,11 @@ function BugBearPanel({
|
|
|
1664
2245
|
"button",
|
|
1665
2246
|
{
|
|
1666
2247
|
onClick: refreshAssignments,
|
|
1667
|
-
className: "hover:text-
|
|
2248
|
+
className: "hover:text-zinc-300",
|
|
1668
2249
|
children: "\u21BB Refresh"
|
|
1669
2250
|
}
|
|
1670
2251
|
)
|
|
1671
|
-
] })
|
|
2252
|
+
] }) })
|
|
1672
2253
|
] })
|
|
1673
2254
|
]
|
|
1674
2255
|
}
|