@burdenoff/fluidgrids-fe-sdk 2026.804.1 → 2026.804.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/ExecutionDetailPage-FF2DYKAZ.js +10 -0
  2. package/dist/{ExecutionDetailPage-FCY3S336.js.map → ExecutionDetailPage-FF2DYKAZ.js.map} +1 -1
  3. package/dist/ExecutionsListPage-NKISRFMA.js +9 -0
  4. package/dist/{ExecutionsListPage-IZJPACQV.js.map → ExecutionsListPage-NKISRFMA.js.map} +1 -1
  5. package/dist/{MissingNodesInstallModal-OT3LJZ4M.js → MissingNodesInstallModal-HA5L3FK2.js} +4 -3
  6. package/dist/MissingNodesInstallModal-HA5L3FK2.js.map +1 -0
  7. package/dist/{TemplateConfigurationModal-7OT6QBEA.js → TemplateConfigurationModal-MXNGZQIC.js} +90 -21
  8. package/dist/TemplateConfigurationModal-MXNGZQIC.js.map +1 -0
  9. package/dist/{TemplateDetailPanel-T3ZHXOHX.js → TemplateDetailPanel-CJ3NPVTP.js} +50 -14
  10. package/dist/TemplateDetailPanel-CJ3NPVTP.js.map +1 -0
  11. package/dist/{WorkflowBuilder-42S2S3PO.js → WorkflowBuilder-ETVB66U6.js} +6 -5
  12. package/dist/{WorkflowBuilder-42S2S3PO.js.map → WorkflowBuilder-ETVB66U6.js.map} +1 -1
  13. package/dist/WorkflowsList-TZAN3YBA.js +11 -0
  14. package/dist/{WorkflowsList-L7EJW54K.js.map → WorkflowsList-TZAN3YBA.js.map} +1 -1
  15. package/dist/{chunk-WAVGHDYH.js → chunk-6PNRM3KQ.js} +469 -114
  16. package/dist/chunk-6PNRM3KQ.js.map +1 -0
  17. package/dist/chunk-7VNIEIR6.js +21 -0
  18. package/dist/chunk-7VNIEIR6.js.map +1 -0
  19. package/dist/{chunk-F5ACDIYR.js → chunk-IWKLEFC7.js} +205 -51
  20. package/dist/chunk-IWKLEFC7.js.map +1 -0
  21. package/dist/{chunk-BRMURCHH.js → chunk-OHGXRM6Z.js} +5 -3
  22. package/dist/chunk-OHGXRM6Z.js.map +1 -0
  23. package/dist/{chunk-CQAHXNT2.js → chunk-SG7Z2IRQ.js} +55 -18
  24. package/dist/chunk-SG7Z2IRQ.js.map +1 -0
  25. package/dist/{chunk-CN3VSAYR.js → chunk-WQ4QNHDN.js} +4600 -1229
  26. package/dist/chunk-WQ4QNHDN.js.map +1 -0
  27. package/dist/{chunk-JPHK5LAL.js → chunk-Y36DJHU3.js} +24 -8
  28. package/dist/chunk-Y36DJHU3.js.map +1 -0
  29. package/dist/{chunk-S7FNNFPU.js → chunk-YJKZSUNC.js} +140 -46
  30. package/dist/chunk-YJKZSUNC.js.map +1 -0
  31. package/dist/index.d.ts +33 -2
  32. package/dist/index.js +637 -174
  33. package/dist/index.js.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/ExecutionDetailPage-FCY3S336.js +0 -9
  36. package/dist/ExecutionsListPage-IZJPACQV.js +0 -8
  37. package/dist/MissingNodesInstallModal-OT3LJZ4M.js.map +0 -1
  38. package/dist/TemplateConfigurationModal-7OT6QBEA.js.map +0 -1
  39. package/dist/TemplateDetailPanel-T3ZHXOHX.js.map +0 -1
  40. package/dist/WorkflowsList-L7EJW54K.js +0 -10
  41. package/dist/chunk-BRMURCHH.js.map +0 -1
  42. package/dist/chunk-CN3VSAYR.js.map +0 -1
  43. package/dist/chunk-CQAHXNT2.js.map +0 -1
  44. package/dist/chunk-F5ACDIYR.js.map +0 -1
  45. package/dist/chunk-JPHK5LAL.js.map +0 -1
  46. package/dist/chunk-S7FNNFPU.js.map +0 -1
  47. package/dist/chunk-WAVGHDYH.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { ExecutionDetailDocument, ExecutionStatsDocument, throwIfResultError, PauseExecutionDocument, ResumeExecutionDocument, CancelExecutionDocument, RetryNodeDocument, TerminateExecutionDocument, ExecutionsListDocument } from './chunk-V5UEEB74.js';
2
2
  import { getFluidGridsClient } from './chunk-5BDQNSP3.js';
3
+ import { useTr } from './chunk-7VNIEIR6.js';
3
4
  import { Icon } from '@iconify/react';
4
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
6
  import { create } from 'zustand';
@@ -338,29 +339,117 @@ var useExecutionsStore = create((set) => ({
338
339
  }),
339
340
  clearLiveRuns: () => set({ liveRunIds: /* @__PURE__ */ new Set() })
340
341
  }));
