@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.mjs
CHANGED
|
@@ -28,7 +28,17 @@ var BugBearContext = createContext({
|
|
|
28
28
|
endSession: async () => ({ success: false }),
|
|
29
29
|
addFinding: async () => ({ success: false }),
|
|
30
30
|
refreshSession: async () => {
|
|
31
|
-
}
|
|
31
|
+
},
|
|
32
|
+
// Messaging
|
|
33
|
+
threads: [],
|
|
34
|
+
unreadCount: 0,
|
|
35
|
+
refreshThreads: async () => {
|
|
36
|
+
},
|
|
37
|
+
getThreadMessages: async () => [],
|
|
38
|
+
sendMessage: async () => false,
|
|
39
|
+
markAsRead: async () => {
|
|
40
|
+
},
|
|
41
|
+
createThread: async () => ({ success: false })
|
|
32
42
|
});
|
|
33
43
|
function useBugBear() {
|
|
34
44
|
return useContext(BugBearContext);
|
|
@@ -43,6 +53,8 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
43
53
|
const hasInitialized = useRef(false);
|
|
44
54
|
const [activeSession, setActiveSession] = useState(null);
|
|
45
55
|
const [sessionFindings, setSessionFindings] = useState([]);
|
|
56
|
+
const [threads, setThreads] = useState([]);
|
|
57
|
+
const [unreadCount, setUnreadCount] = useState(0);
|
|
46
58
|
const refreshAssignments = useCallback(async () => {
|
|
47
59
|
if (!client) return;
|
|
48
60
|
const newAssignments = await client.getAssignedTests();
|
|
@@ -87,6 +99,38 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
87
99
|
}
|
|
88
100
|
return result;
|
|
89
101
|
}, [client, activeSession]);
|
|
102
|
+
const refreshThreads = useCallback(async () => {
|
|
103
|
+
if (!client) return;
|
|
104
|
+
const newThreads = await client.getThreadsForTester();
|
|
105
|
+
setThreads(newThreads);
|
|
106
|
+
const totalUnread = newThreads.reduce((sum, t) => sum + t.unreadCount, 0);
|
|
107
|
+
setUnreadCount(totalUnread);
|
|
108
|
+
}, [client]);
|
|
109
|
+
const getThreadMessages = useCallback(async (threadId) => {
|
|
110
|
+
if (!client) return [];
|
|
111
|
+
return client.getThreadMessages(threadId);
|
|
112
|
+
}, [client]);
|
|
113
|
+
const sendMessage = useCallback(async (threadId, content) => {
|
|
114
|
+
if (!client) return false;
|
|
115
|
+
const success = await client.sendMessage(threadId, content);
|
|
116
|
+
if (success) {
|
|
117
|
+
await refreshThreads();
|
|
118
|
+
}
|
|
119
|
+
return success;
|
|
120
|
+
}, [client, refreshThreads]);
|
|
121
|
+
const markAsRead = useCallback(async (threadId) => {
|
|
122
|
+
if (!client) return;
|
|
123
|
+
await client.markThreadAsRead(threadId);
|
|
124
|
+
await refreshThreads();
|
|
125
|
+
}, [client, refreshThreads]);
|
|
126
|
+
const createThread = useCallback(async (options) => {
|
|
127
|
+
if (!client) return { success: false, error: "Client not initialized" };
|
|
128
|
+
const result = await client.createThread(options);
|
|
129
|
+
if (result.success) {
|
|
130
|
+
await refreshThreads();
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
}, [client, refreshThreads]);
|
|
90
134
|
const initializeBugBear = useCallback(async (bugBearClient) => {
|
|
91
135
|
setIsLoading(true);
|
|
92
136
|
try {
|
|
@@ -99,12 +143,16 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
99
143
|
setTesterInfo(info);
|
|
100
144
|
setIsTester(!!info);
|
|
101
145
|
if (info && qaEnabled) {
|
|
102
|
-
const [newAssignments, session] = await Promise.all([
|
|
146
|
+
const [newAssignments, session, newThreads] = await Promise.all([
|
|
103
147
|
bugBearClient.getAssignedTests(),
|
|
104
|
-
bugBearClient.getActiveSession()
|
|
148
|
+
bugBearClient.getActiveSession(),
|
|
149
|
+
bugBearClient.getThreadsForTester()
|
|
105
150
|
]);
|
|
106
151
|
setAssignments(newAssignments);
|
|
107
152
|
setActiveSession(session);
|
|
153
|
+
setThreads(newThreads);
|
|
154
|
+
const totalUnread = newThreads.reduce((sum, t) => sum + t.unreadCount, 0);
|
|
155
|
+
setUnreadCount(totalUnread);
|
|
108
156
|
if (session) {
|
|
109
157
|
const findings = await bugBearClient.getSessionFindings(session.id);
|
|
110
158
|
setSessionFindings(findings);
|
|
@@ -170,7 +218,15 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
170
218
|
startSession,
|
|
171
219
|
endSession,
|
|
172
220
|
addFinding,
|
|
173
|
-
refreshSession
|
|
221
|
+
refreshSession,
|
|
222
|
+
// Messaging
|
|
223
|
+
threads,
|
|
224
|
+
unreadCount,
|
|
225
|
+
refreshThreads,
|
|
226
|
+
getThreadMessages,
|
|
227
|
+
sendMessage,
|
|
228
|
+
markAsRead,
|
|
229
|
+
createThread
|
|
174
230
|
},
|
|
175
231
|
children
|
|
176
232
|
}
|
|
@@ -178,7 +234,7 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
178
234
|
}
|
|
179
235
|
|
|
180
236
|
// src/BugBearPanel.tsx
|
|
181
|
-
import { useState as useState2, useRef as useRef2, useEffect as useEffect2, useCallback as useCallback2 } from "react";
|
|
237
|
+
import { useState as useState2, useRef as useRef2, useEffect as useEffect2, useCallback as useCallback2, useMemo } from "react";
|
|
182
238
|
import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
183
239
|
function BugBearIcon({ size = 24, className = "" }) {
|
|
184
240
|
return /* @__PURE__ */ jsxs(
|
|
@@ -249,13 +305,77 @@ function BugBearPanel({
|
|
|
249
305
|
defaultCollapsed = false,
|
|
250
306
|
draggable = true
|
|
251
307
|
}) {
|
|
252
|
-
const { client, shouldShowWidget, testerInfo, assignments, currentAssignment, refreshAssignments, isLoading, onNavigate, updateTesterProfile, refreshTesterInfo, activeSession, sessionFindings, startSession, endSession, addFinding } = useBugBear();
|
|
308
|
+
const { client, shouldShowWidget, testerInfo, assignments, currentAssignment, refreshAssignments, isLoading, onNavigate, updateTesterProfile, refreshTesterInfo, activeSession, sessionFindings, startSession, endSession, addFinding, threads, unreadCount, refreshThreads, getThreadMessages, sendMessage, markAsRead, createThread } = useBugBear();
|
|
253
309
|
const [collapsed, setCollapsed] = useState2(defaultCollapsed);
|
|
254
310
|
const [activeTab, setActiveTab] = useState2("tests");
|
|
255
311
|
const [showSteps, setShowSteps] = useState2(false);
|
|
256
312
|
const [testView, setTestView] = useState2("detail");
|
|
257
313
|
const [selectedTestId, setSelectedTestId] = useState2(null);
|
|
314
|
+
const [messageView, setMessageView] = useState2("list");
|
|
315
|
+
const [selectedThread, setSelectedThread] = useState2(null);
|
|
316
|
+
const [threadMessages, setThreadMessages] = useState2([]);
|
|
317
|
+
const [replyText, setReplyText] = useState2("");
|
|
318
|
+
const [sendingReply, setSendingReply] = useState2(false);
|
|
319
|
+
const [loadingMessages, setLoadingMessages] = useState2(false);
|
|
320
|
+
const [composeSubject, setComposeSubject] = useState2("");
|
|
321
|
+
const [composeMessage, setComposeMessage] = useState2("");
|
|
322
|
+
const [sendingNewMessage, setSendingNewMessage] = useState2(false);
|
|
258
323
|
const displayedAssignment = selectedTestId ? assignments.find((a) => a.id === selectedTestId) || currentAssignment : currentAssignment;
|
|
324
|
+
const groupedAssignments = useMemo(() => {
|
|
325
|
+
const groups = /* @__PURE__ */ new Map();
|
|
326
|
+
for (const assignment of assignments) {
|
|
327
|
+
const groupId = assignment.testCase.group?.id || "ungrouped";
|
|
328
|
+
const group = assignment.testCase.group || null;
|
|
329
|
+
if (!groups.has(groupId)) {
|
|
330
|
+
groups.set(groupId, {
|
|
331
|
+
group,
|
|
332
|
+
assignments: [],
|
|
333
|
+
stats: { total: 0, passed: 0, failed: 0, pending: 0, skipped: 0 }
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
const folder = groups.get(groupId);
|
|
337
|
+
folder.assignments.push(assignment);
|
|
338
|
+
folder.stats.total++;
|
|
339
|
+
if (assignment.status === "passed") folder.stats.passed++;
|
|
340
|
+
else if (assignment.status === "failed") folder.stats.failed++;
|
|
341
|
+
else if (assignment.status === "skipped") folder.stats.skipped++;
|
|
342
|
+
else folder.stats.pending++;
|
|
343
|
+
}
|
|
344
|
+
const sortedGroups = Array.from(groups.values()).sort((a, b) => {
|
|
345
|
+
if (!a.group && !b.group) return 0;
|
|
346
|
+
if (!a.group) return 1;
|
|
347
|
+
if (!b.group) return -1;
|
|
348
|
+
return a.group.sortOrder - b.group.sortOrder;
|
|
349
|
+
});
|
|
350
|
+
return sortedGroups;
|
|
351
|
+
}, [assignments]);
|
|
352
|
+
const toggleFolderCollapse = useCallback2((groupId) => {
|
|
353
|
+
setCollapsedFolders((prev) => {
|
|
354
|
+
const next = new Set(prev);
|
|
355
|
+
if (next.has(groupId)) {
|
|
356
|
+
next.delete(groupId);
|
|
357
|
+
} else {
|
|
358
|
+
next.add(groupId);
|
|
359
|
+
}
|
|
360
|
+
return next;
|
|
361
|
+
});
|
|
362
|
+
}, []);
|
|
363
|
+
const getStatusBadge = (status) => {
|
|
364
|
+
switch (status) {
|
|
365
|
+
case "passed":
|
|
366
|
+
return { icon: "\u2705", label: "Passed", className: "bg-green-900/30 text-green-400" };
|
|
367
|
+
case "failed":
|
|
368
|
+
return { icon: "\u274C", label: "Failed", className: "bg-red-900/30 text-red-400" };
|
|
369
|
+
case "skipped":
|
|
370
|
+
return { icon: "\u23ED\uFE0F", label: "Skipped", className: "bg-yellow-900/30 text-yellow-400" };
|
|
371
|
+
case "in_progress":
|
|
372
|
+
return { icon: "\u{1F504}", label: "In Progress", className: "bg-blue-900/30 text-blue-400" };
|
|
373
|
+
case "blocked":
|
|
374
|
+
return { icon: "\u{1F6AB}", label: "Blocked", className: "bg-orange-900/30 text-orange-400" };
|
|
375
|
+
default:
|
|
376
|
+
return { icon: "\u23F3", label: "Pending", className: "bg-zinc-700 text-zinc-400" };
|
|
377
|
+
}
|
|
378
|
+
};
|
|
259
379
|
const [panelPosition, setPanelPosition] = useState2(null);
|
|
260
380
|
const [isDragging, setIsDragging] = useState2(false);
|
|
261
381
|
const dragStartRef = useRef2(null);
|
|
@@ -277,6 +397,10 @@ function BugBearPanel({
|
|
|
277
397
|
expectedResultUnclear: false
|
|
278
398
|
});
|
|
279
399
|
const [criteriaResults, setCriteriaResults] = useState2({});
|
|
400
|
+
const [showSkipModal, setShowSkipModal] = useState2(false);
|
|
401
|
+
const [selectedSkipReason, setSelectedSkipReason] = useState2(null);
|
|
402
|
+
const [skipNotes, setSkipNotes] = useState2("");
|
|
403
|
+
const [skipping, setSkipping] = useState2(false);
|
|
280
404
|
const [profileEditing, setProfileEditing] = useState2(false);
|
|
281
405
|
const [profileName, setProfileName] = useState2("");
|
|
282
406
|
const [profileAdditionalEmails, setProfileAdditionalEmails] = useState2([]);
|
|
@@ -285,6 +409,7 @@ function BugBearPanel({
|
|
|
285
409
|
const [savingProfile, setSavingProfile] = useState2(false);
|
|
286
410
|
const [profileSaved, setProfileSaved] = useState2(false);
|
|
287
411
|
const [showProfileOverlay, setShowProfileOverlay] = useState2(false);
|
|
412
|
+
const [collapsedFolders, setCollapsedFolders] = useState2(/* @__PURE__ */ new Set());
|
|
288
413
|
const [startingSession, setStartingSession] = useState2(false);
|
|
289
414
|
const [sessionFocusArea, setSessionFocusArea] = useState2("");
|
|
290
415
|
const [sessionPlatform, setSessionPlatform] = useState2("web");
|
|
@@ -488,6 +613,35 @@ function BugBearPanel({
|
|
|
488
613
|
expectedResultUnclear: false
|
|
489
614
|
});
|
|
490
615
|
};
|
|
616
|
+
const handleOpenSkipModal = () => {
|
|
617
|
+
setShowSkipModal(true);
|
|
618
|
+
setSelectedSkipReason(null);
|
|
619
|
+
setSkipNotes("");
|
|
620
|
+
};
|
|
621
|
+
const handleSkip = async () => {
|
|
622
|
+
if (!client || !displayedAssignment || !selectedSkipReason) return;
|
|
623
|
+
setSkipping(true);
|
|
624
|
+
const result = await client.skipAssignment(
|
|
625
|
+
displayedAssignment.id,
|
|
626
|
+
selectedSkipReason,
|
|
627
|
+
skipNotes.trim() || void 0
|
|
628
|
+
);
|
|
629
|
+
if (result.success) {
|
|
630
|
+
await refreshAssignments();
|
|
631
|
+
setShowSkipModal(false);
|
|
632
|
+
setSelectedSkipReason(null);
|
|
633
|
+
setSkipNotes("");
|
|
634
|
+
setSelectedTestId(null);
|
|
635
|
+
setTestView("detail");
|
|
636
|
+
}
|
|
637
|
+
setSkipping(false);
|
|
638
|
+
};
|
|
639
|
+
const skipReasonOptions = [
|
|
640
|
+
{ value: "blocked", label: "Blocked", description: "Environment issue or external blocker" },
|
|
641
|
+
{ value: "not_ready", label: "Not Ready", description: "Feature not yet implemented" },
|
|
642
|
+
{ value: "dependency", label: "Dependency", description: "Waiting on another test or task" },
|
|
643
|
+
{ value: "other", label: "Other", description: "Other reason (please specify)" }
|
|
644
|
+
];
|
|
491
645
|
const handleSubmitFeedback = async (skipFeedback = false) => {
|
|
492
646
|
if (!client || !displayedAssignment) return;
|
|
493
647
|
setSubmitting(true);
|
|
@@ -683,6 +837,87 @@ function BugBearPanel({
|
|
|
683
837
|
}
|
|
684
838
|
return `${m}:${s.toString().padStart(2, "0")}`;
|
|
685
839
|
};
|
|
840
|
+
const formatRelativeTime = (dateString) => {
|
|
841
|
+
const date = new Date(dateString);
|
|
842
|
+
const now = /* @__PURE__ */ new Date();
|
|
843
|
+
const diffMs = now.getTime() - date.getTime();
|
|
844
|
+
const diffMins = Math.floor(diffMs / 6e4);
|
|
845
|
+
const diffHours = Math.floor(diffMs / 36e5);
|
|
846
|
+
const diffDays = Math.floor(diffMs / 864e5);
|
|
847
|
+
if (diffMins < 1) return "Just now";
|
|
848
|
+
if (diffMins < 60) return `${diffMins}m ago`;
|
|
849
|
+
if (diffHours < 24) return `${diffHours}h ago`;
|
|
850
|
+
if (diffDays === 1) return "Yesterday";
|
|
851
|
+
if (diffDays < 7) return `${diffDays}d ago`;
|
|
852
|
+
return date.toLocaleDateString();
|
|
853
|
+
};
|
|
854
|
+
const formatMessageTime = (dateString) => {
|
|
855
|
+
const date = new Date(dateString);
|
|
856
|
+
return date.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
|
|
857
|
+
};
|
|
858
|
+
const getThreadTypeIcon = (type) => {
|
|
859
|
+
switch (type) {
|
|
860
|
+
case "announcement":
|
|
861
|
+
return "\u{1F4E2}";
|
|
862
|
+
case "direct":
|
|
863
|
+
return "\u{1F4AC}";
|
|
864
|
+
case "report":
|
|
865
|
+
return "\u{1F41B}";
|
|
866
|
+
case "general_note":
|
|
867
|
+
return "\u{1F4DD}";
|
|
868
|
+
default:
|
|
869
|
+
return "\u{1F4AC}";
|
|
870
|
+
}
|
|
871
|
+
};
|
|
872
|
+
const handleOpenThread = async (thread) => {
|
|
873
|
+
setSelectedThread(thread);
|
|
874
|
+
setMessageView("thread");
|
|
875
|
+
setLoadingMessages(true);
|
|
876
|
+
const messages = await getThreadMessages(thread.id);
|
|
877
|
+
setThreadMessages(messages);
|
|
878
|
+
setLoadingMessages(false);
|
|
879
|
+
if (thread.unreadCount > 0) {
|
|
880
|
+
await markAsRead(thread.id);
|
|
881
|
+
}
|
|
882
|
+
};
|
|
883
|
+
const handleSendReply = async () => {
|
|
884
|
+
if (!selectedThread || !replyText.trim()) return;
|
|
885
|
+
setSendingReply(true);
|
|
886
|
+
const success = await sendMessage(selectedThread.id, replyText.trim());
|
|
887
|
+
if (success) {
|
|
888
|
+
setReplyText("");
|
|
889
|
+
const messages = await getThreadMessages(selectedThread.id);
|
|
890
|
+
setThreadMessages(messages);
|
|
891
|
+
}
|
|
892
|
+
setSendingReply(false);
|
|
893
|
+
};
|
|
894
|
+
const handleBackToThreadList = () => {
|
|
895
|
+
setMessageView("list");
|
|
896
|
+
setSelectedThread(null);
|
|
897
|
+
setThreadMessages([]);
|
|
898
|
+
setReplyText("");
|
|
899
|
+
setComposeSubject("");
|
|
900
|
+
setComposeMessage("");
|
|
901
|
+
};
|
|
902
|
+
const handleStartNewMessage = () => {
|
|
903
|
+
setMessageView("compose");
|
|
904
|
+
setComposeSubject("");
|
|
905
|
+
setComposeMessage("");
|
|
906
|
+
};
|
|
907
|
+
const handleSendNewMessage = async () => {
|
|
908
|
+
if (!composeSubject.trim() || !composeMessage.trim()) return;
|
|
909
|
+
setSendingNewMessage(true);
|
|
910
|
+
const result = await createThread({
|
|
911
|
+
subject: composeSubject.trim(),
|
|
912
|
+
message: composeMessage.trim()
|
|
913
|
+
});
|
|
914
|
+
if (result.success) {
|
|
915
|
+
setComposeSubject("");
|
|
916
|
+
setComposeMessage("");
|
|
917
|
+
setMessageView("list");
|
|
918
|
+
}
|
|
919
|
+
setSendingNewMessage(false);
|
|
920
|
+
};
|
|
686
921
|
return /* @__PURE__ */ jsxs(
|
|
687
922
|
"div",
|
|
688
923
|
{
|
|
@@ -705,22 +940,22 @@ function BugBearPanel({
|
|
|
705
940
|
onClick: () => setCollapsed(false),
|
|
706
941
|
"data-drag-handle": true,
|
|
707
942
|
onDoubleClick: handleDoubleClick,
|
|
708
|
-
className: "flex items-center gap-2 px-3 py-2 bg-
|
|
943
|
+
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",
|
|
709
944
|
style: { cursor: draggable ? "grab" : "pointer" },
|
|
710
945
|
children: [
|
|
711
946
|
/* @__PURE__ */ jsx2(BugBearIcon, { size: 24 }),
|
|
712
947
|
/* @__PURE__ */ jsx2("span", { className: "font-medium", children: "BugBear" }),
|
|
713
|
-
pendingCount > 0 && /* @__PURE__ */ jsx2("span", { className: "bg-white text-
|
|
948
|
+
pendingCount > 0 && /* @__PURE__ */ jsx2("span", { className: "bg-white text-blue-400 text-xs font-bold px-1.5 py-0.5 rounded-full", children: pendingCount })
|
|
714
949
|
]
|
|
715
950
|
}
|
|
716
951
|
),
|
|
717
|
-
!collapsed && /* @__PURE__ */ jsxs("div", { className: "w-80 bg-
|
|
952
|
+
!collapsed && /* @__PURE__ */ jsxs("div", { className: "w-80 bg-zinc-900 rounded-xl shadow-2xl border border-zinc-800 overflow-hidden", children: [
|
|
718
953
|
/* @__PURE__ */ jsxs(
|
|
719
954
|
"div",
|
|
720
955
|
{
|
|
721
956
|
"data-drag-handle": true,
|
|
722
957
|
onDoubleClick: handleDoubleClick,
|
|
723
|
-
className: "bg-
|
|
958
|
+
className: "bg-zinc-950 text-white px-4 py-3 flex items-center justify-between border-b border-zinc-800",
|
|
724
959
|
style: { cursor: draggable ? isDragging ? "grabbing" : "grab" : "default" },
|
|
725
960
|
children: [
|
|
726
961
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
@@ -728,13 +963,13 @@ function BugBearPanel({
|
|
|
728
963
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
729
964
|
/* @__PURE__ */ jsxs("h3", { className: "font-semibold text-sm flex items-center gap-2", children: [
|
|
730
965
|
"BugBear",
|
|
731
|
-
draggable && /* @__PURE__ */ jsx2("span", { className: "text-
|
|
966
|
+
draggable && /* @__PURE__ */ jsx2("span", { className: "text-zinc-500 text-xs", title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
|
|
732
967
|
] }),
|
|
733
968
|
/* @__PURE__ */ jsxs(
|
|
734
969
|
"button",
|
|
735
970
|
{
|
|
736
971
|
onClick: handleOpenProfile,
|
|
737
|
-
className: "text-
|
|
972
|
+
className: "text-zinc-400 text-xs flex items-center gap-1 hover:text-white transition-colors",
|
|
738
973
|
children: [
|
|
739
974
|
testerInfo?.name,
|
|
740
975
|
/* @__PURE__ */ jsx2("span", { className: "text-[10px]", children: "\u270E" })
|
|
@@ -747,23 +982,33 @@ function BugBearPanel({
|
|
|
747
982
|
"button",
|
|
748
983
|
{
|
|
749
984
|
onClick: () => setCollapsed(true),
|
|
750
|
-
className: "p-1 hover:bg-
|
|
985
|
+
className: "p-1 hover:bg-zinc-800 rounded",
|
|
751
986
|
children: /* @__PURE__ */ jsx2("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx2("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) })
|
|
752
987
|
}
|
|
753
988
|
)
|
|
754
989
|
]
|
|
755
990
|
}
|
|
756
991
|
),
|
|
757
|
-
/* @__PURE__ */ jsxs("div", { className: "flex
|
|
992
|
+
/* @__PURE__ */ jsxs("div", { className: "flex border-b border-zinc-800 bg-zinc-900", children: [
|
|
758
993
|
/* @__PURE__ */ jsxs(
|
|
759
994
|
"button",
|
|
760
995
|
{
|
|
761
996
|
onClick: () => setActiveTab("tests"),
|
|
762
|
-
className: `flex-1 py-
|
|
997
|
+
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"}`,
|
|
763
998
|
children: [
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
999
|
+
"Tests ",
|
|
1000
|
+
pendingCount > 0 && `(${pendingCount})`
|
|
1001
|
+
]
|
|
1002
|
+
}
|
|
1003
|
+
),
|
|
1004
|
+
/* @__PURE__ */ jsxs(
|
|
1005
|
+
"button",
|
|
1006
|
+
{
|
|
1007
|
+
onClick: () => setActiveTab("messages"),
|
|
1008
|
+
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"}`,
|
|
1009
|
+
children: [
|
|
1010
|
+
"Messages",
|
|
1011
|
+
unreadCount > 0 && /* @__PURE__ */ jsx2("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 })
|
|
767
1012
|
]
|
|
768
1013
|
}
|
|
769
1014
|
),
|
|
@@ -771,100 +1016,165 @@ function BugBearPanel({
|
|
|
771
1016
|
"button",
|
|
772
1017
|
{
|
|
773
1018
|
onClick: () => setActiveTab("session"),
|
|
774
|
-
className: `flex-1 py-
|
|
1019
|
+
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"}`,
|
|
775
1020
|
children: [
|
|
776
|
-
|
|
777
|
-
/* @__PURE__ */ jsx2("span", {
|
|
778
|
-
activeSession && /* @__PURE__ */ jsx2("span", { className: "absolute -top-1 -right-1 w-3 h-3 bg-green-500 rounded-full border-2 border-white animate-pulse" })
|
|
1021
|
+
"Explore",
|
|
1022
|
+
activeSession && /* @__PURE__ */ jsx2("span", { className: "absolute top-2 ml-14 w-2 h-2 bg-green-500 rounded-full animate-pulse" })
|
|
779
1023
|
]
|
|
780
1024
|
}
|
|
1025
|
+
),
|
|
1026
|
+
/* @__PURE__ */ jsx2(
|
|
1027
|
+
"button",
|
|
1028
|
+
{
|
|
1029
|
+
onClick: () => setActiveTab("report"),
|
|
1030
|
+
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"}`,
|
|
1031
|
+
children: "Report"
|
|
1032
|
+
}
|
|
781
1033
|
)
|
|
782
1034
|
] }),
|
|
783
|
-
/* @__PURE__ */ jsx2("div", { className: "flex justify-center py-1.5 border-b border-gray-200 bg-white", children: /* @__PURE__ */ jsx2(
|
|
784
|
-
"button",
|
|
785
|
-
{
|
|
786
|
-
onClick: () => setActiveTab("report"),
|
|
787
|
-
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"}`,
|
|
788
|
-
children: "\u{1F41B} Report Bug / Feedback"
|
|
789
|
-
}
|
|
790
|
-
) }),
|
|
791
1035
|
/* @__PURE__ */ jsxs("div", { className: "p-4 max-h-96 overflow-y-auto", children: [
|
|
792
1036
|
activeTab === "tests" && /* @__PURE__ */ jsx2("div", { children: assignments.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "text-center py-8", children: [
|
|
793
1037
|
/* @__PURE__ */ jsx2("span", { className: "text-4xl", children: "\u2705" }),
|
|
794
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
795
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
1038
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-400 mt-2 font-medium", children: "All caught up!" }),
|
|
1039
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-500 text-sm", children: "No tests assigned" })
|
|
796
1040
|
] }) : testView === "list" ? (
|
|
797
|
-
/* List View - Show
|
|
798
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-
|
|
799
|
-
/* @__PURE__ */
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
"
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
1041
|
+
/* List View - Show tests grouped by folder */
|
|
1042
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
1043
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2 px-1", children: [
|
|
1044
|
+
/* @__PURE__ */ jsxs("span", { className: "text-xs font-medium text-zinc-500", children: [
|
|
1045
|
+
assignments.length,
|
|
1046
|
+
" test",
|
|
1047
|
+
assignments.length !== 1 ? "s" : "",
|
|
1048
|
+
" assigned"
|
|
1049
|
+
] }),
|
|
1050
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs", children: [
|
|
1051
|
+
/* @__PURE__ */ jsxs("span", { className: "text-green-400", children: [
|
|
1052
|
+
"\u2705 ",
|
|
1053
|
+
assignments.filter((a) => a.status === "passed").length
|
|
1054
|
+
] }),
|
|
1055
|
+
/* @__PURE__ */ jsxs("span", { className: "text-red-400", children: [
|
|
1056
|
+
"\u274C ",
|
|
1057
|
+
assignments.filter((a) => a.status === "failed").length
|
|
1058
|
+
] }),
|
|
1059
|
+
/* @__PURE__ */ jsxs("span", { className: "text-zinc-500", children: [
|
|
1060
|
+
"\u23F3 ",
|
|
1061
|
+
assignments.filter((a) => a.status === "pending" || a.status === "in_progress").length
|
|
1062
|
+
] })
|
|
1063
|
+
] })
|
|
1064
|
+
] }),
|
|
1065
|
+
groupedAssignments.map((folder) => {
|
|
1066
|
+
const groupId = folder.group?.id || "ungrouped";
|
|
1067
|
+
const isCollapsed = collapsedFolders.has(groupId);
|
|
1068
|
+
const completedCount = folder.stats.passed + folder.stats.failed + folder.stats.skipped;
|
|
1069
|
+
return /* @__PURE__ */ jsxs("div", { className: "border border-zinc-700 rounded-lg overflow-hidden", children: [
|
|
1070
|
+
/* @__PURE__ */ jsxs(
|
|
1071
|
+
"button",
|
|
1072
|
+
{
|
|
1073
|
+
onClick: () => toggleFolderCollapse(groupId),
|
|
1074
|
+
className: "w-full flex items-center justify-between p-2.5 bg-zinc-800 hover:bg-zinc-700 transition-colors",
|
|
1075
|
+
children: [
|
|
1076
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1077
|
+
/* @__PURE__ */ jsx2("span", { className: "text-sm", children: isCollapsed ? "\u{1F4C1}" : "\u{1F4C2}" }),
|
|
1078
|
+
/* @__PURE__ */ jsx2("span", { className: "font-medium text-sm text-zinc-100", children: folder.group?.name || "Other Tests" }),
|
|
1079
|
+
/* @__PURE__ */ jsxs("span", { className: "text-xs text-zinc-500", children: [
|
|
1080
|
+
"(",
|
|
1081
|
+
completedCount,
|
|
1082
|
+
"/",
|
|
1083
|
+
folder.stats.total,
|
|
1084
|
+
")"
|
|
1085
|
+
] })
|
|
1086
|
+
] }),
|
|
1087
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1088
|
+
/* @__PURE__ */ jsx2("div", { className: "w-16 h-1.5 bg-zinc-700 rounded-full overflow-hidden", children: /* @__PURE__ */ jsx2(
|
|
1089
|
+
"div",
|
|
1090
|
+
{
|
|
1091
|
+
className: "h-full bg-green-500 transition-all",
|
|
1092
|
+
style: { width: `${completedCount / folder.stats.total * 100}%` }
|
|
1093
|
+
}
|
|
1094
|
+
) }),
|
|
1095
|
+
/* @__PURE__ */ jsx2("span", { className: "text-zinc-500 text-xs", children: isCollapsed ? "\u25B6" : "\u25BC" })
|
|
1096
|
+
] })
|
|
1097
|
+
]
|
|
1098
|
+
}
|
|
1099
|
+
),
|
|
1100
|
+
!isCollapsed && /* @__PURE__ */ jsx2("div", { className: "divide-y divide-zinc-800", children: folder.assignments.map((assignment) => {
|
|
1101
|
+
const statusBadge = getStatusBadge(assignment.status);
|
|
1102
|
+
return /* @__PURE__ */ jsxs(
|
|
1103
|
+
"button",
|
|
1104
|
+
{
|
|
1105
|
+
onClick: () => {
|
|
1106
|
+
setSelectedTestId(assignment.id);
|
|
1107
|
+
setTestView("detail");
|
|
1108
|
+
setShowSteps(false);
|
|
1109
|
+
},
|
|
1110
|
+
className: `w-full text-left p-3 transition-colors ${assignment.id === currentAssignment?.id ? "bg-blue-950/30" : "bg-zinc-900 hover:bg-zinc-800"}`,
|
|
1111
|
+
children: [
|
|
1112
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between mb-1", children: [
|
|
1113
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1114
|
+
/* @__PURE__ */ jsx2("span", { className: "text-xs font-mono text-zinc-500", children: assignment.testCase.testKey }),
|
|
1115
|
+
assignment.isVerification && /* @__PURE__ */ jsx2("span", { className: "text-xs px-1.5 py-0.5 rounded bg-green-900/30 text-green-400 font-medium", children: "\u{1F527} Verify" })
|
|
1116
|
+
] }),
|
|
1117
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
1118
|
+
/* @__PURE__ */ jsxs("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${statusBadge.className}`, children: [
|
|
1119
|
+
statusBadge.icon,
|
|
1120
|
+
" ",
|
|
1121
|
+
statusBadge.label
|
|
1122
|
+
] }),
|
|
1123
|
+
/* @__PURE__ */ jsx2("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 })
|
|
1124
|
+
] })
|
|
1125
|
+
] }),
|
|
1126
|
+
/* @__PURE__ */ jsx2("h4", { className: "font-medium text-zinc-100 text-sm line-clamp-2", children: assignment.testCase.title }),
|
|
1127
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1 text-xs text-zinc-500", children: [
|
|
1128
|
+
assignment.testCase.track && /* @__PURE__ */ jsx2(
|
|
1129
|
+
"span",
|
|
1130
|
+
{
|
|
1131
|
+
className: "px-1 py-0.5 rounded text-white",
|
|
1132
|
+
style: { backgroundColor: assignment.testCase.track.color },
|
|
1133
|
+
children: templateInfo[assignment.testCase.track.testTemplate || "steps"].icon
|
|
1134
|
+
}
|
|
1135
|
+
),
|
|
1136
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
1137
|
+
assignment.testCase.steps.length,
|
|
1138
|
+
" ",
|
|
1139
|
+
assignment.testCase.track?.testTemplate === "checklist" ? "items" : assignment.testCase.track?.testTemplate === "rubric" ? "criteria" : "steps"
|
|
1140
|
+
] }),
|
|
1141
|
+
assignment.id === currentAssignment?.id && /* @__PURE__ */ jsx2("span", { className: "text-blue-400 font-medium", children: "\u2022 Current" })
|
|
1142
|
+
] })
|
|
1143
|
+
]
|
|
1144
|
+
},
|
|
1145
|
+
assignment.id
|
|
1146
|
+
);
|
|
1147
|
+
}) })
|
|
1148
|
+
] }, groupId);
|
|
1149
|
+
})
|
|
840
1150
|
] })
|
|
841
1151
|
) : showFeedbackPrompt && displayedAssignment ? (
|
|
842
1152
|
/* Feedback prompt after completing a test */
|
|
843
1153
|
/* @__PURE__ */ jsxs("div", { className: "p-3", children: [
|
|
844
1154
|
/* @__PURE__ */ jsxs("div", { className: "text-center mb-4", children: [
|
|
845
1155
|
/* @__PURE__ */ jsx2("span", { className: "text-3xl", children: pendingFeedbackStatus === "passed" ? "\u2713" : "\u2717" }),
|
|
846
|
-
/* @__PURE__ */ jsx2("p", { className: `font-semibold mt-1 ${pendingFeedbackStatus === "passed" ? "text-green-
|
|
1156
|
+
/* @__PURE__ */ jsx2("p", { className: `font-semibold mt-1 ${pendingFeedbackStatus === "passed" ? "text-green-400" : "text-red-400"}`, children: pendingFeedbackStatus === "passed" ? "Test Passed!" : "Test Failed" })
|
|
847
1157
|
] }),
|
|
848
|
-
/* @__PURE__ */ jsxs("div", { className: "bg-
|
|
849
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
850
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
1158
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-blue-950/30 border border-blue-900 rounded-lg p-3 mb-4", children: [
|
|
1159
|
+
/* @__PURE__ */ jsx2("p", { className: "text-blue-300 text-sm font-medium mb-1", children: "Help us improve this test" }),
|
|
1160
|
+
/* @__PURE__ */ jsx2("p", { className: "text-blue-400 text-xs", children: "Your feedback shapes better tests for everyone." })
|
|
851
1161
|
] }),
|
|
852
1162
|
/* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
853
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1163
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-400 mb-2", children: "How was this test?" }),
|
|
854
1164
|
/* @__PURE__ */ jsx2("div", { className: "flex items-center gap-1 justify-center", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx2(
|
|
855
1165
|
"button",
|
|
856
1166
|
{
|
|
857
1167
|
type: "button",
|
|
858
1168
|
onClick: () => setFeedbackRating(star),
|
|
859
|
-
className: `text-2xl transition-colors ${star <= feedbackRating ? "text-yellow-400" : "text-
|
|
1169
|
+
className: `text-2xl transition-colors ${star <= feedbackRating ? "text-yellow-400" : "text-zinc-600"} hover:text-yellow-400`,
|
|
860
1170
|
children: "\u2605"
|
|
861
1171
|
},
|
|
862
1172
|
star
|
|
863
1173
|
)) }),
|
|
864
|
-
/* @__PURE__ */ jsx2("p", { className: "text-center text-xs text-
|
|
1174
|
+
/* @__PURE__ */ jsx2("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!" })
|
|
865
1175
|
] }),
|
|
866
1176
|
feedbackRating < 4 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
867
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1177
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-400 mb-2", children: "What could be improved?" }),
|
|
868
1178
|
/* @__PURE__ */ jsx2("div", { className: "grid grid-cols-2 gap-2", children: [
|
|
869
1179
|
{ key: "stepsUnclear", label: "Steps unclear" },
|
|
870
1180
|
{ key: "expectedResultUnclear", label: "Expected result unclear" },
|
|
@@ -875,21 +1185,21 @@ function BugBearPanel({
|
|
|
875
1185
|
{
|
|
876
1186
|
type: "button",
|
|
877
1187
|
onClick: () => setFeedbackFlags((prev) => ({ ...prev, [key]: !prev[key] })),
|
|
878
|
-
className: `px-2 py-1.5 rounded text-xs font-medium border transition-colors ${feedbackFlags[key] ? "bg-
|
|
1188
|
+
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"}`,
|
|
879
1189
|
children: label
|
|
880
1190
|
},
|
|
881
1191
|
key
|
|
882
1192
|
)) })
|
|
883
1193
|
] }),
|
|
884
1194
|
/* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
885
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1195
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-400 mb-1", children: "Suggestions? (optional)" }),
|
|
886
1196
|
/* @__PURE__ */ jsx2(
|
|
887
1197
|
"textarea",
|
|
888
1198
|
{
|
|
889
1199
|
value: feedbackNote,
|
|
890
1200
|
onChange: (e) => setFeedbackNote(e.target.value),
|
|
891
1201
|
placeholder: "How could this test be improved?",
|
|
892
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
1202
|
+
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",
|
|
893
1203
|
rows: 2
|
|
894
1204
|
}
|
|
895
1205
|
)
|
|
@@ -900,7 +1210,7 @@ function BugBearPanel({
|
|
|
900
1210
|
{
|
|
901
1211
|
onClick: handleSkipFeedback,
|
|
902
1212
|
disabled: submitting,
|
|
903
|
-
className: "flex-1 px-3 py-2 text-sm font-medium text-
|
|
1213
|
+
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",
|
|
904
1214
|
children: "Skip"
|
|
905
1215
|
}
|
|
906
1216
|
),
|
|
@@ -909,7 +1219,7 @@ function BugBearPanel({
|
|
|
909
1219
|
{
|
|
910
1220
|
onClick: () => handleSubmitFeedback(false),
|
|
911
1221
|
disabled: submitting,
|
|
912
|
-
className: "flex-1 px-3 py-2 text-sm font-medium text-white bg-
|
|
1222
|
+
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",
|
|
913
1223
|
children: submitting ? "Submitting..." : "Submit Feedback"
|
|
914
1224
|
}
|
|
915
1225
|
)
|
|
@@ -919,8 +1229,8 @@ function BugBearPanel({
|
|
|
919
1229
|
/* Success state after passing */
|
|
920
1230
|
/* @__PURE__ */ jsxs("div", { className: "text-center py-8", children: [
|
|
921
1231
|
/* @__PURE__ */ jsx2("span", { className: "text-5xl", children: "\u2713" }),
|
|
922
|
-
/* @__PURE__ */ jsx2("p", { className: "text-green-
|
|
923
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
1232
|
+
/* @__PURE__ */ jsx2("p", { className: "text-green-400 mt-3 font-semibold text-lg", children: "Passed!" }),
|
|
1233
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-500 text-sm mt-1", children: "Loading next test..." })
|
|
924
1234
|
] })
|
|
925
1235
|
) : displayedAssignment ? (
|
|
926
1236
|
/* Detail View - Show single test */
|
|
@@ -932,7 +1242,7 @@ function BugBearPanel({
|
|
|
932
1242
|
setTestView("list");
|
|
933
1243
|
setSelectedTestId(null);
|
|
934
1244
|
},
|
|
935
|
-
className: "flex items-center gap-1 text-xs text-
|
|
1245
|
+
className: "flex items-center gap-1 text-xs text-blue-400 font-medium hover:text-blue-300 mb-2",
|
|
936
1246
|
children: [
|
|
937
1247
|
"\u2190 All Tests (",
|
|
938
1248
|
assignments.length,
|
|
@@ -940,9 +1250,53 @@ function BugBearPanel({
|
|
|
940
1250
|
]
|
|
941
1251
|
}
|
|
942
1252
|
),
|
|
943
|
-
|
|
1253
|
+
(() => {
|
|
1254
|
+
const currentGroup = displayedAssignment.testCase.group;
|
|
1255
|
+
const groupAssignments = currentGroup ? assignments.filter((a) => a.testCase.group?.id === currentGroup.id) : assignments;
|
|
1256
|
+
const completed = groupAssignments.filter(
|
|
1257
|
+
(a) => a.status === "passed" || a.status === "failed" || a.status === "skipped"
|
|
1258
|
+
).length;
|
|
1259
|
+
const total = groupAssignments.length;
|
|
1260
|
+
const progressPercent = total > 0 ? completed / total * 100 : 0;
|
|
1261
|
+
return /* @__PURE__ */ jsxs("div", { className: "mb-3 p-2 bg-blue-950/30 rounded-lg", children: [
|
|
1262
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-1.5", children: [
|
|
1263
|
+
/* @__PURE__ */ jsx2("span", { className: "text-xs font-medium text-blue-300", children: currentGroup ? `\u{1F4C1} ${currentGroup.name}` : "\u{1F4CB} All Tests" }),
|
|
1264
|
+
/* @__PURE__ */ jsxs("span", { className: "text-xs text-blue-400", children: [
|
|
1265
|
+
completed,
|
|
1266
|
+
"/",
|
|
1267
|
+
total,
|
|
1268
|
+
" complete"
|
|
1269
|
+
] })
|
|
1270
|
+
] }),
|
|
1271
|
+
/* @__PURE__ */ jsx2("div", { className: "w-full h-2 bg-zinc-700 rounded-full overflow-hidden", children: /* @__PURE__ */ jsx2(
|
|
1272
|
+
"div",
|
|
1273
|
+
{
|
|
1274
|
+
className: "h-full bg-blue-500 transition-all duration-300",
|
|
1275
|
+
style: { width: `${progressPercent}%` }
|
|
1276
|
+
}
|
|
1277
|
+
) }),
|
|
1278
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between mt-1 text-[10px] text-blue-400", children: [
|
|
1279
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
1280
|
+
"\u2705 ",
|
|
1281
|
+
groupAssignments.filter((a) => a.status === "passed").length,
|
|
1282
|
+
" passed"
|
|
1283
|
+
] }),
|
|
1284
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
1285
|
+
"\u274C ",
|
|
1286
|
+
groupAssignments.filter((a) => a.status === "failed").length,
|
|
1287
|
+
" failed"
|
|
1288
|
+
] }),
|
|
1289
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
1290
|
+
"\u23ED\uFE0F ",
|
|
1291
|
+
groupAssignments.filter((a) => a.status === "skipped").length,
|
|
1292
|
+
" skipped"
|
|
1293
|
+
] })
|
|
1294
|
+
] })
|
|
1295
|
+
] });
|
|
1296
|
+
})(),
|
|
1297
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-zinc-800 rounded-lg p-3 mb-3", children: [
|
|
944
1298
|
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between mb-2", children: [
|
|
945
|
-
/* @__PURE__ */ jsx2("span", { className: "text-xs font-mono text-
|
|
1299
|
+
/* @__PURE__ */ jsx2("span", { className: "text-xs font-mono text-zinc-500", children: displayedAssignment.testCase.testKey }),
|
|
946
1300
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
947
1301
|
displayedAssignment.testCase.track && /* @__PURE__ */ jsx2(
|
|
948
1302
|
"span",
|
|
@@ -952,11 +1306,11 @@ function BugBearPanel({
|
|
|
952
1306
|
children: templateInfo[displayedAssignment.testCase.track.testTemplate || "steps"].icon
|
|
953
1307
|
}
|
|
954
1308
|
),
|
|
955
|
-
/* @__PURE__ */ jsx2("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${displayedAssignment.testCase.priority === "P0" ? "bg-red-
|
|
1309
|
+
/* @__PURE__ */ jsx2("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 })
|
|
956
1310
|
] })
|
|
957
1311
|
] }),
|
|
958
|
-
/* @__PURE__ */ jsx2("h4", { className: "font-medium text-
|
|
959
|
-
displayedAssignment.status === "in_progress" && displayedAssignment.startedAt && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 mb-2 text-xs text-green-
|
|
1312
|
+
/* @__PURE__ */ jsx2("h4", { className: "font-medium text-zinc-100 text-sm mb-1", children: displayedAssignment.testCase.title }),
|
|
1313
|
+
displayedAssignment.status === "in_progress" && displayedAssignment.startedAt && /* @__PURE__ */ 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: [
|
|
960
1314
|
/* @__PURE__ */ jsxs("span", { className: "relative flex h-2 w-2", children: [
|
|
961
1315
|
/* @__PURE__ */ jsx2("span", { className: "animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75" }),
|
|
962
1316
|
/* @__PURE__ */ jsx2("span", { className: "relative inline-flex rounded-full h-2 w-2 bg-green-500" })
|
|
@@ -964,12 +1318,12 @@ function BugBearPanel({
|
|
|
964
1318
|
/* @__PURE__ */ jsx2("span", { className: "font-medium", children: "Testing" }),
|
|
965
1319
|
/* @__PURE__ */ jsx2("span", { className: "font-mono", children: formatElapsedTime(assignmentElapsedTime) })
|
|
966
1320
|
] }),
|
|
967
|
-
displayedAssignment.testCase.description && /* @__PURE__ */ jsx2("p", { className: "text-
|
|
1321
|
+
displayedAssignment.testCase.description && /* @__PURE__ */ jsx2("p", { className: "text-zinc-500 text-xs mb-2", children: displayedAssignment.testCase.description }),
|
|
968
1322
|
displayedAssignment.testCase.targetRoute && onNavigate && /* @__PURE__ */ jsxs(
|
|
969
1323
|
"button",
|
|
970
1324
|
{
|
|
971
1325
|
onClick: () => onNavigate(displayedAssignment.testCase.targetRoute),
|
|
972
|
-
className: "w-full mb-2 py-1.5 px-3 bg-blue-
|
|
1326
|
+
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",
|
|
973
1327
|
children: [
|
|
974
1328
|
/* @__PURE__ */ jsx2("span", { children: "Go to test location" }),
|
|
975
1329
|
/* @__PURE__ */ jsx2("span", { children: "\u2192" })
|
|
@@ -992,7 +1346,7 @@ function BugBearPanel({
|
|
|
992
1346
|
children: [
|
|
993
1347
|
/* @__PURE__ */ jsx2("span", { children: info.icon }),
|
|
994
1348
|
/* @__PURE__ */ jsx2("span", { className: "font-medium", children: info.name }),
|
|
995
|
-
/* @__PURE__ */ jsxs("span", { className: "text-
|
|
1349
|
+
/* @__PURE__ */ jsxs("span", { className: "text-zinc-500", children: [
|
|
996
1350
|
"\u2022 ",
|
|
997
1351
|
info.action
|
|
998
1352
|
] })
|
|
@@ -1003,7 +1357,7 @@ function BugBearPanel({
|
|
|
1003
1357
|
"button",
|
|
1004
1358
|
{
|
|
1005
1359
|
onClick: () => setShowSteps(!showSteps),
|
|
1006
|
-
className: "text-
|
|
1360
|
+
className: "text-blue-400 text-xs font-medium hover:text-blue-300 flex items-center gap-1",
|
|
1007
1361
|
children: [
|
|
1008
1362
|
showSteps ? "\u25BC" : "\u25B6",
|
|
1009
1363
|
" ",
|
|
@@ -1012,10 +1366,10 @@ function BugBearPanel({
|
|
|
1012
1366
|
}
|
|
1013
1367
|
),
|
|
1014
1368
|
showSteps && template === "steps" && /* @__PURE__ */ jsx2("div", { className: "mt-2 space-y-2", children: steps.map((step, idx) => /* @__PURE__ */ jsxs("div", { className: "flex gap-2 text-xs", children: [
|
|
1015
|
-
/* @__PURE__ */ jsx2("span", { className: "w-5 h-5 rounded-full bg-
|
|
1369
|
+
/* @__PURE__ */ jsx2("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 }),
|
|
1016
1370
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1017
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
1018
|
-
step.expectedResult && /* @__PURE__ */ jsxs("p", { className: "text-
|
|
1371
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-300", children: step.action }),
|
|
1372
|
+
step.expectedResult && /* @__PURE__ */ jsxs("p", { className: "text-zinc-500 mt-0.5", children: [
|
|
1019
1373
|
"\u2192 ",
|
|
1020
1374
|
step.expectedResult
|
|
1021
1375
|
] })
|
|
@@ -1034,39 +1388,39 @@ function BugBearPanel({
|
|
|
1034
1388
|
}
|
|
1035
1389
|
return newResults;
|
|
1036
1390
|
}),
|
|
1037
|
-
className: `w-full flex items-center gap-2 text-xs p-2 rounded border transition-colors text-left ${criteriaResults[idx] === true ? "bg-green-
|
|
1391
|
+
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"}`,
|
|
1038
1392
|
children: [
|
|
1039
1393
|
/* @__PURE__ */ jsx2("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" : "" }),
|
|
1040
|
-
/* @__PURE__ */ jsx2("p", { className: `flex-1 ${criteriaResults[idx] === true ? "text-green-
|
|
1394
|
+
/* @__PURE__ */ jsx2("p", { className: `flex-1 ${criteriaResults[idx] === true ? "text-green-400" : "text-zinc-300"}`, children: step.action })
|
|
1041
1395
|
]
|
|
1042
1396
|
},
|
|
1043
1397
|
idx
|
|
1044
1398
|
)),
|
|
1045
1399
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mt-2", children: [
|
|
1046
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xs text-
|
|
1400
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xs text-zinc-500", children: "Tap to check off each item." }),
|
|
1047
1401
|
Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ jsx2(
|
|
1048
1402
|
"button",
|
|
1049
1403
|
{
|
|
1050
1404
|
onClick: () => setCriteriaResults({}),
|
|
1051
|
-
className: "text-xs text-
|
|
1405
|
+
className: "text-xs text-zinc-500 hover:text-red-500 transition-colors",
|
|
1052
1406
|
children: "\u21BA Reset"
|
|
1053
1407
|
}
|
|
1054
1408
|
)
|
|
1055
1409
|
] })
|
|
1056
1410
|
] }),
|
|
1057
1411
|
showSteps && template === "rubric" && /* @__PURE__ */ jsxs("div", { className: "mt-2 space-y-2", children: [
|
|
1058
|
-
steps.map((step, idx) => /* @__PURE__ */ jsxs("div", { className: "bg-
|
|
1412
|
+
steps.map((step, idx) => /* @__PURE__ */ jsxs("div", { className: "bg-zinc-800 p-2 rounded border border-zinc-700", children: [
|
|
1059
1413
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs mb-1", children: [
|
|
1060
|
-
/* @__PURE__ */ jsx2("span", { className: "w-5 h-5 rounded bg-
|
|
1061
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
1414
|
+
/* @__PURE__ */ jsx2("span", { className: "w-5 h-5 rounded bg-blue-900/50 text-blue-300 flex items-center justify-center font-medium", children: idx + 1 }),
|
|
1415
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-100 font-medium flex-1", children: step.action })
|
|
1062
1416
|
] }),
|
|
1063
|
-
step.expectedResult && /* @__PURE__ */ jsx2("p", { className: "text-xs text-
|
|
1417
|
+
step.expectedResult && /* @__PURE__ */ jsx2("p", { className: "text-xs text-zinc-500 ml-7 mb-2", children: step.expectedResult }),
|
|
1064
1418
|
rubricMode === "pass_fail" && /* @__PURE__ */ jsxs("div", { className: "flex gap-2 ml-7", children: [
|
|
1065
1419
|
/* @__PURE__ */ jsx2(
|
|
1066
1420
|
"button",
|
|
1067
1421
|
{
|
|
1068
1422
|
onClick: () => setCriteriaResults((prev) => ({ ...prev, [idx]: true })),
|
|
1069
|
-
className: `flex-1 py-1 px-2 rounded text-xs font-medium transition-colors ${criteriaResults[idx] === true ? "bg-green-500 text-white" : "bg-
|
|
1423
|
+
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"}`,
|
|
1070
1424
|
children: "\u2713 Pass"
|
|
1071
1425
|
}
|
|
1072
1426
|
),
|
|
@@ -1074,7 +1428,7 @@ function BugBearPanel({
|
|
|
1074
1428
|
"button",
|
|
1075
1429
|
{
|
|
1076
1430
|
onClick: () => setCriteriaResults((prev) => ({ ...prev, [idx]: false })),
|
|
1077
|
-
className: `flex-1 py-1 px-2 rounded text-xs font-medium transition-colors ${criteriaResults[idx] === false ? "bg-red-500 text-white" : "bg-
|
|
1431
|
+
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"}`,
|
|
1078
1432
|
children: "\u2717 Fail"
|
|
1079
1433
|
}
|
|
1080
1434
|
)
|
|
@@ -1083,28 +1437,28 @@ function BugBearPanel({
|
|
|
1083
1437
|
"button",
|
|
1084
1438
|
{
|
|
1085
1439
|
onClick: () => setCriteriaResults((prev) => ({ ...prev, [idx]: n })),
|
|
1086
|
-
className: `w-8 h-8 rounded font-medium text-sm transition-colors ${criteriaResults[idx] === n ? "bg-
|
|
1440
|
+
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"}`,
|
|
1087
1441
|
children: n
|
|
1088
1442
|
},
|
|
1089
1443
|
n
|
|
1090
1444
|
)) })
|
|
1091
1445
|
] }, idx)),
|
|
1092
1446
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mt-2", children: [
|
|
1093
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xs text-
|
|
1447
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xs text-zinc-500", children: rubricMode === "rating" ? "Rate 1-5 for each criterion." : "Mark each criterion as Pass or Fail." }),
|
|
1094
1448
|
Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ jsx2(
|
|
1095
1449
|
"button",
|
|
1096
1450
|
{
|
|
1097
1451
|
onClick: () => setCriteriaResults({}),
|
|
1098
|
-
className: "text-xs text-
|
|
1452
|
+
className: "text-xs text-zinc-500 hover:text-red-500 transition-colors",
|
|
1099
1453
|
children: "\u21BA Reset"
|
|
1100
1454
|
}
|
|
1101
1455
|
)
|
|
1102
1456
|
] })
|
|
1103
1457
|
] }),
|
|
1104
|
-
showSteps && template === "freeform" && /* @__PURE__ */ jsxs("div", { className: "mt-2 p-2 bg-amber-
|
|
1105
|
-
/* @__PURE__ */ jsx2("p", { className: "text-amber-
|
|
1106
|
-
/* @__PURE__ */ jsx2("p", { className: "text-amber-
|
|
1107
|
-
/* @__PURE__ */ jsxs("ul", { className: "text-amber-
|
|
1458
|
+
showSteps && template === "freeform" && /* @__PURE__ */ jsxs("div", { className: "mt-2 p-2 bg-amber-900/20 rounded border border-amber-800 text-xs", children: [
|
|
1459
|
+
/* @__PURE__ */ jsx2("p", { className: "text-amber-300 font-medium mb-1", children: "\u{1F4AD} Open Observation" }),
|
|
1460
|
+
/* @__PURE__ */ jsx2("p", { className: "text-amber-400", children: "Review the area described above and note:" }),
|
|
1461
|
+
/* @__PURE__ */ jsxs("ul", { className: "text-amber-400 mt-1 ml-4 list-disc", children: [
|
|
1108
1462
|
/* @__PURE__ */ jsx2("li", { children: "What works well" }),
|
|
1109
1463
|
/* @__PURE__ */ jsx2("li", { children: "Issues or concerns" }),
|
|
1110
1464
|
/* @__PURE__ */ jsx2("li", { children: "Suggestions" })
|
|
@@ -1112,7 +1466,7 @@ function BugBearPanel({
|
|
|
1112
1466
|
] })
|
|
1113
1467
|
] });
|
|
1114
1468
|
})(),
|
|
1115
|
-
/* @__PURE__ */ jsxs("div", { className: "mt-3 p-2 bg-green-
|
|
1469
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-3 p-2 bg-green-900/20 rounded text-xs text-green-400", children: [
|
|
1116
1470
|
/* @__PURE__ */ jsx2("span", { className: "font-medium", children: displayedAssignment.testCase.track?.testTemplate === "checklist" ? "Pass criteria:" : displayedAssignment.testCase.track?.testTemplate === "rubric" ? "Target score:" : "Expected:" }),
|
|
1117
1471
|
" ",
|
|
1118
1472
|
displayedAssignment.testCase.expectedResult
|
|
@@ -1123,69 +1477,279 @@ function BugBearPanel({
|
|
|
1123
1477
|
"button",
|
|
1124
1478
|
{
|
|
1125
1479
|
onClick: handleFail,
|
|
1126
|
-
disabled: submitting,
|
|
1127
|
-
className: "flex-1 py-2 px-3 bg-red-
|
|
1480
|
+
disabled: submitting || skipping,
|
|
1481
|
+
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",
|
|
1128
1482
|
children: "\u2717 Fail"
|
|
1129
1483
|
}
|
|
1130
1484
|
),
|
|
1485
|
+
/* @__PURE__ */ jsx2(
|
|
1486
|
+
"button",
|
|
1487
|
+
{
|
|
1488
|
+
onClick: handleOpenSkipModal,
|
|
1489
|
+
disabled: submitting || skipping,
|
|
1490
|
+
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",
|
|
1491
|
+
children: "\u23ED\uFE0F Skip"
|
|
1492
|
+
}
|
|
1493
|
+
),
|
|
1131
1494
|
/* @__PURE__ */ jsx2(
|
|
1132
1495
|
"button",
|
|
1133
1496
|
{
|
|
1134
1497
|
onClick: handlePass,
|
|
1135
|
-
disabled: submitting,
|
|
1498
|
+
disabled: submitting || skipping,
|
|
1136
1499
|
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",
|
|
1137
1500
|
children: submitting ? "..." : "\u2713 Pass"
|
|
1138
1501
|
}
|
|
1139
1502
|
)
|
|
1140
|
-
] })
|
|
1503
|
+
] }),
|
|
1504
|
+
showSkipModal && /* @__PURE__ */ jsx2("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", onClick: () => setShowSkipModal(false), children: /* @__PURE__ */ jsxs("div", { className: "bg-zinc-800 rounded-xl p-4 w-72 shadow-xl border border-zinc-700", onClick: (e) => e.stopPropagation(), children: [
|
|
1505
|
+
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-zinc-100 mb-3", children: "Skip Test" }),
|
|
1506
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xs text-zinc-500 mb-3", children: "Please select a reason for skipping this test." }),
|
|
1507
|
+
/* @__PURE__ */ jsx2("div", { className: "space-y-2 mb-4", children: skipReasonOptions.map((option) => /* @__PURE__ */ jsxs(
|
|
1508
|
+
"button",
|
|
1509
|
+
{
|
|
1510
|
+
onClick: () => setSelectedSkipReason(option.value),
|
|
1511
|
+
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"}`,
|
|
1512
|
+
children: [
|
|
1513
|
+
/* @__PURE__ */ jsx2("div", { className: "font-medium text-sm", children: option.label }),
|
|
1514
|
+
/* @__PURE__ */ jsx2("div", { className: "text-xs text-zinc-500", children: option.description })
|
|
1515
|
+
]
|
|
1516
|
+
},
|
|
1517
|
+
option.value
|
|
1518
|
+
)) }),
|
|
1519
|
+
selectedSkipReason === "other" && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
1520
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-400 mb-1", children: "Notes (required)" }),
|
|
1521
|
+
/* @__PURE__ */ jsx2(
|
|
1522
|
+
"textarea",
|
|
1523
|
+
{
|
|
1524
|
+
value: skipNotes,
|
|
1525
|
+
onChange: (e) => setSkipNotes(e.target.value),
|
|
1526
|
+
placeholder: "Please explain why you're skipping...",
|
|
1527
|
+
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",
|
|
1528
|
+
rows: 2
|
|
1529
|
+
}
|
|
1530
|
+
)
|
|
1531
|
+
] }),
|
|
1532
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
1533
|
+
/* @__PURE__ */ jsx2(
|
|
1534
|
+
"button",
|
|
1535
|
+
{
|
|
1536
|
+
onClick: () => setShowSkipModal(false),
|
|
1537
|
+
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",
|
|
1538
|
+
children: "Cancel"
|
|
1539
|
+
}
|
|
1540
|
+
),
|
|
1541
|
+
/* @__PURE__ */ jsx2(
|
|
1542
|
+
"button",
|
|
1543
|
+
{
|
|
1544
|
+
onClick: handleSkip,
|
|
1545
|
+
disabled: !selectedSkipReason || selectedSkipReason === "other" && !skipNotes.trim() || skipping,
|
|
1546
|
+
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",
|
|
1547
|
+
children: skipping ? "Skipping..." : "Skip Test"
|
|
1548
|
+
}
|
|
1549
|
+
)
|
|
1550
|
+
] })
|
|
1551
|
+
] }) })
|
|
1141
1552
|
] })
|
|
1142
1553
|
) : null }),
|
|
1554
|
+
activeTab === "messages" && /* @__PURE__ */ jsx2("div", { children: messageView === "compose" ? (
|
|
1555
|
+
/* Compose New Message */
|
|
1556
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
1557
|
+
/* @__PURE__ */ jsx2(
|
|
1558
|
+
"button",
|
|
1559
|
+
{
|
|
1560
|
+
onClick: handleBackToThreadList,
|
|
1561
|
+
className: "text-sm text-zinc-400 hover:text-zinc-200 mb-3 flex items-center gap-1",
|
|
1562
|
+
children: "\u2190 Back to Messages"
|
|
1563
|
+
}
|
|
1564
|
+
),
|
|
1565
|
+
/* @__PURE__ */ jsxs("div", { className: "text-center mb-4", children: [
|
|
1566
|
+
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-zinc-100", children: "New Message" }),
|
|
1567
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-500 text-xs mt-1", children: "Send a message to the QA team" })
|
|
1568
|
+
] }),
|
|
1569
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
1570
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
1571
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Subject" }),
|
|
1572
|
+
/* @__PURE__ */ jsx2(
|
|
1573
|
+
"input",
|
|
1574
|
+
{
|
|
1575
|
+
type: "text",
|
|
1576
|
+
value: composeSubject,
|
|
1577
|
+
onChange: (e) => setComposeSubject(e.target.value),
|
|
1578
|
+
placeholder: "What's this about?",
|
|
1579
|
+
maxLength: 100,
|
|
1580
|
+
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"
|
|
1581
|
+
}
|
|
1582
|
+
)
|
|
1583
|
+
] }),
|
|
1584
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
1585
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Message" }),
|
|
1586
|
+
/* @__PURE__ */ jsx2(
|
|
1587
|
+
"textarea",
|
|
1588
|
+
{
|
|
1589
|
+
value: composeMessage,
|
|
1590
|
+
onChange: (e) => setComposeMessage(e.target.value),
|
|
1591
|
+
placeholder: "Write your message...",
|
|
1592
|
+
maxLength: 2e3,
|
|
1593
|
+
rows: 6,
|
|
1594
|
+
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"
|
|
1595
|
+
}
|
|
1596
|
+
)
|
|
1597
|
+
] }),
|
|
1598
|
+
/* @__PURE__ */ jsx2(
|
|
1599
|
+
"button",
|
|
1600
|
+
{
|
|
1601
|
+
onClick: handleSendNewMessage,
|
|
1602
|
+
disabled: !composeSubject.trim() || !composeMessage.trim() || sendingNewMessage,
|
|
1603
|
+
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",
|
|
1604
|
+
children: sendingNewMessage ? "Sending..." : "Send Message"
|
|
1605
|
+
}
|
|
1606
|
+
)
|
|
1607
|
+
] })
|
|
1608
|
+
] })
|
|
1609
|
+
) : messageView === "thread" && selectedThread ? (
|
|
1610
|
+
/* Thread Detail View */
|
|
1611
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
1612
|
+
/* @__PURE__ */ jsx2(
|
|
1613
|
+
"button",
|
|
1614
|
+
{
|
|
1615
|
+
onClick: handleBackToThreadList,
|
|
1616
|
+
className: "text-sm text-zinc-400 hover:text-zinc-200 mb-3 flex items-center gap-1",
|
|
1617
|
+
children: "\u2190 Back to Messages"
|
|
1618
|
+
}
|
|
1619
|
+
),
|
|
1620
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-4 pb-3 border-b border-zinc-700", children: [
|
|
1621
|
+
/* @__PURE__ */ jsx2("span", { className: "text-lg", children: getThreadTypeIcon(selectedThread.threadType) }),
|
|
1622
|
+
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-zinc-100 text-sm leading-tight", children: selectedThread.subject || "No subject" })
|
|
1623
|
+
] }),
|
|
1624
|
+
loadingMessages ? /* @__PURE__ */ jsx2("div", { className: "text-center py-6", children: /* @__PURE__ */ jsx2("p", { className: "text-zinc-500 text-sm", children: "Loading messages..." }) }) : /* @__PURE__ */ jsx2("div", { className: "space-y-3 mb-4", children: threadMessages.map((message) => /* @__PURE__ */ jsxs(
|
|
1625
|
+
"div",
|
|
1626
|
+
{
|
|
1627
|
+
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"}`,
|
|
1628
|
+
children: [
|
|
1629
|
+
/* @__PURE__ */ jsx2("p", { className: `text-xs font-medium mb-1 ${message.senderType === "tester" ? "text-blue-300" : "text-zinc-300"}`, children: message.senderType === "tester" ? "You" : message.senderName }),
|
|
1630
|
+
/* @__PURE__ */ jsx2("p", { className: `text-sm ${message.senderType === "tester" ? "text-blue-100" : "text-zinc-200"}`, children: message.content }),
|
|
1631
|
+
/* @__PURE__ */ jsx2("p", { className: `text-[10px] mt-1 ${message.senderType === "tester" ? "text-blue-400/60" : "text-zinc-500"}`, children: formatMessageTime(message.createdAt) })
|
|
1632
|
+
]
|
|
1633
|
+
},
|
|
1634
|
+
message.id
|
|
1635
|
+
)) }),
|
|
1636
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-2 pt-3 border-t border-zinc-700", children: [
|
|
1637
|
+
/* @__PURE__ */ jsx2(
|
|
1638
|
+
"input",
|
|
1639
|
+
{
|
|
1640
|
+
type: "text",
|
|
1641
|
+
value: replyText,
|
|
1642
|
+
onChange: (e) => setReplyText(e.target.value),
|
|
1643
|
+
placeholder: "Type a reply...",
|
|
1644
|
+
maxLength: 1e3,
|
|
1645
|
+
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",
|
|
1646
|
+
onKeyDown: (e) => e.key === "Enter" && !e.shiftKey && handleSendReply()
|
|
1647
|
+
}
|
|
1648
|
+
),
|
|
1649
|
+
/* @__PURE__ */ jsx2(
|
|
1650
|
+
"button",
|
|
1651
|
+
{
|
|
1652
|
+
onClick: handleSendReply,
|
|
1653
|
+
disabled: !replyText.trim() || sendingReply,
|
|
1654
|
+
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",
|
|
1655
|
+
children: sendingReply ? "..." : "Send"
|
|
1656
|
+
}
|
|
1657
|
+
)
|
|
1658
|
+
] })
|
|
1659
|
+
] })
|
|
1660
|
+
) : (
|
|
1661
|
+
/* Thread List View */
|
|
1662
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
1663
|
+
/* @__PURE__ */ jsx2(
|
|
1664
|
+
"button",
|
|
1665
|
+
{
|
|
1666
|
+
onClick: handleStartNewMessage,
|
|
1667
|
+
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",
|
|
1668
|
+
children: "\u2709\uFE0F New Message"
|
|
1669
|
+
}
|
|
1670
|
+
),
|
|
1671
|
+
threads.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "text-center py-8", children: [
|
|
1672
|
+
/* @__PURE__ */ jsx2("span", { className: "text-4xl", children: "\u{1F4AC}" }),
|
|
1673
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-400 mt-2 font-medium", children: "No messages yet" }),
|
|
1674
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-500 text-sm", children: "Start a conversation or wait for messages from admins" })
|
|
1675
|
+
] }) : /* @__PURE__ */ jsx2("div", { className: "space-y-2", children: threads.map((thread) => /* @__PURE__ */ jsxs(
|
|
1676
|
+
"button",
|
|
1677
|
+
{
|
|
1678
|
+
onClick: () => handleOpenThread(thread),
|
|
1679
|
+
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"}`,
|
|
1680
|
+
children: [
|
|
1681
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-1", children: [
|
|
1682
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 min-w-0 flex-1", children: [
|
|
1683
|
+
thread.isPinned && /* @__PURE__ */ jsx2("span", { className: "text-xs", children: "\u{1F4CC}" }),
|
|
1684
|
+
/* @__PURE__ */ jsx2("span", { className: "text-xs", children: getThreadTypeIcon(thread.threadType) }),
|
|
1685
|
+
/* @__PURE__ */ jsx2("span", { className: `text-sm truncate ${thread.unreadCount > 0 ? "font-semibold text-zinc-100" : "text-zinc-300"}`, children: thread.subject || "No subject" })
|
|
1686
|
+
] }),
|
|
1687
|
+
(thread.priority === "high" || thread.priority === "urgent") && /* @__PURE__ */ jsx2("span", { className: `w-2 h-2 rounded-full flex-shrink-0 ml-2 ${thread.priority === "urgent" ? "bg-red-500" : "bg-orange-500"}` })
|
|
1688
|
+
] }),
|
|
1689
|
+
thread.lastMessage && /* @__PURE__ */ jsxs("p", { className: "text-xs text-zinc-500 truncate", children: [
|
|
1690
|
+
thread.lastMessage.senderName,
|
|
1691
|
+
": ",
|
|
1692
|
+
thread.lastMessage.content
|
|
1693
|
+
] }),
|
|
1694
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mt-1.5", children: [
|
|
1695
|
+
thread.unreadCount > 0 ? /* @__PURE__ */ jsxs("span", { className: "text-[10px] px-1.5 py-0.5 bg-blue-500 text-white rounded-full font-medium", children: [
|
|
1696
|
+
thread.unreadCount,
|
|
1697
|
+
" new"
|
|
1698
|
+
] }) : /* @__PURE__ */ jsx2("span", { className: "text-[10px] text-zinc-600", children: "Read" }),
|
|
1699
|
+
/* @__PURE__ */ jsx2("span", { className: "text-[10px] text-zinc-600", children: formatRelativeTime(thread.lastMessageAt) })
|
|
1700
|
+
] })
|
|
1701
|
+
]
|
|
1702
|
+
},
|
|
1703
|
+
thread.id
|
|
1704
|
+
)) })
|
|
1705
|
+
] })
|
|
1706
|
+
) }),
|
|
1143
1707
|
activeTab === "session" && /* @__PURE__ */ jsx2("div", { children: !activeSession ? (
|
|
1144
1708
|
/* Start Session View */
|
|
1145
1709
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1146
1710
|
/* @__PURE__ */ jsxs("div", { className: "text-center mb-4", children: [
|
|
1147
1711
|
/* @__PURE__ */ jsx2("span", { className: "text-4xl", children: "\u{1F50D}" }),
|
|
1148
|
-
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-
|
|
1149
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
1712
|
+
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-zinc-100 mt-2", children: "Exploratory QA Session" }),
|
|
1713
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-500 text-xs mt-1", children: "Explore freely and capture findings as you go" })
|
|
1150
1714
|
] }),
|
|
1151
1715
|
focusAreas.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
1152
|
-
/* @__PURE__ */ jsxs("label", { className: "block text-xs font-medium text-
|
|
1716
|
+
/* @__PURE__ */ jsxs("label", { className: "block text-xs font-medium text-zinc-300 mb-2", children: [
|
|
1153
1717
|
"\u{1F4CC} Focus Areas",
|
|
1154
|
-
/* @__PURE__ */ jsx2("span", { className: "ml-1 text-[10px] text-
|
|
1718
|
+
/* @__PURE__ */ jsx2("span", { className: "ml-1 text-[10px] text-zinc-500 font-normal", children: "from your team" })
|
|
1155
1719
|
] }),
|
|
1156
1720
|
/* @__PURE__ */ jsx2("div", { className: "space-y-1.5", children: focusAreas.map((area) => /* @__PURE__ */ jsxs(
|
|
1157
1721
|
"button",
|
|
1158
1722
|
{
|
|
1159
1723
|
onClick: () => setSessionFocusArea(area.name),
|
|
1160
|
-
className: `w-full text-left px-3 py-2 rounded-lg text-xs transition-colors border ${sessionFocusArea === area.name ? "bg-amber-
|
|
1724
|
+
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"}`,
|
|
1161
1725
|
children: [
|
|
1162
1726
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
1163
1727
|
/* @__PURE__ */ jsx2("span", { className: "font-medium", children: area.name }),
|
|
1164
|
-
/* @__PURE__ */ jsx2("span", { className: `text-[10px] px-1.5 py-0.5 rounded ${area.priority >= 70 ? "bg-red-
|
|
1728
|
+
/* @__PURE__ */ jsx2("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" })
|
|
1165
1729
|
] }),
|
|
1166
|
-
area.description && /* @__PURE__ */ jsx2("p", { className: "text-[10px] text-
|
|
1730
|
+
area.description && /* @__PURE__ */ jsx2("p", { className: "text-[10px] text-zinc-500 mt-0.5 line-clamp-2", children: area.description })
|
|
1167
1731
|
]
|
|
1168
1732
|
},
|
|
1169
1733
|
area.id
|
|
1170
1734
|
)) })
|
|
1171
1735
|
] }),
|
|
1172
1736
|
suggestedRoutes.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
1173
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1737
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-2", children: "\u{1F3AF} Suggested Routes to Explore" }),
|
|
1174
1738
|
/* @__PURE__ */ jsx2("div", { className: "space-y-1.5 max-h-32 overflow-y-auto", children: suggestedRoutes.map((suggestion, idx) => /* @__PURE__ */ jsx2(
|
|
1175
1739
|
"button",
|
|
1176
1740
|
{
|
|
1177
1741
|
onClick: () => setSessionFocusArea(suggestion.route),
|
|
1178
|
-
className: `w-full text-left px-3 py-2 rounded-lg text-xs transition-colors border ${sessionFocusArea === suggestion.route ? "bg-
|
|
1742
|
+
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"}`,
|
|
1179
1743
|
children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
1180
1744
|
/* @__PURE__ */ jsx2("span", { className: "font-medium truncate", children: suggestion.route }),
|
|
1181
|
-
/* @__PURE__ */ jsx2("span", { className: `text-[10px] px-1.5 py-0.5 rounded ${suggestion.priorityScore >= 40 ? "bg-red-
|
|
1745
|
+
/* @__PURE__ */ jsx2("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 })
|
|
1182
1746
|
] })
|
|
1183
1747
|
},
|
|
1184
1748
|
idx
|
|
1185
1749
|
)) })
|
|
1186
1750
|
] }),
|
|
1187
1751
|
/* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
|
|
1188
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1752
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Focus Area (optional)" }),
|
|
1189
1753
|
/* @__PURE__ */ jsx2(
|
|
1190
1754
|
"input",
|
|
1191
1755
|
{
|
|
@@ -1193,12 +1757,12 @@ function BugBearPanel({
|
|
|
1193
1757
|
value: sessionFocusArea,
|
|
1194
1758
|
onChange: (e) => setSessionFocusArea(e.target.value),
|
|
1195
1759
|
placeholder: "e.g., checkout flow, settings page",
|
|
1196
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
1760
|
+
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"
|
|
1197
1761
|
}
|
|
1198
1762
|
)
|
|
1199
1763
|
] }),
|
|
1200
1764
|
/* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
1201
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1765
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Platform" }),
|
|
1202
1766
|
/* @__PURE__ */ jsx2("div", { className: "flex gap-2", children: [
|
|
1203
1767
|
{ key: "web", label: "\u{1F310} Web" },
|
|
1204
1768
|
{ key: "ios", label: "\u{1F4F1} iOS" },
|
|
@@ -1207,7 +1771,7 @@ function BugBearPanel({
|
|
|
1207
1771
|
"button",
|
|
1208
1772
|
{
|
|
1209
1773
|
onClick: () => setSessionPlatform(key),
|
|
1210
|
-
className: `flex-1 py-2 px-3 rounded-lg text-xs font-medium transition-colors border-2 ${sessionPlatform === key ? "bg-
|
|
1774
|
+
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"}`,
|
|
1211
1775
|
children: label
|
|
1212
1776
|
},
|
|
1213
1777
|
key
|
|
@@ -1231,8 +1795,8 @@ function BugBearPanel({
|
|
|
1231
1795
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1232
1796
|
/* @__PURE__ */ jsxs("div", { className: "text-center mb-4", children: [
|
|
1233
1797
|
/* @__PURE__ */ jsx2("span", { className: "text-4xl", children: "\u270B" }),
|
|
1234
|
-
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-
|
|
1235
|
-
/* @__PURE__ */ jsxs("p", { className: "text-
|
|
1798
|
+
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-zinc-100 mt-2", children: "End Session?" }),
|
|
1799
|
+
/* @__PURE__ */ jsxs("p", { className: "text-zinc-500 text-xs mt-1", children: [
|
|
1236
1800
|
"Duration: ",
|
|
1237
1801
|
formatElapsedTime(sessionElapsedTime),
|
|
1238
1802
|
" \u2022 ",
|
|
@@ -1242,7 +1806,7 @@ function BugBearPanel({
|
|
|
1242
1806
|
] })
|
|
1243
1807
|
] }),
|
|
1244
1808
|
/* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
1245
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1809
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Session Notes (optional)" }),
|
|
1246
1810
|
/* @__PURE__ */ jsx2(
|
|
1247
1811
|
"textarea",
|
|
1248
1812
|
{
|
|
@@ -1250,7 +1814,7 @@ function BugBearPanel({
|
|
|
1250
1814
|
onChange: (e) => setSessionNotes(e.target.value),
|
|
1251
1815
|
placeholder: "Any overall observations from this session...",
|
|
1252
1816
|
rows: 3,
|
|
1253
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
1817
|
+
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"
|
|
1254
1818
|
}
|
|
1255
1819
|
)
|
|
1256
1820
|
] }),
|
|
@@ -1259,7 +1823,7 @@ function BugBearPanel({
|
|
|
1259
1823
|
"button",
|
|
1260
1824
|
{
|
|
1261
1825
|
onClick: () => setShowEndConfirm(false),
|
|
1262
|
-
className: "flex-1 py-2 px-3 bg-
|
|
1826
|
+
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",
|
|
1263
1827
|
children: "Cancel"
|
|
1264
1828
|
}
|
|
1265
1829
|
),
|
|
@@ -1278,12 +1842,12 @@ function BugBearPanel({
|
|
|
1278
1842
|
/* Add Finding Form */
|
|
1279
1843
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1280
1844
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-3", children: [
|
|
1281
|
-
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-
|
|
1845
|
+
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-zinc-100 text-sm", children: "Add Finding" }),
|
|
1282
1846
|
/* @__PURE__ */ jsx2(
|
|
1283
1847
|
"button",
|
|
1284
1848
|
{
|
|
1285
1849
|
onClick: () => setShowAddFinding(false),
|
|
1286
|
-
className: "text-
|
|
1850
|
+
className: "text-zinc-500 hover:text-zinc-400",
|
|
1287
1851
|
children: "\u2715"
|
|
1288
1852
|
}
|
|
1289
1853
|
)
|
|
@@ -1297,25 +1861,25 @@ function BugBearPanel({
|
|
|
1297
1861
|
"button",
|
|
1298
1862
|
{
|
|
1299
1863
|
onClick: () => setFindingType(type),
|
|
1300
|
-
className: `flex-1 py-1.5 px-2 rounded text-xs font-medium transition-colors ${findingType === type ? color === "red" ? "bg-red-
|
|
1864
|
+
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"}`,
|
|
1301
1865
|
children: label
|
|
1302
1866
|
},
|
|
1303
1867
|
type
|
|
1304
1868
|
)) }),
|
|
1305
1869
|
findingType === "bug" && /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
|
|
1306
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1870
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Severity" }),
|
|
1307
1871
|
/* @__PURE__ */ jsx2("div", { className: "flex gap-1", children: ["critical", "high", "medium", "low", "observation"].map((sev) => /* @__PURE__ */ jsx2(
|
|
1308
1872
|
"button",
|
|
1309
1873
|
{
|
|
1310
1874
|
onClick: () => setFindingSeverity(sev),
|
|
1311
|
-
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-
|
|
1875
|
+
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"}`,
|
|
1312
1876
|
children: sev === "observation" ? "obs" : sev
|
|
1313
1877
|
},
|
|
1314
1878
|
sev
|
|
1315
1879
|
)) })
|
|
1316
1880
|
] }),
|
|
1317
1881
|
/* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
|
|
1318
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1882
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Title *" }),
|
|
1319
1883
|
/* @__PURE__ */ jsx2(
|
|
1320
1884
|
"input",
|
|
1321
1885
|
{
|
|
@@ -1323,12 +1887,12 @@ function BugBearPanel({
|
|
|
1323
1887
|
value: findingTitle,
|
|
1324
1888
|
onChange: (e) => setFindingTitle(e.target.value),
|
|
1325
1889
|
placeholder: "Brief description of what you found",
|
|
1326
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
1890
|
+
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"
|
|
1327
1891
|
}
|
|
1328
1892
|
)
|
|
1329
1893
|
] }),
|
|
1330
1894
|
/* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
|
|
1331
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1895
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Details (optional)" }),
|
|
1332
1896
|
/* @__PURE__ */ jsx2(
|
|
1333
1897
|
"textarea",
|
|
1334
1898
|
{
|
|
@@ -1336,7 +1900,7 @@ function BugBearPanel({
|
|
|
1336
1900
|
onChange: (e) => setFindingDescription(e.target.value),
|
|
1337
1901
|
placeholder: "Steps to reproduce, expected behavior, etc.",
|
|
1338
1902
|
rows: 2,
|
|
1339
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
1903
|
+
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"
|
|
1340
1904
|
}
|
|
1341
1905
|
)
|
|
1342
1906
|
] }),
|
|
@@ -1345,7 +1909,7 @@ function BugBearPanel({
|
|
|
1345
1909
|
{
|
|
1346
1910
|
onClick: handleAddFinding,
|
|
1347
1911
|
disabled: addingFinding || !findingTitle.trim(),
|
|
1348
|
-
className: "w-full py-2 px-4 bg-
|
|
1912
|
+
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",
|
|
1349
1913
|
children: addingFinding ? "Adding..." : "Add Finding"
|
|
1350
1914
|
}
|
|
1351
1915
|
)
|
|
@@ -1353,15 +1917,15 @@ function BugBearPanel({
|
|
|
1353
1917
|
) : (
|
|
1354
1918
|
/* Active Session View */
|
|
1355
1919
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1356
|
-
/* @__PURE__ */ jsxs("div", { className: "bg-green-
|
|
1920
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-green-900/20 rounded-lg p-3 mb-3 border border-green-800", children: [
|
|
1357
1921
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
1358
1922
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1359
1923
|
/* @__PURE__ */ jsx2("span", { className: "w-2 h-2 bg-green-500 rounded-full animate-pulse" }),
|
|
1360
|
-
/* @__PURE__ */ jsx2("span", { className: "font-medium text-green-
|
|
1924
|
+
/* @__PURE__ */ jsx2("span", { className: "font-medium text-green-300 text-sm", children: "Session Active" })
|
|
1361
1925
|
] }),
|
|
1362
|
-
/* @__PURE__ */ jsx2("span", { className: "font-mono text-green-
|
|
1926
|
+
/* @__PURE__ */ jsx2("span", { className: "font-mono text-green-400 text-lg font-semibold", children: formatElapsedTime(sessionElapsedTime) })
|
|
1363
1927
|
] }),
|
|
1364
|
-
activeSession.focusArea && /* @__PURE__ */ jsxs("p", { className: "text-green-
|
|
1928
|
+
activeSession.focusArea && /* @__PURE__ */ jsxs("p", { className: "text-green-400 text-xs mt-1", children: [
|
|
1365
1929
|
"Focus: ",
|
|
1366
1930
|
activeSession.focusArea
|
|
1367
1931
|
] })
|
|
@@ -1370,7 +1934,7 @@ function BugBearPanel({
|
|
|
1370
1934
|
"button",
|
|
1371
1935
|
{
|
|
1372
1936
|
onClick: () => setShowAddFinding(true),
|
|
1373
|
-
className: "w-full py-3 px-4 bg-
|
|
1937
|
+
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",
|
|
1374
1938
|
children: [
|
|
1375
1939
|
/* @__PURE__ */ jsx2("span", { children: "+" }),
|
|
1376
1940
|
" Add Finding"
|
|
@@ -1378,23 +1942,23 @@ function BugBearPanel({
|
|
|
1378
1942
|
}
|
|
1379
1943
|
),
|
|
1380
1944
|
/* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
|
|
1381
|
-
/* @__PURE__ */ jsx2("div", { className: "flex items-center justify-between mb-2", children: /* @__PURE__ */ jsxs("span", { className: "text-xs font-medium text-
|
|
1945
|
+
/* @__PURE__ */ jsx2("div", { className: "flex items-center justify-between mb-2", children: /* @__PURE__ */ jsxs("span", { className: "text-xs font-medium text-zinc-500", children: [
|
|
1382
1946
|
"Findings (",
|
|
1383
1947
|
sessionFindings.length,
|
|
1384
1948
|
")"
|
|
1385
1949
|
] }) }),
|
|
1386
|
-
sessionFindings.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "text-center py-4 bg-
|
|
1387
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
1388
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
1950
|
+
sessionFindings.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "text-center py-4 bg-zinc-800 rounded-lg", children: [
|
|
1951
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-500 text-xs", children: "No findings yet" }),
|
|
1952
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-500 text-xs", children: "Explore and add findings as you go" })
|
|
1389
1953
|
] }) : /* @__PURE__ */ jsx2("div", { className: "space-y-2 max-h-32 overflow-y-auto", children: sessionFindings.map((finding) => /* @__PURE__ */ jsx2(
|
|
1390
1954
|
"div",
|
|
1391
1955
|
{
|
|
1392
|
-
className: `p-2 rounded-lg border text-xs ${finding.type === "bug" ? "bg-red-
|
|
1956
|
+
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"}`,
|
|
1393
1957
|
children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2", children: [
|
|
1394
1958
|
/* @__PURE__ */ jsx2("span", { children: finding.type === "bug" ? "\u{1F41B}" : finding.type === "concern" ? "\u26A0\uFE0F" : finding.type === "suggestion" ? "\u{1F4A1}" : "\u2753" }),
|
|
1395
1959
|
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
1396
|
-
/* @__PURE__ */ jsx2("p", { className: "font-medium text-
|
|
1397
|
-
finding.severity && finding.type === "bug" && /* @__PURE__ */ jsx2("span", { className: `inline-block mt-0.5 px-1 py-0.5 rounded text-[10px] font-medium ${finding.severity === "critical" ? "bg-red-
|
|
1960
|
+
/* @__PURE__ */ jsx2("p", { className: "font-medium text-zinc-100 truncate", children: finding.title }),
|
|
1961
|
+
finding.severity && finding.type === "bug" && /* @__PURE__ */ jsx2("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 })
|
|
1398
1962
|
] })
|
|
1399
1963
|
] })
|
|
1400
1964
|
},
|
|
@@ -1405,7 +1969,7 @@ function BugBearPanel({
|
|
|
1405
1969
|
"button",
|
|
1406
1970
|
{
|
|
1407
1971
|
onClick: () => setShowEndConfirm(true),
|
|
1408
|
-
className: "w-full py-2 px-4 bg-
|
|
1972
|
+
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",
|
|
1409
1973
|
children: "End Session"
|
|
1410
1974
|
}
|
|
1411
1975
|
)
|
|
@@ -1413,7 +1977,7 @@ function BugBearPanel({
|
|
|
1413
1977
|
) }),
|
|
1414
1978
|
activeTab === "report" && /* @__PURE__ */ jsx2("div", { children: submitted ? /* @__PURE__ */ jsxs("div", { className: "text-center py-8", children: [
|
|
1415
1979
|
/* @__PURE__ */ jsx2("span", { className: "text-4xl", children: "\u{1F389}" }),
|
|
1416
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
1980
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-400 mt-2 font-medium", children: "Report submitted!" })
|
|
1417
1981
|
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1418
1982
|
/* @__PURE__ */ jsx2("div", { className: "flex gap-2 mb-4", children: [
|
|
1419
1983
|
{ type: "bug", label: "\u{1F41B} Bug", color: "red" },
|
|
@@ -1423,25 +1987,25 @@ function BugBearPanel({
|
|
|
1423
1987
|
"button",
|
|
1424
1988
|
{
|
|
1425
1989
|
onClick: () => setReportType(type),
|
|
1426
|
-
className: `flex-1 py-1.5 px-2 rounded-lg text-xs font-medium transition-colors ${reportType === type ? color === "red" ? "bg-red-
|
|
1990
|
+
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"}`,
|
|
1427
1991
|
children: label
|
|
1428
1992
|
},
|
|
1429
1993
|
type
|
|
1430
1994
|
)) }),
|
|
1431
1995
|
(reportType === "bug" || reportType === "test_fail") && /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
|
|
1432
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1996
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Severity" }),
|
|
1433
1997
|
/* @__PURE__ */ jsx2("div", { className: "flex gap-1", children: ["critical", "high", "medium", "low"].map((sev) => /* @__PURE__ */ jsx2(
|
|
1434
1998
|
"button",
|
|
1435
1999
|
{
|
|
1436
2000
|
onClick: () => setSeverity(sev),
|
|
1437
|
-
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-
|
|
2001
|
+
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"}`,
|
|
1438
2002
|
children: sev
|
|
1439
2003
|
},
|
|
1440
2004
|
sev
|
|
1441
2005
|
)) })
|
|
1442
2006
|
] }),
|
|
1443
2007
|
/* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
|
|
1444
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
2008
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "What happened?" }),
|
|
1445
2009
|
/* @__PURE__ */ jsx2(
|
|
1446
2010
|
"textarea",
|
|
1447
2011
|
{
|
|
@@ -1449,7 +2013,7 @@ function BugBearPanel({
|
|
|
1449
2013
|
onChange: (e) => setDescription(e.target.value),
|
|
1450
2014
|
placeholder: "Describe the issue...",
|
|
1451
2015
|
rows: 3,
|
|
1452
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
2016
|
+
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"
|
|
1453
2017
|
}
|
|
1454
2018
|
)
|
|
1455
2019
|
] }),
|
|
@@ -1458,19 +2022,19 @@ function BugBearPanel({
|
|
|
1458
2022
|
{
|
|
1459
2023
|
onClick: handleSubmitReport,
|
|
1460
2024
|
disabled: submitting || !description.trim(),
|
|
1461
|
-
className: "w-full py-2 px-4 bg-
|
|
2025
|
+
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",
|
|
1462
2026
|
children: submitting ? "Submitting..." : "Submit Report"
|
|
1463
2027
|
}
|
|
1464
2028
|
)
|
|
1465
2029
|
] }) })
|
|
1466
2030
|
] }),
|
|
1467
|
-
showProfileOverlay && /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 bg-
|
|
1468
|
-
/* @__PURE__ */ jsxs("div", { className: "bg-
|
|
2031
|
+
showProfileOverlay && /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 bg-zinc-900 z-50 flex flex-col rounded-xl overflow-hidden", children: [
|
|
2032
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-zinc-950 text-white px-4 py-3 flex items-center justify-between border-b border-zinc-800", children: [
|
|
1469
2033
|
/* @__PURE__ */ jsx2(
|
|
1470
2034
|
"button",
|
|
1471
2035
|
{
|
|
1472
2036
|
onClick: handleCloseProfile,
|
|
1473
|
-
className: "text-sm text-
|
|
2037
|
+
className: "text-sm text-zinc-400 hover:text-white transition-colors",
|
|
1474
2038
|
children: "\u2190 Back"
|
|
1475
2039
|
}
|
|
1476
2040
|
),
|
|
@@ -1480,23 +2044,23 @@ function BugBearPanel({
|
|
|
1480
2044
|
] }),
|
|
1481
2045
|
/* @__PURE__ */ jsx2("div", { className: "flex-1 overflow-y-auto p-4", children: profileSaved ? /* @__PURE__ */ jsxs("div", { className: "text-center py-8", children: [
|
|
1482
2046
|
/* @__PURE__ */ jsx2("span", { className: "text-4xl", children: "\u2705" }),
|
|
1483
|
-
/* @__PURE__ */ jsx2("p", { className: "text-
|
|
2047
|
+
/* @__PURE__ */ jsx2("p", { className: "text-zinc-400 mt-2 font-medium", children: "Profile saved!" })
|
|
1484
2048
|
] }) : profileEditing ? (
|
|
1485
2049
|
/* Edit Profile Form */
|
|
1486
2050
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1487
2051
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-4", children: [
|
|
1488
|
-
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-
|
|
2052
|
+
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-zinc-100", children: "Edit Profile" }),
|
|
1489
2053
|
/* @__PURE__ */ jsx2(
|
|
1490
2054
|
"button",
|
|
1491
2055
|
{
|
|
1492
2056
|
onClick: handleCancelEditProfile,
|
|
1493
|
-
className: "text-sm text-
|
|
2057
|
+
className: "text-sm text-zinc-500 hover:text-zinc-300",
|
|
1494
2058
|
children: "Cancel"
|
|
1495
2059
|
}
|
|
1496
2060
|
)
|
|
1497
2061
|
] }),
|
|
1498
2062
|
/* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
1499
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
2063
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Name" }),
|
|
1500
2064
|
/* @__PURE__ */ jsx2(
|
|
1501
2065
|
"input",
|
|
1502
2066
|
{
|
|
@@ -1504,27 +2068,27 @@ function BugBearPanel({
|
|
|
1504
2068
|
value: profileName,
|
|
1505
2069
|
onChange: (e) => setProfileName(e.target.value),
|
|
1506
2070
|
placeholder: "Your name",
|
|
1507
|
-
className: "w-full px-3 py-2 text-sm border border-
|
|
2071
|
+
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"
|
|
1508
2072
|
}
|
|
1509
2073
|
)
|
|
1510
2074
|
] }),
|
|
1511
2075
|
/* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
1512
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1513
|
-
/* @__PURE__ */ jsxs("div", { className: "px-3 py-2 bg-
|
|
1514
|
-
/* @__PURE__ */ jsx2("p", { className: "text-sm text-
|
|
1515
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xs text-
|
|
2076
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Primary Email" }),
|
|
2077
|
+
/* @__PURE__ */ jsxs("div", { className: "px-3 py-2 bg-zinc-800 rounded-lg", children: [
|
|
2078
|
+
/* @__PURE__ */ jsx2("p", { className: "text-sm text-zinc-300", children: testerInfo?.email }),
|
|
2079
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xs text-zinc-500 mt-0.5", children: "Main communication email" })
|
|
1516
2080
|
] })
|
|
1517
2081
|
] }),
|
|
1518
2082
|
/* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
1519
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1520
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xs text-
|
|
2083
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Additional Testing Emails" }),
|
|
2084
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xs text-zinc-500 mb-2", children: "Add other emails you use to test on different accounts" }),
|
|
1521
2085
|
profileAdditionalEmails.map((email) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
1522
|
-
/* @__PURE__ */ jsx2("span", { className: "flex-1 px-3 py-1.5 bg-
|
|
2086
|
+
/* @__PURE__ */ jsx2("span", { className: "flex-1 px-3 py-1.5 bg-blue-950/30 text-blue-300 text-sm rounded-full", children: email }),
|
|
1523
2087
|
/* @__PURE__ */ jsx2(
|
|
1524
2088
|
"button",
|
|
1525
2089
|
{
|
|
1526
2090
|
onClick: () => handleRemoveEmail(email),
|
|
1527
|
-
className: "text-
|
|
2091
|
+
className: "text-blue-400 hover:text-red-500 text-sm",
|
|
1528
2092
|
children: "\u2715"
|
|
1529
2093
|
}
|
|
1530
2094
|
)
|
|
@@ -1537,7 +2101,7 @@ function BugBearPanel({
|
|
|
1537
2101
|
value: newEmailInput,
|
|
1538
2102
|
onChange: (e) => setNewEmailInput(e.target.value),
|
|
1539
2103
|
placeholder: "email@example.com",
|
|
1540
|
-
className: "flex-1 px-3 py-2 text-sm border border-
|
|
2104
|
+
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",
|
|
1541
2105
|
onKeyDown: (e) => e.key === "Enter" && handleAddEmail()
|
|
1542
2106
|
}
|
|
1543
2107
|
),
|
|
@@ -1546,15 +2110,15 @@ function BugBearPanel({
|
|
|
1546
2110
|
{
|
|
1547
2111
|
onClick: handleAddEmail,
|
|
1548
2112
|
disabled: !newEmailInput.trim(),
|
|
1549
|
-
className: "px-3 py-2 bg-
|
|
2113
|
+
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",
|
|
1550
2114
|
children: "Add"
|
|
1551
2115
|
}
|
|
1552
2116
|
)
|
|
1553
2117
|
] })
|
|
1554
2118
|
] }),
|
|
1555
2119
|
/* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
|
|
1556
|
-
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-
|
|
1557
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xs text-
|
|
2120
|
+
/* @__PURE__ */ jsx2("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Testing Platforms" }),
|
|
2121
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xs text-zinc-500 mb-2", children: "Select the platforms you can test on" }),
|
|
1558
2122
|
/* @__PURE__ */ jsx2("div", { className: "flex gap-2", children: [
|
|
1559
2123
|
{ key: "ios", label: "\u{1F4F1} iOS" },
|
|
1560
2124
|
{ key: "android", label: "\u{1F916} Android" },
|
|
@@ -1563,7 +2127,7 @@ function BugBearPanel({
|
|
|
1563
2127
|
"button",
|
|
1564
2128
|
{
|
|
1565
2129
|
onClick: () => handleTogglePlatform(key),
|
|
1566
|
-
className: `flex-1 py-2 px-3 rounded-lg text-sm font-medium transition-colors border-2 ${profilePlatforms.includes(key) ? "bg-
|
|
2130
|
+
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"}`,
|
|
1567
2131
|
children: label
|
|
1568
2132
|
},
|
|
1569
2133
|
key
|
|
@@ -1582,31 +2146,31 @@ function BugBearPanel({
|
|
|
1582
2146
|
) : (
|
|
1583
2147
|
/* Profile View */
|
|
1584
2148
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1585
|
-
/* @__PURE__ */ jsxs("div", { className: "bg-
|
|
1586
|
-
/* @__PURE__ */ jsx2("div", { className: "w-16 h-16 mx-auto bg-
|
|
1587
|
-
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-
|
|
1588
|
-
/* @__PURE__ */ jsx2("p", { className: "text-sm text-
|
|
1589
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-6 mt-4 pt-4 border-t border-
|
|
2149
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-zinc-800 rounded-lg p-4 text-center mb-4", children: [
|
|
2150
|
+
/* @__PURE__ */ jsx2("div", { className: "w-16 h-16 mx-auto bg-blue-500 rounded-full flex items-center justify-center mb-3", children: /* @__PURE__ */ jsx2("span", { className: "text-2xl font-semibold text-white", children: testerInfo?.name?.charAt(0)?.toUpperCase() || "?" }) }),
|
|
2151
|
+
/* @__PURE__ */ jsx2("h3", { className: "font-semibold text-zinc-100", children: testerInfo?.name }),
|
|
2152
|
+
/* @__PURE__ */ jsx2("p", { className: "text-sm text-zinc-500", children: testerInfo?.email }),
|
|
2153
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-6 mt-4 pt-4 border-t border-zinc-700", children: [
|
|
1590
2154
|
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
1591
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xl font-bold text-
|
|
1592
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xs text-
|
|
2155
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xl font-bold text-blue-400", children: testerInfo?.assignedTests || 0 }),
|
|
2156
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xs text-zinc-500", children: "Assigned" })
|
|
1593
2157
|
] }),
|
|
1594
2158
|
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
1595
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xl font-bold text-
|
|
1596
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xs text-
|
|
2159
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xl font-bold text-blue-400", children: testerInfo?.completedTests || 0 }),
|
|
2160
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xs text-zinc-500", children: "Completed" })
|
|
1597
2161
|
] })
|
|
1598
2162
|
] })
|
|
1599
2163
|
] }),
|
|
1600
|
-
(testerInfo?.additionalEmails?.length || 0) > 0 && /* @__PURE__ */ jsxs("div", { className: "bg-
|
|
1601
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xs font-medium text-
|
|
1602
|
-
testerInfo?.additionalEmails?.map((email) => /* @__PURE__ */ jsx2("p", { className: "text-sm text-
|
|
2164
|
+
(testerInfo?.additionalEmails?.length || 0) > 0 && /* @__PURE__ */ jsxs("div", { className: "bg-zinc-800 rounded-lg p-3 mb-3", children: [
|
|
2165
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xs font-medium text-zinc-500 uppercase tracking-wide mb-2", children: "Additional Emails" }),
|
|
2166
|
+
testerInfo?.additionalEmails?.map((email) => /* @__PURE__ */ jsx2("p", { className: "text-sm text-zinc-300", children: email }, email))
|
|
1603
2167
|
] }),
|
|
1604
|
-
(testerInfo?.platforms?.length || 0) > 0 && /* @__PURE__ */ jsxs("div", { className: "bg-
|
|
1605
|
-
/* @__PURE__ */ jsx2("p", { className: "text-xs font-medium text-
|
|
2168
|
+
(testerInfo?.platforms?.length || 0) > 0 && /* @__PURE__ */ jsxs("div", { className: "bg-zinc-800 rounded-lg p-3 mb-3", children: [
|
|
2169
|
+
/* @__PURE__ */ jsx2("p", { className: "text-xs font-medium text-zinc-500 uppercase tracking-wide mb-2", children: "Testing Platforms" }),
|
|
1606
2170
|
/* @__PURE__ */ jsx2("div", { className: "flex flex-wrap gap-2", children: testerInfo?.platforms?.map((platform) => /* @__PURE__ */ jsx2(
|
|
1607
2171
|
"span",
|
|
1608
2172
|
{
|
|
1609
|
-
className: "px-2 py-1 bg-
|
|
2173
|
+
className: "px-2 py-1 bg-blue-900/50 text-blue-300 text-xs rounded-full font-medium",
|
|
1610
2174
|
children: platform === "ios" ? "\u{1F4F1} iOS" : platform === "android" ? "\u{1F916} Android" : "\u{1F310} Web"
|
|
1611
2175
|
},
|
|
1612
2176
|
platform
|
|
@@ -1616,14 +2180,31 @@ function BugBearPanel({
|
|
|
1616
2180
|
"button",
|
|
1617
2181
|
{
|
|
1618
2182
|
onClick: handleStartEditProfile,
|
|
1619
|
-
className: "w-full py-2 px-4 bg-
|
|
2183
|
+
className: "w-full py-2 px-4 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 transition-colors",
|
|
1620
2184
|
children: "Edit Profile"
|
|
1621
2185
|
}
|
|
1622
2186
|
)
|
|
1623
2187
|
] })
|
|
1624
2188
|
) })
|
|
1625
2189
|
] }),
|
|
1626
|
-
/* @__PURE__ */
|
|
2190
|
+
/* @__PURE__ */ jsx2("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__ */ jsxs(Fragment, { children: [
|
|
2191
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
2192
|
+
threads.length,
|
|
2193
|
+
" thread",
|
|
2194
|
+
threads.length !== 1 ? "s" : "",
|
|
2195
|
+
" \xB7 ",
|
|
2196
|
+
unreadCount,
|
|
2197
|
+
" unread"
|
|
2198
|
+
] }),
|
|
2199
|
+
/* @__PURE__ */ jsx2(
|
|
2200
|
+
"button",
|
|
2201
|
+
{
|
|
2202
|
+
onClick: refreshThreads,
|
|
2203
|
+
className: "hover:text-zinc-300",
|
|
2204
|
+
children: "\u21BB Refresh"
|
|
2205
|
+
}
|
|
2206
|
+
)
|
|
2207
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1627
2208
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
1628
2209
|
pendingCount,
|
|
1629
2210
|
" pending \xB7 ",
|
|
@@ -1634,11 +2215,11 @@ function BugBearPanel({
|
|
|
1634
2215
|
"button",
|
|
1635
2216
|
{
|
|
1636
2217
|
onClick: refreshAssignments,
|
|
1637
|
-
className: "hover:text-
|
|
2218
|
+
className: "hover:text-zinc-300",
|
|
1638
2219
|
children: "\u21BB Refresh"
|
|
1639
2220
|
}
|
|
1640
2221
|
)
|
|
1641
|
-
] })
|
|
2222
|
+
] }) })
|
|
1642
2223
|
] })
|
|
1643
2224
|
]
|
|
1644
2225
|
}
|