@parhelia/localization 0.3.12769 → 0.3.12771
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranslationBatches.d.ts","sourceRoot":"","sources":["../../src/translation-center/TranslationBatches.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TranslationBatches.d.ts","sourceRoot":"","sources":["../../src/translation-center/TranslationBatches.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,MAAM,OAAO,CAAC;AAkV1B,wBAAgB,kBAAkB,sBA2mCjC;AAED,eAAO,MAAM,oCAAoC,8BAA8B,CAAC;AAEhF,wBAAgB,8BAA8B,sBA0Y7C"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { useCallback, useEffect, useRef, useState, useMemo, useSyncExternalStore, } from "react";
|
|
3
3
|
import React from "react";
|
|
4
4
|
import { Button, Badge, Select, Input, UserPicker, Popover, PopoverContent, PopoverTrigger, Tooltip, TooltipContent, TooltipTrigger, ContentTree, PageHeader, fetchItemStubs, searchUsers as searchBackendUsers, useEditContext, getLanguages, SimpleIconButton, WorkspaceHomeView, formatDateTime, } from "@parhelia/core";
|
|
5
|
-
import { listBatches, getTranslationProviders, listBatchTranslationJobs, retryBatchTranslation, abortJob, abortBatch, } from "../services/translationService";
|
|
5
|
+
import { listBatches, getTranslationProviders, listBatchTranslationJobs, retryBatchTranslation, abortJob, abortBatch, subscribeToBatch, unsubscribeFromBatch, } from "../services/translationService";
|
|
6
6
|
import { TRANSLATION_BATCH_STARTED_EVENT, } from "../translationEvents";
|
|
7
7
|
import { useDebouncedCallback } from "use-debounce";
|
|
8
8
|
import { X, ChevronDown, Languages, Loader2, Globe, FolderTree, ExternalLink, Check, AlertCircle, CircleStop, Hourglass, Copy, Sparkles, RotateCcw, Plus, } from "lucide-react";
|
|
@@ -581,6 +581,22 @@ export function TranslationBatches() {
|
|
|
581
581
|
});
|
|
582
582
|
setExpandedItems(new Set());
|
|
583
583
|
}, [batchJobs, loadBatchJobs]);
|
|
584
|
+
// Subscribe the current session to the expanded batch so live job-status
|
|
585
|
+
// updates (translation-started/-finished/-error) are delivered here.
|
|
586
|
+
// Without this, NotifyBatchUpdate only reaches the batch initiator's session
|
|
587
|
+
// via an in-memory map — unreliable for long-running/queued jobs (lost on
|
|
588
|
+
// app restart, absent when a different session views the batch), leaving
|
|
589
|
+
// running jobs' statuses stale until a manual reload.
|
|
590
|
+
useEffect(() => {
|
|
591
|
+
const sessionId = editContext?.sessionId;
|
|
592
|
+
if (!sessionId || !expandedBatchId)
|
|
593
|
+
return;
|
|
594
|
+
const batchId = normalizeGuid(expandedBatchId);
|
|
595
|
+
void subscribeToBatch(batchId, sessionId).catch(() => { });
|
|
596
|
+
return () => {
|
|
597
|
+
void unsubscribeFromBatch(batchId, sessionId).catch(() => { });
|
|
598
|
+
};
|
|
599
|
+
}, [expandedBatchId, editContext?.sessionId]);
|
|
584
600
|
const toggleItem = useCallback((key) => {
|
|
585
601
|
setExpandedItems((prev) => {
|
|
586
602
|
const next = new Set(prev);
|
|
@@ -766,21 +782,10 @@ export function TranslationBatches() {
|
|
|
766
782
|
const languages = languagesCsv
|
|
767
783
|
? languagesCsv.split(",")
|
|
768
784
|
: [];
|
|
769
|
-
const completedJobs = info?.completedJobs ?? 0;
|
|
770
785
|
const errorJobs = info?.errorJobs ?? 0;
|
|
771
786
|
const anyError = errorJobs > 0;
|
|
772
787
|
const anyInProgress = isActiveBatchStatus(info?.status);
|
|
773
788
|
const anyAborted = info?.status === "Aborted";
|
|
774
|
-
const progressPct = totalJobs > 0
|
|
775
|
-
? Math.min(100, Math.round((completedJobs / totalJobs) * 100))
|
|
776
|
-
: 0;
|
|
777
|
-
const progressTone = anyError
|
|
778
|
-
? "error"
|
|
779
|
-
: anyAborted
|
|
780
|
-
? "aborted"
|
|
781
|
-
: progressPct >= 100
|
|
782
|
-
? "complete"
|
|
783
|
-
: "active";
|
|
784
789
|
const metaParts = [];
|
|
785
790
|
metaParts.push(_jsxs("span", { className: "text-neutral-grey-100", children: [totalJobs, " translation", totalJobs !== 1 ? "s" : ""] }, "trans"));
|
|
786
791
|
if (typeof itemsCount === "number") {
|
|
@@ -834,6 +839,7 @@ export function TranslationBatches() {
|
|
|
834
839
|
})();
|
|
835
840
|
const isExpanded = expandedBatchId === b.id;
|
|
836
841
|
const jobs = batchJobs[b.id];
|
|
842
|
+
const statusCounts = computeBatchStatusCounts(info, jobs);
|
|
837
843
|
const isLoadingThis = loadingJobs.has(b.id);
|
|
838
844
|
const canRetry = anyError;
|
|
839
845
|
const canAbort = isActiveBatchStatus(info?.status);
|
|
@@ -868,13 +874,13 @@ export function TranslationBatches() {
|
|
|
868
874
|
e.preventDefault();
|
|
869
875
|
toggleBatch(b.id);
|
|
870
876
|
}
|
|
871
|
-
}, children: _jsxs("div", { className: `flex items-start ${isCompactBatches ? "gap-2" : "gap-4"}`, children: [_jsx("div", { className: `shrink-0 text-neutral-grey-100 transition-transform ${isCompactBatches ? "mt-0.5" : "mt-3"} ${isExpanded ? "rotate-180" : ""}`, children: _jsx(ChevronDownIcon, { className: "h-4 w-4" }) }), !isCompactBatches && totalJobs > 0 && (_jsx(BatchProgressIndicator, {
|
|
877
|
+
}, children: _jsxs("div", { className: `flex items-start ${isCompactBatches ? "gap-2" : "gap-4"}`, children: [_jsx("div", { className: `shrink-0 text-neutral-grey-100 transition-transform ${isCompactBatches ? "mt-0.5" : "mt-3"} ${isExpanded ? "rotate-180" : ""}`, children: _jsx(ChevronDownIcon, { className: "h-4 w-4" }) }), !isCompactBatches && totalJobs > 0 && (_jsx(BatchProgressIndicator, { counts: statusCounts, testId: `batch-progress-${b.id}` })), _jsxs("div", { className: `flex min-w-0 flex-1 ${isCompactBatches
|
|
872
878
|
? "flex-col gap-2"
|
|
873
879
|
: "items-center justify-between gap-3"}`, children: [_jsxs("div", { className: "grid min-w-0 flex-1 grid-cols-[minmax(0,1fr)]", children: [_jsx("span", { className: `min-w-0 text-[14px] font-medium text-neutral-grey-100 ${isCompactBatches
|
|
874
880
|
? "whitespace-normal break-words leading-5"
|
|
875
881
|
: "truncate"}`, style: isCompactBatches
|
|
876
882
|
? { overflowWrap: "anywhere" }
|
|
877
|
-
: undefined, title: formattedBatchDate, children: batchDisplayName }), _jsx("div", { className: "mt-1 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-[12px] text-neutral-grey-50", children: desktopMetaParts.map((part, i) => (_jsxs(React.Fragment, { children: [i > 0 && (_jsx("span", { className: "text-neutral-grey-15", children: "\u00B7" })), part] }, i))) }), mobileFooterMetaParts.length > 0 && (_jsx("div", { className: "mt-1 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-[12px] text-neutral-grey-50", children: mobileFooterMetaParts.map((part, i) => (_jsxs(React.Fragment, { children: [i > 0 && (_jsx("span", { className: "text-neutral-grey-15", children: "\u00B7" })), part] }, `footer-${i}`))) }))] }), isCompactBatches && (_jsxs("div", { className: "mt-2 flex min-w-0 items-center gap-2", children: [totalJobs > 0 && (_jsx("div", { className: "min-w-0 flex-1", children: _jsx(BatchProgressIndicator, {
|
|
883
|
+
: undefined, title: formattedBatchDate, children: batchDisplayName }), _jsx("div", { className: "mt-1 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-[12px] text-neutral-grey-50", children: desktopMetaParts.map((part, i) => (_jsxs(React.Fragment, { children: [i > 0 && (_jsx("span", { className: "text-neutral-grey-15", children: "\u00B7" })), part] }, i))) }), mobileFooterMetaParts.length > 0 && (_jsx("div", { className: "mt-1 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-[12px] text-neutral-grey-50", children: mobileFooterMetaParts.map((part, i) => (_jsxs(React.Fragment, { children: [i > 0 && (_jsx("span", { className: "text-neutral-grey-15", children: "\u00B7" })), part] }, `footer-${i}`))) }))] }), isCompactBatches && (_jsxs("div", { className: "mt-2 flex min-w-0 items-center gap-2", children: [totalJobs > 0 && (_jsx("div", { className: "min-w-0 flex-1", children: _jsx(BatchProgressIndicator, { counts: statusCounts, testId: `batch-progress-${b.id}`, variant: "bar" }) })), hasBatchActions && (_jsx("div", { className: "flex shrink-0 items-center gap-1.5", children: batchActions }))] })), !isCompactBatches && hasBatchActions && (_jsx("div", { className: "flex shrink-0 items-center gap-2 self-center", children: batchActions }))] })] }) }), isExpanded && (_jsxs("div", { className: "border-t border-border-default/50", children: [_jsx(CustomPromptPanel, { prompts: parseCustomPrompts(info?.metadata) }), _jsx(BatchItemList, { batchId: b.id, batchProvider: info?.provider, jobs: jobs, isLoading: isLoadingThis, expandedItems: expandedItems, languages: sitecoreLanguages, currentLanguage: editContext?.item?.language, itemFilter: filters.itemIdOrPath.trim(), itemIncludeSubitems: filters.itemIncludeSubitems, statusFilter: filters.status, batchIsTerminal: isTerminalBatchStatus(info?.status), batchStartedAtUtc: info?.startedAtUtc ?? info?.createdAtUtc, abortingJobIds: abortingJobIds, retryingKeys: retryingKeys, isMobile: isMobile, onToggleItem: toggleItem, onOpenItem: openItemInEditor, onAbortJob: handleAbortJob, onRetryJobs: handleRetryJobs })] }))] }, b.id));
|
|
878
884
|
}) })] }, dateGroup.label))), hasMore && (_jsx("div", { className: "flex justify-center pt-6", children: _jsx(Button, { variant: "outline", size: "sm", onClick: loadMore, disabled: isLoadingMore, children: isLoadingMore ? (_jsxs(_Fragment, { children: [_jsx(LoaderIcon, { className: "h-4 w-4 animate-spin text-highlight-100" }), "Loading more..."] })) : (_jsxs(_Fragment, { children: [_jsx(ChevronDownIcon, { className: "h-4 w-4" }), "Load More Batches"] })) }) }))] })) }) })] }));
|
|
879
885
|
}
|
|
880
886
|
export const TRANSLATION_BATCH_FILTERS_SIDEBAR_ID = "translation-batch-filters";
|
|
@@ -1139,44 +1145,102 @@ function formatUsdCost(value) {
|
|
|
1139
1145
|
maximumFractionDigits: value > 0 && value < 0.01 ? 6 : 2,
|
|
1140
1146
|
}).format(value);
|
|
1141
1147
|
}
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1148
|
+
// Ring/bar segment colours mirror the language badge colours, softened with a
|
|
1149
|
+
// touch of transparency so the segmented progress reads as a matching set.
|
|
1150
|
+
const BATCH_SEGMENT_COLORS = {
|
|
1151
|
+
succeeded: "color-mix(in srgb, var(--color-feedback-green) 88%, transparent)",
|
|
1152
|
+
failed: "color-mix(in srgb, var(--color-feedback-red) 88%, transparent)",
|
|
1153
|
+
aborted: "color-mix(in srgb, var(--color-feedback-orange) 88%, transparent)",
|
|
1154
|
+
running: "color-mix(in srgb, var(--color-feedback-blue) 88%, transparent)",
|
|
1155
|
+
};
|
|
1156
|
+
function computeBatchStatusCounts(info, jobs) {
|
|
1157
|
+
if (jobs && jobs.length > 0) {
|
|
1158
|
+
const counts = {
|
|
1159
|
+
total: jobs.length,
|
|
1160
|
+
succeeded: 0,
|
|
1161
|
+
failed: 0,
|
|
1162
|
+
aborted: 0,
|
|
1163
|
+
running: 0,
|
|
1164
|
+
pending: 0,
|
|
1165
|
+
};
|
|
1166
|
+
for (const job of jobs) {
|
|
1167
|
+
switch (job.status) {
|
|
1168
|
+
case "Error":
|
|
1169
|
+
counts.failed += 1;
|
|
1170
|
+
break;
|
|
1171
|
+
case "Aborted":
|
|
1172
|
+
counts.aborted += 1;
|
|
1173
|
+
break;
|
|
1174
|
+
case "In Progress":
|
|
1175
|
+
counts.running += 1;
|
|
1176
|
+
break;
|
|
1177
|
+
case "Pending":
|
|
1178
|
+
counts.pending += 1;
|
|
1179
|
+
break;
|
|
1180
|
+
default:
|
|
1181
|
+
counts.succeeded += 1;
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
return counts;
|
|
1185
|
+
}
|
|
1186
|
+
// No per-job data yet (collapsed batch): derive what we can from the summary.
|
|
1187
|
+
// Running vs. pending can't be told apart here, so the remainder stays in the
|
|
1188
|
+
// neutral track rather than being guessed as "running".
|
|
1189
|
+
const total = info?.expectedJobs ?? 0;
|
|
1190
|
+
const succeeded = Math.min(total, info?.completedJobs ?? 0);
|
|
1191
|
+
const failed = Math.min(Math.max(0, total - succeeded), info?.errorJobs ?? 0);
|
|
1192
|
+
const remaining = Math.max(0, total - succeeded - failed);
|
|
1193
|
+
const aborted = info?.status === "Aborted" ? remaining : 0;
|
|
1194
|
+
const pending = info?.status === "Aborted" ? 0 : remaining;
|
|
1195
|
+
return { total, succeeded, failed, aborted, running: 0, pending };
|
|
1196
|
+
}
|
|
1197
|
+
function BatchProgressIndicator({ counts, testId, variant = "circle", }) {
|
|
1198
|
+
const { total, succeeded, failed, aborted, running } = counts;
|
|
1199
|
+
const percent = total > 0
|
|
1200
|
+
? Math.max(0, Math.min(100, Math.round((succeeded / total) * 100)))
|
|
1201
|
+
: 0;
|
|
1202
|
+
const allSucceeded = total > 0 && succeeded === total;
|
|
1203
|
+
// Colour-carrying segments in tooltip order; pending stays in the track.
|
|
1204
|
+
const segments = [
|
|
1205
|
+
{ key: "succeeded", count: succeeded, color: BATCH_SEGMENT_COLORS.succeeded },
|
|
1206
|
+
{ key: "failed", count: failed, color: BATCH_SEGMENT_COLORS.failed },
|
|
1207
|
+
{ key: "aborted", count: aborted, color: BATCH_SEGMENT_COLORS.aborted },
|
|
1208
|
+
{ key: "running", count: running, color: BATCH_SEGMENT_COLORS.running },
|
|
1209
|
+
].filter((seg) => seg.count > 0);
|
|
1210
|
+
// The centre number is the success rate, so it always reads in the success
|
|
1211
|
+
// colour; failed/aborted/running are conveyed by the ring segments instead.
|
|
1212
|
+
const textToneClass = "text-feedback-green";
|
|
1213
|
+
const parts = [`${succeeded}/${total} succeeded`];
|
|
1214
|
+
if (failed > 0)
|
|
1215
|
+
parts.push(`${failed} failed`);
|
|
1216
|
+
if (aborted > 0)
|
|
1217
|
+
parts.push(`${aborted} aborted`);
|
|
1218
|
+
if (running > 0)
|
|
1219
|
+
parts.push(`${running} running`);
|
|
1220
|
+
const label = parts.join(", ");
|
|
1170
1221
|
if (variant === "bar") {
|
|
1171
|
-
return (_jsxs(Tooltip, { delayDuration: 250, children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex min-w-0 items-center gap-2", "aria-label": label, "data-testid": testId, children: [_jsx("div", { className: "h-1.5 min-w-0 flex-1 overflow-hidden rounded-full",
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1222
|
+
return (_jsxs(Tooltip, { delayDuration: 250, children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex min-w-0 items-center gap-2", "aria-label": label, "data-testid": testId, children: [_jsx("div", { className: "bg-neutral-grey-15 flex h-1.5 min-w-0 flex-1 overflow-hidden rounded-full", children: total > 0 &&
|
|
1223
|
+
segments.map((seg) => (_jsx("div", { className: "h-full", style: {
|
|
1224
|
+
width: `${(seg.count / total) * 100}%`,
|
|
1225
|
+
backgroundColor: seg.color,
|
|
1226
|
+
} }, seg.key))) }), allSucceeded ? (_jsx(CheckIcon, { className: "text-feedback-green h-3 w-3 shrink-0", style: { strokeWidth: 3 } })) : (_jsxs("span", { className: `shrink-0 text-[11px] leading-none font-medium tabular-nums ${textToneClass}`, children: [percent, "%"] }))] }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, children: label })] }));
|
|
1175
1227
|
}
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1228
|
+
const radius = 16;
|
|
1229
|
+
const strokeWidth = 3;
|
|
1230
|
+
const circumference = 2 * Math.PI * radius;
|
|
1231
|
+
const gap = segments.length > 1 ? circumference * 0.02 : 0;
|
|
1232
|
+
let segStart = 0;
|
|
1233
|
+
return (_jsxs(Tooltip, { delayDuration: 250, children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "relative h-10 w-10 shrink-0 rounded-full", "aria-label": label, "data-testid": testId, children: [_jsxs("svg", { className: "h-10 w-10 -rotate-90", viewBox: "0 0 40 40", children: [allSucceeded && (_jsx("circle", { cx: "20", cy: "20", r: radius - strokeWidth / 2, fill: "var(--color-feedback-green-light)" })), _jsx("circle", { cx: "20", cy: "20", r: radius, fill: "none", stroke: "var(--color-neutral-grey-15)", strokeWidth: strokeWidth }), total > 0 &&
|
|
1234
|
+
segments.map((seg) => {
|
|
1235
|
+
const segLen = (seg.count / total) * circumference;
|
|
1236
|
+
const dash = Math.max(0, segLen - gap);
|
|
1237
|
+
const dashOffset = -segStart;
|
|
1238
|
+
segStart += segLen;
|
|
1239
|
+
return (_jsx("circle", { cx: "20", cy: "20", r: radius, fill: "none", stroke: seg.color, strokeLinecap: "butt", strokeWidth: strokeWidth, style: {
|
|
1240
|
+
strokeDasharray: `${dash} ${circumference}`,
|
|
1241
|
+
strokeDashoffset: dashOffset,
|
|
1242
|
+
} }, seg.key));
|
|
1243
|
+
})] }), _jsx("span", { className: "absolute inset-0 flex items-center justify-center", children: allSucceeded ? (_jsx(CheckIcon, { className: "text-feedback-green h-4 w-4", style: { strokeWidth: 3 } })) : (_jsxs("span", { className: `text-[10px] leading-none font-medium tabular-nums ${textToneClass}`, children: [percent, "%"] })) })] }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, children: label })] }));
|
|
1180
1244
|
}
|
|
1181
1245
|
function itemStatusDot(jobs) {
|
|
1182
1246
|
const hasError = jobs.some((j) => j.status === "Error");
|
|
@@ -1186,7 +1250,7 @@ function itemStatusDot(jobs) {
|
|
|
1186
1250
|
if (hasError)
|
|
1187
1251
|
return { cls: "bg-feedback-red", label: "Has errors" };
|
|
1188
1252
|
if (hasInProgress)
|
|
1189
|
-
return { cls: "bg-
|
|
1253
|
+
return { cls: "bg-feedback-blue", label: "In progress" };
|
|
1190
1254
|
if (hasPending)
|
|
1191
1255
|
return { cls: "bg-neutral-grey-15", label: "Queued" };
|
|
1192
1256
|
if (hasAborted)
|
|
@@ -1428,7 +1492,7 @@ function BatchItemList({ batchId, batchProvider, jobs, isLoading, expandedItems,
|
|
|
1428
1492
|
return;
|
|
1429
1493
|
void onRetryJobs(batchId, batchProvider, itemErrorJobs, itemRetryKey);
|
|
1430
1494
|
}, icon: _jsx(RetryIcon, { className: `h-3.5 w-3.5 ${isRetryingItem ? "animate-spin" : ""}`, strokeWidth: 1 }), label: "Retry failed translations for this item", disabled: itemErrorJobs.length === 0 || isRetryingItem }) })) : null;
|
|
1431
|
-
const itemContent = (_jsxs("div", { className: `flex min-w-0 items-start ${stackLanguageChips ? "gap-2" : "gap-2.5"}`, children: [_jsx("span", { className: "mt-1 shrink-0", children: itemAnyInProgress ? (_jsx(LoaderIcon, { className: "h-3 w-3 animate-spin text-
|
|
1495
|
+
const itemContent = (_jsxs("div", { className: `flex min-w-0 items-start ${stackLanguageChips ? "gap-2" : "gap-2.5"}`, children: [_jsx("span", { className: "mt-1 shrink-0", children: itemAnyInProgress ? (_jsx(LoaderIcon, { className: "h-3 w-3 animate-spin text-feedback-blue" })) : itemIsQueued ? (_jsx(QueuedIcon, { className: "h-3 w-3 text-neutral-grey-50", strokeWidth: 1, "aria-label": "Queued" })) : (_jsx("span", { className: `block h-1.5 w-1.5 rounded-full ${status.cls}`, "aria-hidden": "true" })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("span", { className: `block min-w-0 text-[13px] text-neutral-grey-100 ${stackLanguageChips ? "break-words" : "truncate"}`, style: stackLanguageChips
|
|
1432
1496
|
? { overflowWrap: "anywhere" }
|
|
1433
1497
|
: undefined, title: titleAttr, children: displayName }), itemPath && (_jsx("div", { className: "whitespace-normal break-words font-mono text-[11px] text-neutral-grey-50", style: { overflowWrap: "anywhere" }, title: titleAttr, children: itemPath })), stackLanguageChips && (_jsx("div", { className: "mt-2", children: languageChips })), stackLanguageChips && retryAction && (_jsx("div", { className: "mt-2 flex justify-start", children: retryAction }))] })] }));
|
|
1434
1498
|
return (_jsxs("tr", { role: "button", tabIndex: 0, className: `group cursor-pointer transition-colors hover:bg-neutral-grey-5 ${itemIndex > 0 ? "border-t border-border-default/50" : ""}`, onClick: () => {
|
|
@@ -1455,7 +1519,7 @@ function LanguageJobChip({ job, language, batchStartedAtUtc, onOpen, isAborting
|
|
|
1455
1519
|
: jobAborted
|
|
1456
1520
|
? "border-feedback-orange bg-feedback-orange-light text-feedback-orange hover:bg-feedback-orange-light"
|
|
1457
1521
|
: jobInProgress
|
|
1458
|
-
? "border-
|
|
1522
|
+
? "border-feedback-blue/30 bg-feedback-blue-light text-feedback-blue hover:brightness-95"
|
|
1459
1523
|
: jobPending
|
|
1460
1524
|
? "border-border-default bg-neutral-grey-5 text-neutral-grey-50 hover:bg-neutral-grey-5"
|
|
1461
1525
|
: "border-feedback-green bg-feedback-green-light text-feedback-green hover:border-feedback-green hover:brightness-95";
|
|
@@ -1464,7 +1528,7 @@ function LanguageJobChip({ job, language, batchStartedAtUtc, onOpen, isAborting
|
|
|
1464
1528
|
: jobAborted
|
|
1465
1529
|
? "bg-feedback-orange-light text-feedback-orange"
|
|
1466
1530
|
: jobInProgress
|
|
1467
|
-
? "bg-
|
|
1531
|
+
? "bg-feedback-blue-light text-feedback-blue"
|
|
1468
1532
|
: jobPending
|
|
1469
1533
|
? "bg-neutral-grey-5 text-neutral-grey-50"
|
|
1470
1534
|
: "bg-feedback-green-light text-feedback-green";
|