341
- var STATUS_OPTIONS = [
342
- { value: "all", label: "All Statuses" },
343
- { value: "RUNNING", label: "Running" },
344
- { value: "COMPLETED", label: "Completed" },
345
- { value: "FAILED", label: "Failed" },
346
- { value: "PENDING", label: "Pending" },
347
- { value: "CANCELLED", label: "Cancelled" },
348
- { value: "WAITING", label: "Waiting" },
349
- { value: "TERMINATED", label: "Terminated" }
350
- ];
351
- var DATE_PRESETS = [
352
- { value: "all", label: "All Time" },
353
- { value: "today", label: "Today" },
354
- { value: "yesterday", label: "Yesterday" },
355
- { value: "7days", label: "Last 7 Days" },
356
- { value: "30days", label: "Last 30 Days" },
357
- { value: "90days", label: "Last 90 Days" },
358
- { value: "custom", label: "Custom Range" }
359
- ];
360
342
  function ExecutionFilters({
361
343
  workflows = [],
362
344
  onRefresh
363
345
  }) {
346
+ const tr = useTr();
347
+ const statusOptions = [
348
+ {
349
+ value: "all",
350
+ label: tr(
351
+ "fluidgrids.executions.executionFilters.statusAll",
352
+ "All Statuses"
353
+ )
354
+ },
355
+ {
356
+ value: "RUNNING",
357
+ label: tr(
358
+ "fluidgrids.executions.executionFilters.statusRunning",
359
+ "Running"
360
+ )
361
+ },
362
+ {
363
+ value: "COMPLETED",
364
+ label: tr(
365
+ "fluidgrids.executions.executionFilters.statusCompleted",
366
+ "Completed"
367
+ )
368
+ },
369
+ {
370
+ value: "FAILED",
371
+ label: tr(
372
+ "fluidgrids.executions.executionFilters.statusFailed",
373
+ "Failed"
374
+ )
375
+ },
376
+ {
377
+ value: "PENDING",
378
+ label: tr(
379
+ "fluidgrids.executions.executionFilters.statusPending",
380
+ "Pending"
381
+ )
382
+ },
383
+ {
384
+ value: "CANCELLED",
385
+ label: tr(
386
+ "fluidgrids.executions.executionFilters.statusCancelled",
387
+ "Cancelled"
388
+ )
389
+ },
390
+ {
391
+ value: "WAITING",
392
+ label: tr(
393
+ "fluidgrids.executions.executionFilters.statusWaiting",
394
+ "Waiting"
395
+ )
396
+ },
397
+ {
398
+ value: "TERMINATED",
399
+ label: tr(
400
+ "fluidgrids.executions.executionFilters.statusTerminated",
401
+ "Terminated"
402
+ )
403
+ }
404
+ ];
405
+ const datePresets = [
406
+ {
407
+ value: "all",
408
+ label: tr(
409
+ "fluidgrids.executions.executionFilters.dateAllTime",
410
+ "All Time"
411
+ )
412
+ },
413
+ {
414
+ value: "today",
415
+ label: tr("fluidgrids.executions.executionFilters.dateToday", "Today")
416
+ },
417
+ {
418
+ value: "yesterday",
419
+ label: tr(
420
+ "fluidgrids.executions.executionFilters.dateYesterday",
421
+ "Yesterday"
422
+ )
423
+ },
424
+ {
425
+ value: "7days",
426
+ label: tr(
427
+ "fluidgrids.executions.executionFilters.dateLast7Days",
428
+ "Last 7 Days"
429
+ )
430
+ },
431
+ {
432
+ value: "30days",
433
+ label: tr(
434
+ "fluidgrids.executions.executionFilters.dateLast30Days",
435
+ "Last 30 Days"
436
+ )
437
+ },
438
+ {
439
+ value: "90days",
440
+ label: tr(
441
+ "fluidgrids.executions.executionFilters.dateLast90Days",
442
+ "Last 90 Days"
443
+ )
444
+ },
445
+ {
446
+ value: "custom",
447
+ label: tr(
448
+ "fluidgrids.executions.executionFilters.dateCustomRange",
449
+ "Custom Range"
450
+ )
451
+ }
452
+ ];
364
453
  const {
365
454
  filter,
366
455
  setStatusFilter,
@@ -435,7 +524,10 @@ function ExecutionFilters({
435
524
  "input",
436
525
  {
437
526
  type: "text",
438
- placeholder: "Search by workflow name or run ID...",
527
+ placeholder: tr(
528
+ "fluidgrids.executions.executionFilters.searchPlaceholder",
529
+ "Search by workflow name or run ID..."
530
+ ),
439
531
  value: filter.search,
440
532
  onChange: (e) => setSearchQuery(e.target.value),
441
533
  className: "w-full pl-[3.25rem] pr-4 py-2 bg-background-secondary border border-border-secondary rounded-lg text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-action-primary-bg focus:border-transparent"
@@ -456,7 +548,7 @@ function ExecutionFilters({
456
548
  value: filter.status,
457
549
  onChange: (e) => setStatusFilter(e.target.value),
458
550
  className: "px-3 py-2 bg-background-secondary border border-border-secondary rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
459
- children: STATUS_OPTIONS.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, option.value))
551
+ children: statusOptions.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, option.value))
460
552
  }
461
553
  ),
462
554
  workflows.length > 0 && /* @__PURE__ */ jsxs(
@@ -466,7 +558,10 @@ function ExecutionFilters({
466
558
  onChange: (e) => setWorkflowFilter(e.target.value),
467
559
  className: "px-3 py-2 bg-background-secondary border border-border-secondary rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg max-w-[200px]",
468
560
  children: [
469
- /* @__PURE__ */ jsx("option", { value: "", children: "All Workflows" }),
561
+ /* @__PURE__ */ jsx("option", { value: "", children: tr(
562
+ "fluidgrids.executions.executionFilters.allWorkflows",
563
+ "All Workflows"
564
+ ) }),
470
565
  workflows.map((wf) => /* @__PURE__ */ jsx("option", { value: wf.workflowKey, children: wf.name }, wf.workflowKey))
471
566
  ]
472
567
  }
@@ -477,12 +572,12 @@ function ExecutionFilters({
477
572
  value: filter.dateRange.preset,
478
573
  onChange: (e) => handleDatePresetChange(e.target.value),
479
574
  className: "px-3 py-2 bg-background-secondary border border-border-secondary rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
480
- children: DATE_PRESETS.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, option.value))
575
+ children: datePresets.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, option.value))
481
576
  }
482
577
  )
483
578
  ] }),
484
579
  showCustomDate && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-3 items-center p-3 bg-background-secondary rounded-lg border border-border-secondary", children: [
485
- /* @__PURE__ */ jsx("label", { className: "text-sm text-text-secondary", children: "From:" }),
580
+ /* @__PURE__ */ jsx("label", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionFilters.fromLabel", "From:") }),
486
581
  /* @__PURE__ */ jsx(
487
582
  "input",
488
583
  {
@@ -496,7 +591,7 @@ function ExecutionFilters({
496
591
  className: "px-3 py-1.5 bg-background-primary border border-border-secondary rounded text-text-primary text-sm"
497
592
  }
498
593
  ),
499
- /* @__PURE__ */ jsx("label", { className: "text-sm text-text-secondary", children: "To:" }),
594
+ /* @__PURE__ */ jsx("label", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionFilters.toLabel", "To:") }),
500
595
  /* @__PURE__ */ jsx(
501
596
  "input",
502
597
  {
@@ -531,7 +626,10 @@ function ExecutionFilters({
531
626
  className: "w-4 h-4 rounded border-border-secondary text-action-primary-bg focus:ring-action-primary-bg"
532
627
  }
533
628
  ),
534
- /* @__PURE__ */ jsx("span", { className: "text-sm text-text-secondary", children: "Auto-refresh" })
629
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-text-secondary", children: tr(
630
+ "fluidgrids.executions.executionFilters.autoRefresh",
631
+ "Auto-refresh"
632
+ ) })
535
633
  ] }),
536
634
  onRefresh && /* @__PURE__ */ jsxs(
537
635
  Button,
@@ -542,7 +640,7 @@ function ExecutionFilters({
542
640
  className: "gap-1.5",
543
641
  children: [
544
642
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", width: 16 }),
545
- "Refresh"
643
+ tr("fluidgrids.executions.executionFilters.refresh", "Refresh")
546
644
  ]
547
645
  }
548
646
  )
@@ -564,7 +662,10 @@ function ExecutionFilters({
564
662
  className: "gap-1.5",
565
663
  children: [
566
664
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:filter-remove", width: 16 }),
567
- "Clear Filters"
665
+ tr(
666
+ "fluidgrids.executions.executionFilters.clearFilters",
667
+ "Clear Filters"
668
+ )
568
669
  ]
569
670
  }
570
671
  )
@@ -617,6 +718,7 @@ function ExecutionStats({
617
718
  loading,
618
719
  onFilterByStatus
619
720
  }) {
721
+ const tr = useTr();
620
722
  if (loading) {
621
723
  return /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-6 gap-4", children: [...Array(6)].map((_, i) => /* @__PURE__ */ jsx(
622
724
  "div",
@@ -638,7 +740,10 @@ function ExecutionStats({
638
740
  /* @__PURE__ */ jsx(
639
741
  StatCard,
640
742
  {
641
- label: "Total Runs",
743
+ label: tr(
744
+ "fluidgrids.executions.executionStats.totalRuns",
745
+ "Total Runs"
746
+ ),
642
747
  value: stats.total.toLocaleString(),
643
748
  icon: "mdi:play-box-multiple",
644
749
  color: "text-text-primary",
@@ -648,7 +753,7 @@ function ExecutionStats({
648
753
  /* @__PURE__ */ jsx(
649
754
  StatCard,
650
755
  {
651
- label: "Running",
756
+ label: tr("fluidgrids.executions.executionStats.running", "Running"),
652
757
  value: stats.running,
653
758
  icon: "mdi:play-circle",
654
759
  color: "text-[var(--color-status-info-text)]",
@@ -658,7 +763,10 @@ function ExecutionStats({
658
763
  /* @__PURE__ */ jsx(
659
764
  StatCard,
660
765
  {
661
- label: "Completed",
766
+ label: tr(
767
+ "fluidgrids.executions.executionStats.completed",
768
+ "Completed"
769
+ ),
662
770
  value: stats.completed.toLocaleString(),
663
771
  icon: "mdi:check-circle",
664
772
  color: "text-[var(--color-status-success-text)]",
@@ -668,7 +776,7 @@ function ExecutionStats({
668
776
  /* @__PURE__ */ jsx(
669
777
  StatCard,
670
778
  {
671
- label: "Failed",
779
+ label: tr("fluidgrids.executions.executionStats.failed", "Failed"),
672
780
  value: stats.failed,
673
781
  icon: "mdi:alert-circle",
674
782
  color: "text-[var(--color-status-error-text)]",
@@ -678,7 +786,10 @@ function ExecutionStats({
678
786
  /* @__PURE__ */ jsx(
679
787
  StatCard,
680
788
  {
681
- label: "Success Rate",
789
+ label: tr(
790
+ "fluidgrids.executions.executionStats.successRate",
791
+ "Success Rate"
792
+ ),
682
793
  value: `${(stats.successRate ?? 0).toFixed(1)}%`,
683
794
  icon: "mdi:percent",
684
795
  color: "text-accent"
@@ -687,7 +798,10 @@ function ExecutionStats({
687
798
  /* @__PURE__ */ jsx(
688
799
  StatCard,
689
800
  {
690
- label: "Avg Duration",
801
+ label: tr(
802
+ "fluidgrids.executions.executionStats.avgDuration",
803
+ "Avg Duration"
804
+ ),
691
805
  value: formatDuration3(stats.avgDuration ?? 0),
692
806
  icon: "mdi:timer",
693
807
  color: "text-[var(--color-status-warning-text)]"
@@ -734,6 +848,7 @@ function ExecutionTable({
734
848
  onRowClick,
735
849
  onAction
736
850
  }) {
851
+ const tr = useTr();
737
852
  const navigate = useNavigate();
738
853
  const {
739
854
  selection,
@@ -756,7 +871,8 @@ function ExecutionTable({
756
871
  const date = new Date(dateStr);
757
872
  const now = /* @__PURE__ */ new Date();
758
873
  const diff = now.getTime() - date.getTime();
759
- if (diff < 6e4) return "Just now";
874
+ if (diff < 6e4)
875
+ return tr("fluidgrids.executions.executionTable.justNow", "Just now");
760
876
  if (diff < 36e5) return `${Math.round(diff / 6e4)}m ago`;
761
877
  if (diff < 864e5) return `${Math.round(diff / 36e5)}h ago`;
762
878
  if (diff < 6048e5) return `${Math.round(diff / 864e5)}d ago`;
@@ -771,18 +887,60 @@ function ExecutionTable({
771
887
  const actions = [];
772
888
  switch (execution.status) {
773
889
  case "RUNNING":
774
- actions.push({ icon: "mdi:pause", label: "Pause", action: "pause" });
775
- actions.push({ icon: "mdi:stop", label: "Cancel", action: "cancel" });
890
+ actions.push({
891
+ icon: "mdi:pause",
892
+ label: tr(
893
+ "fluidgrids.executions.executionTable.actionPause",
894
+ "Pause"
895
+ ),
896
+ action: "pause"
897
+ });
898
+ actions.push({
899
+ icon: "mdi:stop",
900
+ label: tr(
901
+ "fluidgrids.executions.executionTable.actionCancel",
902
+ "Cancel"
903
+ ),
904
+ action: "cancel"
905
+ });
776
906
  break;
777
907
  case "WAITING":
778
- actions.push({ icon: "mdi:play", label: "Resume", action: "resume" });
779
- actions.push({ icon: "mdi:stop", label: "Cancel", action: "cancel" });
908
+ actions.push({
909
+ icon: "mdi:play",
910
+ label: tr(
911
+ "fluidgrids.executions.executionTable.actionResume",
912
+ "Resume"
913
+ ),
914
+ action: "resume"
915
+ });
916
+ actions.push({
917
+ icon: "mdi:stop",
918
+ label: tr(
919
+ "fluidgrids.executions.executionTable.actionCancel",
920
+ "Cancel"
921
+ ),
922
+ action: "cancel"
923
+ });
780
924
  break;
781
925
  case "FAILED":
782
- actions.push({ icon: "mdi:refresh", label: "Retry", action: "retry" });
926
+ actions.push({
927
+ icon: "mdi:refresh",
928
+ label: tr(
929
+ "fluidgrids.executions.executionTable.actionRetry",
930
+ "Retry"
931
+ ),
932
+ action: "retry"
933
+ });
783
934
  break;
784
935
  case "PENDING":
785
- actions.push({ icon: "mdi:stop", label: "Cancel", action: "cancel" });
936
+ actions.push({
937
+ icon: "mdi:stop",
938
+ label: tr(
939
+ "fluidgrids.executions.executionTable.actionCancel",
940
+ "Cancel"
941
+ ),
942
+ action: "cancel"
943
+ });
786
944
  break;
787
945
  }
788
946
  return actions;
@@ -791,12 +949,30 @@ function ExecutionTable({
791
949
  return /* @__PURE__ */ jsx("div", { className: "bg-background-secondary rounded-lg border border-border-secondary overflow-hidden", children: /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "w-full min-w-[800px]", children: [
792
950
  /* @__PURE__ */ jsx("thead", { className: "bg-background-tertiary border-b border-border-secondary", children: /* @__PURE__ */ jsxs("tr", { children: [
793
951
  /* @__PURE__ */ jsx("th", { className: "w-10 px-4 py-3" }),
794
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: "Status" }),
795
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: "Workflow" }),
796
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: "Run ID" }),
797
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: "Started" }),
798
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: "Duration" }),
799
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: "Progress" }),
952
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: tr(
953
+ "fluidgrids.executions.executionTable.colStatus",
954
+ "Status"
955
+ ) }),
956
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: tr(
957
+ "fluidgrids.executions.executionTable.colWorkflow",
958
+ "Workflow"
959
+ ) }),
960
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: tr(
961
+ "fluidgrids.executions.executionTable.colRunId",
962
+ "Run ID"
963
+ ) }),
964
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: tr(
965
+ "fluidgrids.executions.executionTable.colStarted",
966
+ "Started"
967
+ ) }),
968
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: tr(
969
+ "fluidgrids.executions.executionTable.colDuration",
970
+ "Duration"
971
+ ) }),
972
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase", children: tr(
973
+ "fluidgrids.executions.executionTable.colProgress",
974
+ "Progress"
975
+ ) }),
800
976
  /* @__PURE__ */ jsx("th", { className: "px-4 py-3" })
801
977
  ] }) }),
802
978
  /* @__PURE__ */ jsx("tbody", { children: [...Array(5)].map((_, i) => /* @__PURE__ */ jsx("tr", { className: "border-b border-border-secondary", children: /* @__PURE__ */ jsx("td", { colSpan: 8, className: "px-4 py-4", children: /* @__PURE__ */ jsx("div", { className: "h-8 bg-background-tertiary rounded animate-pulse" }) }) }, i)) })
@@ -812,9 +988,18 @@ function ExecutionTable({
812
988
  width: 48
813
989
  }
814
990
  ),
815
- /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-2", children: "No executions found" }),
816
- /* @__PURE__ */ jsx("p", { className: "text-text-secondary mb-4", children: "There are no workflow executions matching your filters." }),
817
- /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => navigate("../list"), children: "View Workflows" })
991
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-2", children: tr(
992
+ "fluidgrids.executions.executionTable.emptyTitle",
993
+ "No executions found"
994
+ ) }),
995
+ /* @__PURE__ */ jsx("p", { className: "text-text-secondary mb-4", children: tr(
996
+ "fluidgrids.executions.executionTable.emptyDescription",
997
+ "There are no workflow executions matching your filters."
998
+ ) }),
999
+ /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => navigate("../list"), children: tr(
1000
+ "fluidgrids.executions.executionTable.viewWorkflows",
1001
+ "View Workflows"
1002
+ ) })
818
1003
  ] });
819
1004
  }
820
1005
  return /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary overflow-hidden", children: [
@@ -829,12 +1014,24 @@ function ExecutionTable({
829
1014
  className: "w-4 h-4 rounded border-border-secondary"
830
1015
  }
831
1016
  ) }),
832
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: "Status" }),
833
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: "Workflow" }),
834
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: "Run ID" }),
835
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: "Started" }),
836
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: "Duration" }),
837
- /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: "Progress" }),
1017
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: tr("fluidgrids.executions.executionTable.colStatus", "Status") }),
1018
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: tr(
1019
+ "fluidgrids.executions.executionTable.colWorkflow",
1020
+ "Workflow"
1021
+ ) }),
1022
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: tr("fluidgrids.executions.executionTable.colRunId", "Run ID") }),
1023
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: tr(
1024
+ "fluidgrids.executions.executionTable.colStarted",
1025
+ "Started"
1026
+ ) }),
1027
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: tr(
1028
+ "fluidgrids.executions.executionTable.colDuration",
1029
+ "Duration"
1030
+ ) }),
1031
+ /* @__PURE__ */ jsx("th", { className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider", children: tr(
1032
+ "fluidgrids.executions.executionTable.colProgress",
1033
+ "Progress"
1034
+ ) }),
838
1035
  /* @__PURE__ */ jsx("th", { className: "px-4 py-3 w-32" })
839
1036
  ] }) }),
840
1037
  /* @__PURE__ */ jsx("tbody", { className: "divide-y divide-border-secondary", children: executions.map((execution) => {
@@ -933,7 +1130,10 @@ function ExecutionTable({
933
1130
  {
934
1131
  onClick: () => navigate(`../runs/${execution.id}`),
935
1132
  className: "p-1.5 rounded hover:bg-background-tertiary text-text-secondary",
936
- title: "View Details",
1133
+ title: tr(
1134
+ "fluidgrids.executions.executionTable.viewDetails",
1135
+ "View Details"
1136
+ ),
937
1137
  children: /* @__PURE__ */ jsx(Icon, { icon: "mdi:arrow-right", width: 18 })
938
1138
  }
939
1139
  )
@@ -951,32 +1151,56 @@ function ExecutionTable({
951
1151
  className: "px-4 py-4 bg-background-tertiary/30",
952
1152
  children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 lg:grid-cols-4 gap-4", children: [
953
1153
  /* @__PURE__ */ jsxs("div", { children: [
954
- /* @__PURE__ */ jsx("div", { className: "text-xs text-text-secondary mb-1", children: "Trigger Node" }),
1154
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-text-secondary mb-1", children: tr(
1155
+ "fluidgrids.executions.executionTable.triggerNode",
1156
+ "Trigger Node"
1157
+ ) }),
955
1158
  /* @__PURE__ */ jsx("div", { className: "text-sm text-text-primary font-medium", children: execution.triggerNodeId })
956
1159
  ] }),
957
1160
  /* @__PURE__ */ jsxs("div", { children: [
958
- /* @__PURE__ */ jsx("div", { className: "text-xs text-text-secondary mb-1", children: "Node Stats" }),
1161
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-text-secondary mb-1", children: tr(
1162
+ "fluidgrids.executions.executionTable.nodeStats",
1163
+ "Node Stats"
1164
+ ) }),
959
1165
  /* @__PURE__ */ jsxs("div", { className: "flex gap-2 text-sm", children: [
960
1166
  /* @__PURE__ */ jsxs("span", { className: "text-[var(--color-status-success-text)]", children: [
961
1167
  execution.completedNodes ?? 0,
962
- " completed"
1168
+ " ",
1169
+ tr(
1170
+ "fluidgrids.executions.executionTable.completed",
1171
+ "completed"
1172
+ )
963
1173
  ] }),
964
1174
  (execution.failedNodes ?? 0) > 0 && /* @__PURE__ */ jsxs("span", { className: "text-[var(--color-status-error-text)]", children: [
965
1175
  execution.failedNodes,
966
- " failed"
1176
+ " ",
1177
+ tr(
1178
+ "fluidgrids.executions.executionTable.failed",
1179
+ "failed"
1180
+ )
967
1181
  ] }),
968
1182
  (execution.skippedNodes ?? 0) > 0 && /* @__PURE__ */ jsxs("span", { className: "text-tertiary", children: [
969
1183
  execution.skippedNodes,
970
- " skipped"
1184
+ " ",
1185
+ tr(
1186
+ "fluidgrids.executions.executionTable.skipped",
1187
+ "skipped"
1188
+ )
971
1189
  ] })
972
1190
  ] })
973
1191
  ] }),
974
1192
  execution.errorMessage && /* @__PURE__ */ jsxs("div", { className: "col-span-2", children: [
975
- /* @__PURE__ */ jsx("div", { className: "text-xs text-text-secondary mb-1", children: "Error" }),
1193
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-text-secondary mb-1", children: tr(
1194
+ "fluidgrids.executions.executionTable.error",
1195
+ "Error"
1196
+ ) }),
976
1197
  /* @__PURE__ */ jsx("div", { className: "text-sm text-[var(--color-status-error-text)] bg-[var(--color-status-error-bg-subtle)] p-2 rounded", children: execution.errorMessage })
977
1198
  ] }),
978
1199
  /* @__PURE__ */ jsxs("div", { children: [
979
- /* @__PURE__ */ jsx("div", { className: "text-xs text-text-secondary mb-1", children: "Full Run ID" }),
1200
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-text-secondary mb-1", children: tr(
1201
+ "fluidgrids.executions.executionTable.fullRunId",
1202
+ "Full Run ID"
1203
+ ) }),
980
1204
  /* @__PURE__ */ jsx("div", { className: "text-sm font-mono text-text-secondary break-all", children: execution.id })
981
1205
  ] })
982
1206
  ] })
@@ -985,7 +1209,10 @@ function ExecutionTable({
985
1209
  ] });
986
1210
  }) })
987
1211
  ] }) }),
988
- /* @__PURE__ */ jsx("div", { className: "sm:hidden px-4 py-2 bg-background-tertiary border-t border-border-secondary text-xs text-text-secondary text-center", children: "Swipe to see more columns" })
1212
+ /* @__PURE__ */ jsx("div", { className: "sm:hidden px-4 py-2 bg-background-tertiary border-t border-border-secondary text-xs text-text-secondary text-center", children: tr(
1213
+ "fluidgrids.executions.executionTable.swipeHint",
1214
+ "Swipe to see more columns"
1215
+ ) })
989
1216
  ] });
990
1217
  }
991
1218
  function formatDuration(ms) {
@@ -1031,6 +1258,7 @@ function ExecutionCards({
1031
1258
  onCardClick,
1032
1259
  onAction
1033
1260
  }) {
1261
+ const tr = useTr();
1034
1262
  if (loading) {
1035
1263
  return /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4", children: Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsxs(
1036
1264
  "div",
@@ -1062,8 +1290,14 @@ function ExecutionCards({
1062
1290
  className: "mb-3 opacity-40"
1063
1291
  }
1064
1292
  ),
1065
- /* @__PURE__ */ jsx("p", { className: "text-lg font-medium", children: "No executions found" }),
1066
- /* @__PURE__ */ jsx("p", { className: "text-sm mt-1", children: "Run a workflow to see results here" })
1293
+ /* @__PURE__ */ jsx("p", { className: "text-lg font-medium", children: tr(
1294
+ "fluidgrids.executions.executionCards.emptyTitle",
1295
+ "No executions found"
1296
+ ) }),
1297
+ /* @__PURE__ */ jsx("p", { className: "text-sm mt-1", children: tr(
1298
+ "fluidgrids.executions.executionCards.emptyDescription",
1299
+ "Run a workflow to see results here"
1300
+ ) })
1067
1301
  ] });
1068
1302
  }
1069
1303
  return /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4", children: executions.map((execution) => {
@@ -1089,7 +1323,10 @@ function ExecutionCards({
1089
1323
  ] }),
1090
1324
  /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
1091
1325
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-xs text-text-tertiary mb-1", children: [
1092
- /* @__PURE__ */ jsx("span", { children: "Progress" }),
1326
+ /* @__PURE__ */ jsx("span", { children: tr(
1327
+ "fluidgrids.executions.executionCards.progressLabel",
1328
+ "Progress"
1329
+ ) }),
1093
1330
  /* @__PURE__ */ jsxs("span", { children: [
1094
1331
  Math.round(execution.progress),
1095
1332
  "%"
@@ -1161,7 +1398,11 @@ function ExecutionCards({
1161
1398
  className: "flex items-center gap-1 text-xs px-2 py-1 rounded bg-background-tertiary hover:bg-yellow-50 dark:hover:bg-yellow-900/20 text-text-secondary hover:text-yellow-600 transition-colors",
1162
1399
  children: [
1163
1400
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:pause", width: 12 }),
1164
- " Pause"
1401
+ " ",
1402
+ tr(
1403
+ "fluidgrids.executions.executionCards.pauseButton",
1404
+ "Pause"
1405
+ )
1165
1406
  ]
1166
1407
  }
1167
1408
  ),
@@ -1176,7 +1417,11 @@ function ExecutionCards({
1176
1417
  className: "flex items-center gap-1 text-xs px-2 py-1 rounded bg-background-tertiary hover:bg-red-50 dark:hover:bg-red-900/20 text-text-secondary hover:text-red-600 transition-colors",
1177
1418
  children: [
1178
1419
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:stop", width: 12 }),
1179
- " Cancel"
1420
+ " ",
1421
+ tr(
1422
+ "fluidgrids.executions.executionCards.cancelButton",
1423
+ "Cancel"
1424
+ )
1180
1425
  ]
1181
1426
  }
1182
1427
  )
@@ -1246,6 +1491,7 @@ function ExecutionTimeline({
1246
1491
  onItemClick,
1247
1492
  onAction
1248
1493
  }) {
1494
+ const tr = useTr();
1249
1495
  if (loading) {
1250
1496
  return /* @__PURE__ */ jsx("div", { className: "space-y-6 pl-8", children: Array.from({ length: 4 }).map((_, i) => /* @__PURE__ */ jsxs("div", { className: "flex gap-4 animate-pulse", children: [
1251
1497
  /* @__PURE__ */ jsx("div", { className: "w-3 h-3 rounded-full bg-background-tertiary mt-1.5 shrink-0" }),
@@ -1259,8 +1505,14 @@ function ExecutionTimeline({
1259
1505
  if (executions.length === 0) {
1260
1506
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-16 text-text-secondary", children: [
1261
1507
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:timeline", width: 48, className: "mb-3 opacity-40" }),
1262
- /* @__PURE__ */ jsx("p", { className: "text-lg font-medium", children: "No executions found" }),
1263
- /* @__PURE__ */ jsx("p", { className: "text-sm mt-1", children: "Run a workflow to see the timeline" })
1508
+ /* @__PURE__ */ jsx("p", { className: "text-lg font-medium", children: tr(
1509
+ "fluidgrids.executions.executionTimeline.emptyTitle",
1510
+ "No executions found"
1511
+ ) }),
1512
+ /* @__PURE__ */ jsx("p", { className: "text-sm mt-1", children: tr(
1513
+ "fluidgrids.executions.executionTimeline.emptyDescription",
1514
+ "Run a workflow to see the timeline"
1515
+ ) })
1264
1516
  ] });
1265
1517
  }
1266
1518
  const grouped = groupByDate(executions);
@@ -1278,7 +1530,11 @@ function ExecutionTimeline({
1278
1530
  /* @__PURE__ */ jsx("div", { className: "flex-1 h-px bg-border-secondary" }),
1279
1531
  /* @__PURE__ */ jsxs("span", { className: "text-xs text-text-tertiary", children: [
1280
1532
  dateExecutions.length,
1281
- " runs"
1533
+ " ",
1534
+ tr(
1535
+ "fluidgrids.executions.executionTimeline.runsCountSuffix",
1536
+ "runs"
1537
+ )
1282
1538
  ] })
1283
1539
  ] }),
1284
1540
  /* @__PURE__ */ jsxs("div", { className: "relative ml-4", children: [
@@ -1332,7 +1588,11 @@ function ExecutionTimeline({
1332
1588
  execution.completedNodes ?? 0,
1333
1589
  "/",
1334
1590
  execution.totalNodes,
1335
- " nodes"
1591
+ " ",
1592
+ tr(
1593
+ "fluidgrids.executions.executionTimeline.nodesCountSuffix",
1594
+ "nodes"
1595
+ )
1336
1596
  ] })
1337
1597
  ] }),
1338
1598
  execution.errorMessage && /* @__PURE__ */ jsx("p", { className: "mt-1.5 text-xs text-red-500 dark:text-red-400 truncate max-w-sm", children: execution.errorMessage })
@@ -1354,7 +1614,10 @@ function ExecutionTimeline({
1354
1614
  onAction("cancel", execution);
1355
1615
  },
1356
1616
  className: "opacity-0 group-hover:opacity-100 p-1 rounded hover:bg-red-50 dark:hover:bg-red-900/20 text-text-tertiary hover:text-red-600 transition-all",
1357
- title: "Cancel execution",
1617
+ title: tr(
1618
+ "fluidgrids.executions.executionTimeline.cancelTooltip",
1619
+ "Cancel execution"
1620
+ ),
1358
1621
  children: /* @__PURE__ */ jsx(Icon, { icon: "mdi:stop", width: 14 })
1359
1622
  }
1360
1623
  )
@@ -1402,6 +1665,7 @@ function NodeTimeline({
1402
1665
  onRetryNode,
1403
1666
  onViewChildRun
1404
1667
  }) {
1668
+ const tr = useTr();
1405
1669
  const [expandedNodes, setExpandedNodes] = useState(/* @__PURE__ */ new Set());
1406
1670
  const [selectedTab, setSelectedTab] = useState("output");
1407
1671
  const toggleNode = (nodeId) => {
@@ -1431,11 +1695,15 @@ function NodeTimeline({
1431
1695
  });
1432
1696
  };
1433
1697
  const formatJsonData = (data) => {
1434
- if (data === null || data === void 0) return "No data";
1698
+ if (data === null || data === void 0)
1699
+ return tr("fluidgrids.executions.nodeTimeline.noData", "No data");
1435
1700
  try {
1436
1701
  return JSON.stringify(data, null, 2);
1437
1702
  } catch {
1438
- return "Unable to display data";
1703
+ return tr(
1704
+ "fluidgrids.executions.nodeTimeline.unableToDisplayData",
1705
+ "Unable to display data"
1706
+ );
1439
1707
  }
1440
1708
  };
1441
1709
  const hasMetadata = (metadata) => {
@@ -1455,7 +1723,10 @@ function NodeTimeline({
1455
1723
  if (nodeStates.length === 0) {
1456
1724
  return /* @__PURE__ */ jsxs("div", { className: "text-center py-8 text-text-secondary", children: [
1457
1725
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:timeline-outline", className: "mx-auto mb-2", width: 32 }),
1458
- /* @__PURE__ */ jsx("p", { children: "No node executions yet" })
1726
+ /* @__PURE__ */ jsx("p", { children: tr(
1727
+ "fluidgrids.executions.nodeTimeline.emptyState",
1728
+ "No node executions yet"
1729
+ ) })
1459
1730
  ] });
1460
1731
  }
1461
1732
  return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
@@ -1530,11 +1801,21 @@ function NodeTimeline({
1530
1801
  ] }),
1531
1802
  hasChildRun && /* @__PURE__ */ jsxs("span", { className: "px-2 py-0.5 text-xs bg-indigo-100 text-indigo-700 rounded flex items-center gap-1", children: [
1532
1803
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:sitemap", width: 12 }),
1533
- "Sub-workflow"
1804
+ tr(
1805
+ "fluidgrids.executions.nodeTimeline.subWorkflowBadge",
1806
+ "Sub-workflow"
1807
+ )
1534
1808
  ] }),
1535
- isWaitingSubworkflow && /* @__PURE__ */ jsx("span", { className: "px-2 py-0.5 text-xs bg-purple-100 text-purple-700 rounded animate-pulse", children: "Waiting..." }),
1809
+ isWaitingSubworkflow && /* @__PURE__ */ jsx("span", { className: "px-2 py-0.5 text-xs bg-purple-100 text-purple-700 rounded animate-pulse", children: tr(
1810
+ "fluidgrids.executions.nodeTimeline.waitingBadge",
1811
+ "Waiting..."
1812
+ ) }),
1536
1813
  node.attemptCount > 1 && /* @__PURE__ */ jsxs("span", { className: "px-2 py-0.5 text-xs bg-[var(--color-status-warning-bg-subtle)] text-[var(--color-status-warning-text)] rounded", children: [
1537
- "Attempt ",
1814
+ tr(
1815
+ "fluidgrids.executions.nodeTimeline.attemptLabel",
1816
+ "Attempt"
1817
+ ),
1818
+ " ",
1538
1819
  node.attemptCount
1539
1820
  ] }),
1540
1821
  /* @__PURE__ */ jsx(
@@ -1556,7 +1837,10 @@ function NodeTimeline({
1556
1837
  {
1557
1838
  onClick: () => setSelectedTab("output"),
1558
1839
  className: `px-3 py-1.5 text-sm rounded ${selectedTab === "output" ? "bg-action-primary-bg text-white" : "bg-background-tertiary text-text-secondary"}`,
1559
- children: "Output"
1840
+ children: tr(
1841
+ "fluidgrids.executions.nodeTimeline.outputTab",
1842
+ "Output"
1843
+ )
1560
1844
  }
1561
1845
  ),
1562
1846
  /* @__PURE__ */ jsx(
@@ -1564,7 +1848,10 @@ function NodeTimeline({
1564
1848
  {
1565
1849
  onClick: () => setSelectedTab("input"),
1566
1850
  className: `px-3 py-1.5 text-sm rounded ${selectedTab === "input" ? "bg-action-primary-bg text-white" : "bg-background-tertiary text-text-secondary"}`,
1567
- children: "Input"
1851
+ children: tr(
1852
+ "fluidgrids.executions.nodeTimeline.inputTab",
1853
+ "Input"
1854
+ )
1568
1855
  }
1569
1856
  )
1570
1857
  ] }),
@@ -1572,7 +1859,10 @@ function NodeTimeline({
1572
1859
  node.error && /* @__PURE__ */ jsxs("div", { className: "mt-3 p-3 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded", children: [
1573
1860
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-[var(--color-status-error-text)] mb-1", children: [
1574
1861
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:alert-circle", width: 16 }),
1575
- /* @__PURE__ */ jsx("span", { className: "font-medium text-sm", children: "Error" }),
1862
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-sm", children: tr(
1863
+ "fluidgrids.executions.nodeTimeline.errorLabel",
1864
+ "Error"
1865
+ ) }),
1576
1866
  node.errorType && /* @__PURE__ */ jsx("span", { className: "text-xs bg-[var(--color-status-error-bg)] px-2 py-0.5 rounded", children: node.errorType })
1577
1867
  ] }),
1578
1868
  /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--color-status-error-text)]", children: node.error })
@@ -1585,7 +1875,10 @@ function NodeTimeline({
1585
1875
  className: "px-3 py-1.5 text-sm bg-indigo-600 text-white rounded hover:bg-indigo-700 flex items-center gap-1.5",
1586
1876
  children: [
1587
1877
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:sitemap", width: 16 }),
1588
- "View Sub-Workflow Run"
1878
+ tr(
1879
+ "fluidgrids.executions.nodeTimeline.viewSubWorkflowRun",
1880
+ "View Sub-Workflow Run"
1881
+ )
1589
1882
  ]
1590
1883
  }
1591
1884
  ),
@@ -1596,13 +1889,19 @@ function NodeTimeline({
1596
1889
  className: "px-3 py-1.5 text-sm bg-action-primary-bg text-white rounded hover:bg-action-primary-bg/90 flex items-center gap-1.5",
1597
1890
  children: [
1598
1891
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", width: 16 }),
1599
- "Retry Node"
1892
+ tr(
1893
+ "fluidgrids.executions.nodeTimeline.retryNodeButton",
1894
+ "Retry Node"
1895
+ )
1600
1896
  ]
1601
1897
  }
1602
1898
  )
1603
1899
  ] }),
1604
1900
  hasMetadata(node.metadata) && /* @__PURE__ */ jsxs("details", { className: "mt-3", children: [
1605
- /* @__PURE__ */ jsx("summary", { className: "text-xs text-text-secondary cursor-pointer hover:text-text-primary", children: "Metadata" }),
1901
+ /* @__PURE__ */ jsx("summary", { className: "text-xs text-text-secondary cursor-pointer hover:text-text-primary", children: tr(
1902
+ "fluidgrids.executions.nodeTimeline.metadataSummary",
1903
+ "Metadata"
1904
+ ) }),
1606
1905
  /* @__PURE__ */ jsx("pre", { className: "mt-2 text-xs text-text-secondary bg-background-tertiary p-2 rounded overflow-auto max-h-32", children: formatJsonData(node.metadata) })
1607
1906
  ] })
1608
1907
  ] })
@@ -1675,6 +1974,7 @@ function RunLogViewer({
1675
1974
  onMinLevelChange,
1676
1975
  onLoadMore
1677
1976
  }) {
1977
+ const tr = useTr();
1678
1978
  const [search, setSearch] = useState("");
1679
1979
  const [showTimestamps, setShowTimestamps] = useState(true);
1680
1980
  const [wrap, setWrap] = useState(true);
@@ -1799,8 +2099,14 @@ function RunLogViewer({
1799
2099
  type: "search",
1800
2100
  value: search,
1801
2101
  onChange: (e) => setSearch(e.target.value),
1802
- placeholder: "Search log",
1803
- "aria-label": "Search log",
2102
+ placeholder: tr(
2103
+ "fluidgrids.executions.runLogViewer.searchPlaceholder",
2104
+ "Search log"
2105
+ ),
2106
+ "aria-label": tr(
2107
+ "fluidgrids.executions.runLogViewer.searchAriaLabel",
2108
+ "Search log"
2109
+ ),
1804
2110
  className: "w-full pl-8 pr-3 py-1.5 text-sm rounded border border-border-secondary bg-background-primary text-text-primary"
1805
2111
  }
1806
2112
  )
@@ -1812,13 +2118,23 @@ function RunLogViewer({
1812
2118
  onChange: (e) => onMinLevelChange(
1813
2119
  e.target.value === "ALL" ? null : e.target.value
1814
2120
  ),
1815
- "aria-label": "Minimum log level",
2121
+ "aria-label": tr(
2122
+ "fluidgrids.executions.runLogViewer.minLevelAriaLabel",
2123
+ "Minimum log level"
2124
+ ),
1816
2125
  className: "px-2 py-1.5 text-sm rounded border border-border-secondary bg-background-primary text-text-primary",
1817
2126
  children: [
1818
- /* @__PURE__ */ jsx("option", { value: "ALL", children: "All levels" }),
2127
+ /* @__PURE__ */ jsx("option", { value: "ALL", children: tr(
2128
+ "fluidgrids.executions.runLogViewer.allLevelsOption",
2129
+ "All levels"
2130
+ ) }),
1819
2131
  LEVEL_ORDER.map((level) => /* @__PURE__ */ jsxs("option", { value: level, children: [
1820
2132
  level,
1821
- " and above"
2133
+ " ",
2134
+ tr(
2135
+ "fluidgrids.executions.runLogViewer.andAboveSuffix",
2136
+ "and above"
2137
+ )
1822
2138
  ] }, level))
1823
2139
  ]
1824
2140
  }
@@ -1832,7 +2148,10 @@ function RunLogViewer({
1832
2148
  "aria-pressed": showTimestamps,
1833
2149
  children: [
1834
2150
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:clock-outline", className: "mr-1", width: 16 }),
1835
- "Timestamps"
2151
+ tr(
2152
+ "fluidgrids.executions.runLogViewer.timestampsButton",
2153
+ "Timestamps"
2154
+ )
1836
2155
  ]
1837
2156
  }
1838
2157
  ),
@@ -1845,7 +2164,7 @@ function RunLogViewer({
1845
2164
  "aria-pressed": wrap,
1846
2165
  children: [
1847
2166
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:wrap", className: "mr-1", width: 16 }),
1848
- "Wrap"
2167
+ tr("fluidgrids.executions.runLogViewer.wrapButton", "Wrap")
1849
2168
  ]
1850
2169
  }
1851
2170
  ),
@@ -1865,7 +2184,10 @@ function RunLogViewer({
1865
2184
  width: 16
1866
2185
  }
1867
2186
  ),
1868
- follow ? "Following" : "Follow"
2187
+ follow ? tr(
2188
+ "fluidgrids.executions.runLogViewer.followingButton",
2189
+ "Following"
2190
+ ) : tr("fluidgrids.executions.runLogViewer.followButton", "Follow")
1869
2191
  ]
1870
2192
  }
1871
2193
  ),
@@ -1878,7 +2200,7 @@ function RunLogViewer({
1878
2200
  disabled: lines.length === 0,
1879
2201
  children: [
1880
2202
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:download", className: "mr-1", width: 16 }),
1881
- "Raw"
2203
+ tr("fluidgrids.executions.runLogViewer.rawButton", "Raw")
1882
2204
  ]
1883
2205
  }
1884
2206
  )
@@ -1886,9 +2208,9 @@ function RunLogViewer({
1886
2208
  /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3 text-xs text-text-secondary", children: [
1887
2209
  /* @__PURE__ */ jsxs("span", { children: [
1888
2210
  visible.length,
1889
- " line",
1890
- visible.length === 1 ? "" : "s",
1891
- search.trim() && ` matching \u201C${search}\u201D`
2211
+ " ",
2212
+ visible.length === 1 ? tr("fluidgrids.executions.runLogViewer.lineCountSingular", "line") : tr("fluidgrids.executions.runLogViewer.lineCountPlural", "lines"),
2213
+ search.trim() && ` ${tr("fluidgrids.executions.runLogViewer.matchingLabel", "matching")} \u201C${search}\u201D`
1892
2214
  ] }),
1893
2215
  active && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
1894
2216
  /* @__PURE__ */ jsx(
@@ -1897,18 +2219,30 @@ function RunLogViewer({
1897
2219
  className: `inline-block w-2 h-2 rounded-full ${streaming ? "bg-[var(--color-status-success-bg)]" : "bg-[var(--color-status-info-bg)]"}`
1898
2220
  }
1899
2221
  ),
1900
- streaming ? "Streaming" : "Polling"
2222
+ streaming ? tr(
2223
+ "fluidgrids.executions.runLogViewer.streamingIndicator",
2224
+ "Streaming"
2225
+ ) : tr(
2226
+ "fluidgrids.executions.runLogViewer.pollingIndicator",
2227
+ "Polling"
2228
+ )
1901
2229
  ] }),
1902
2230
  hasMore && /* @__PURE__ */ jsx(
1903
2231
  "button",
1904
2232
  {
1905
2233
  onClick: onLoadMore,
1906
2234
  className: "text-action-primary-text hover:underline",
1907
- children: "Load more lines"
2235
+ children: tr(
2236
+ "fluidgrids.executions.runLogViewer.loadMoreLines",
2237
+ "Load more lines"
2238
+ )
1908
2239
  }
1909
2240
  )
1910
2241
  ] }),
1911
- limitReached && /* @__PURE__ */ jsx("div", { className: "px-3 py-2 rounded border border-[var(--color-status-warning-border)] bg-[var(--color-status-warning-bg-subtle)] text-[var(--color-status-warning-text)] text-sm", children: "This run hit its log limit \u2014 later lines were dropped. Reduce logging inside loops, or split the workflow into sub-workflows." }),
2242
+ limitReached && /* @__PURE__ */ jsx("div", { className: "px-3 py-2 rounded border border-[var(--color-status-warning-border)] bg-[var(--color-status-warning-bg-subtle)] text-[var(--color-status-warning-text)] text-sm", children: tr(
2243
+ "fluidgrids.executions.runLogViewer.limitReachedNotice",
2244
+ "This run hit its log limit \u2014 later lines were dropped. Reduce logging inside loops, or split the workflow into sub-workflows."
2245
+ ) }),
1912
2246
  /* @__PURE__ */ jsxs(
1913
2247
  "div",
1914
2248
  {
@@ -1925,7 +2259,16 @@ function RunLogViewer({
1925
2259
  width: 32
1926
2260
  }
1927
2261
  ),
1928
- /* @__PURE__ */ jsx("p", { children: search.trim() ? "No lines match your search" : active ? "Waiting for the first log line\u2026" : "This run produced no log output" })
2262
+ /* @__PURE__ */ jsx("p", { children: search.trim() ? tr(
2263
+ "fluidgrids.executions.runLogViewer.noSearchMatches",
2264
+ "No lines match your search"
2265
+ ) : active ? tr(
2266
+ "fluidgrids.executions.runLogViewer.waitingForFirstLine",
2267
+ "Waiting for the first log line\u2026"
2268
+ ) : tr(
2269
+ "fluidgrids.executions.runLogViewer.noLogOutput",
2270
+ "This run produced no log output"
2271
+ ) })
1929
2272
  ] }) : groups.map((group) => {
1930
2273
  const groupCollapsed = isCollapsed(group);
1931
2274
  return /* @__PURE__ */ jsxs(
@@ -1985,7 +2328,7 @@ function RunLogViewer({
1985
2328
  "span",
1986
2329
  {
1987
2330
  className: "text-text-secondary flex-shrink-0",
1988
- title: `Attempt ${line.attempt}`,
2331
+ title: `${tr("fluidgrids.executions.runLogViewer.attemptTooltip", "Attempt")} ${line.attempt}`,
1989
2332
  children: [
1990
2333
  "#",
1991
2334
  line.attempt
@@ -2000,7 +2343,10 @@ function RunLogViewer({
2000
2343
  line.message,
2001
2344
  line.truncated && /* @__PURE__ */ jsxs("span", { className: "text-text-secondary", children: [
2002
2345
  " ",
2003
- "(truncated)"
2346
+ tr(
2347
+ "fluidgrids.executions.runLogViewer.truncatedSuffix",
2348
+ "(truncated)"
2349
+ )
2004
2350
  ] })
2005
2351
  ]
2006
2352
  }
@@ -2009,8 +2355,14 @@ function RunLogViewer({
2009
2355
  "button",
2010
2356
  {
2011
2357
  onClick: () => copyLineLink(line.id),
2012
- title: "Copy link to this line",
2013
- "aria-label": "Copy link to this line",
2358
+ title: tr(
2359
+ "fluidgrids.executions.runLogViewer.copyLineLinkTooltip",
2360
+ "Copy link to this line"
2361
+ ),
2362
+ "aria-label": tr(
2363
+ "fluidgrids.executions.runLogViewer.copyLineLinkAriaLabel",
2364
+ "Copy link to this line"
2365
+ ),
2014
2366
  className: "opacity-0 group-hover:opacity-100 text-text-secondary hover:text-text-primary flex-shrink-0",
2015
2367
  children: /* @__PURE__ */ jsx(Icon, { icon: "mdi:link-variant", width: 14 })
2016
2368
  }
@@ -2034,6 +2386,7 @@ function Pagination({
2034
2386
  totalItems,
2035
2387
  showPageSize = true
2036
2388
  }) {
2389
+ const tr = useTr();
2037
2390
  const { pagination, setPage, setPageSize } = useExecutionsStore();
2038
2391
  const { page, pageSize, total } = pagination;
2039
2392
  const totalPages = Math.ceil((totalItems ?? total) / pageSize);
@@ -2074,21 +2427,23 @@ function Pagination({
2074
2427
  }
2075
2428
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4 py-4", children: [
2076
2429
  /* @__PURE__ */ jsxs("div", { className: "text-sm text-text-secondary", children: [
2077
- "Showing",
2430
+ tr("fluidgrids.executions.pagination.showingLabel", "Showing"),
2078
2431
  " ",
2079
2432
  /* @__PURE__ */ jsx("span", { className: "font-medium text-text-primary", children: startItem }),
2080
- " to",
2433
+ " ",
2434
+ tr("fluidgrids.executions.pagination.toLabel", "to"),
2081
2435
  " ",
2082
2436
  /* @__PURE__ */ jsx("span", { className: "font-medium text-text-primary", children: endItem }),
2083
- " of",
2437
+ " ",
2438
+ tr("fluidgrids.executions.pagination.ofLabel", "of"),
2084
2439
  " ",
2085
2440
  /* @__PURE__ */ jsx("span", { className: "font-medium text-text-primary", children: totalItems ?? total }),
2086
2441
  " ",
2087
- "results"
2442
+ tr("fluidgrids.executions.pagination.resultsLabel", "results")
2088
2443
  ] }),
2089
2444
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
2090
2445
  showPageSize && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
2091
- /* @__PURE__ */ jsx("label", { className: "text-sm text-text-secondary", children: "Show" }),
2446
+ /* @__PURE__ */ jsx("label", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.pagination.pageSizeLabel", "Show") }),
2092
2447
  /* @__PURE__ */ jsx(
2093
2448
  "select",
2094
2449
  {
@@ -2459,5 +2814,5 @@ function useAutoRefresh(refetchFn, enabled = true, interval = 5e3) {
2459
2814
  }
2460
2815
 
2461
2816
  export { ExecutionCards, ExecutionFilters, ExecutionStats, ExecutionStatusBadge, ExecutionTable, ExecutionTimeline, NodeTimeline, Pagination, RunLogViewer, buildNodeDisplayMap, formatRunVersion, useAutoRefresh, useExecution, useExecutionActions, useExecutionStats, useExecutionsStore, useExecutionsWithStore };
2462
- //# sourceMappingURL=chunk-WAVGHDYH.js.map
2463
- //# sourceMappingURL=chunk-WAVGHDYH.js.map
2817
+ //# sourceMappingURL=chunk-6PNRM3KQ.js.map
2818
+ //# sourceMappingURL=chunk-6PNRM3KQ.js.map