@burdenoff/fluidgrids-fe-sdk 2026.1022.4 → 2026.1022.6

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 (30) hide show
  1. package/dist/{ExecutionDetailPage-GXP7V43B.js → ExecutionDetailPage-JQHHPJZI.js} +3 -2
  2. package/dist/{ExecutionsListPage-7AZRFJJT.js → ExecutionsListPage-3NC3WARO.js} +3 -2
  3. package/dist/{WorkflowBuilder-36X3QZTC.js → WorkflowBuilder-HEKTGFM7.js} +3 -3
  4. package/dist/{WorkflowsList-O3DFQM6S.js → WorkflowsList-RWJKR5QF.js} +4 -2
  5. package/dist/{chunk-XQVQKEZK.js → chunk-2M43OY55.js} +162 -133
  6. package/dist/{chunk-T3UCFY7J.js → chunk-36RTRUCM.js} +2 -0
  7. package/dist/{chunk-PVDKSM6Q.js → chunk-BQAD4IRV.js} +1 -1
  8. package/dist/{chunk-HIXQIM22.js → chunk-CV56O5R4.js} +2 -471
  9. package/dist/{chunk-LHOW7QKK.js → chunk-IYWT6OV3.js} +1 -1
  10. package/dist/{chunk-TVTOVRGV.js → chunk-K6LSRFMX.js} +65 -35
  11. package/dist/{chunk-3FI4DCIY.js → chunk-MANNJ7P3.js} +1 -1
  12. package/dist/{chunk-6CVZQJKW.js → chunk-OHUNYBJ6.js} +133 -105
  13. package/dist/{chunk-5QUAOGY7.js → chunk-QMZGUJI3.js} +3 -2
  14. package/dist/{chunk-QP62LB3V.js → chunk-QN4HHTQP.js} +181 -8
  15. package/dist/{chunk-M7FOQBCR.js → chunk-RQ6TDVVL.js} +48 -5
  16. package/dist/chunk-VGIH3SOT.js +476 -0
  17. package/dist/{chunk-P3R3RFAC.js → chunk-WFZD44CK.js} +2 -1
  18. package/dist/chunk-YGBDZ424.js +64 -0
  19. package/dist/executions.js +4 -3
  20. package/dist/history.js +1 -1
  21. package/dist/index.d.ts +99 -1
  22. package/dist/index.js +430 -341
  23. package/dist/nodes.js +1 -1
  24. package/dist/observability.js +1 -1
  25. package/dist/settings.js +1 -1
  26. package/dist/templates.js +2 -2
  27. package/dist/workflow-builder.js +4 -4
  28. package/dist/workflows-list.js +4 -2
  29. package/package.json +1 -1
  30. package/dist/chunk-6N27YGMB.js +0 -12
@@ -388,121 +388,149 @@ function NodesPage() {
388
388
  return counts;
389
389
  }, [categorizedNodes]);
390
390
  return /* @__PURE__ */ jsxs("div", { className: "p-4 sm:p-6 bg-background-primary min-h-screen", children: [
391
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6", children: [
392
- /* @__PURE__ */ jsxs("div", { children: [
393
- /* @__PURE__ */ jsx("h1", { className: "text-2xl sm:text-3xl font-bold text-text-primary", children: tr("fluidgrids.nodes.nodesPage.title", "Node Catalog") }),
394
- /* @__PURE__ */ jsx("p", { className: "text-text-secondary mt-1", children: tr(
395
- "fluidgrids.nodes.nodesPage.subtitle",
396
- "Browse and manage available workflow nodes"
397
- ) })
398
- ] }),
399
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
400
- /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => refetch(), children: [
401
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-2", width: 16 }),
402
- tr("fluidgrids.nodes.nodesPage.refreshButton", "Refresh")
403
- ] }),
404
- /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => navigate("../list"), children: [
405
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:arrow-left", className: "mr-2", width: 16 }),
406
- tr(
407
- "fluidgrids.nodes.nodesPage.backToWorkflowsButton",
408
- "Back to Workflows"
409
- )
410
- ] })
411
- ] })
412
- ] }),
413
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-3 mb-6", children: [
414
- /* @__PURE__ */ jsxs("div", { className: "p-3 rounded-lg bg-background-secondary border border-border-secondary", children: [
415
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
391
+ /* @__PURE__ */ jsxs(
392
+ "div",
393
+ {
394
+ className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6",
395
+ "data-tour": "fluidgrids-nodes-header",
396
+ children: [
397
+ /* @__PURE__ */ jsxs("div", { children: [
398
+ /* @__PURE__ */ jsx("h1", { className: "text-2xl sm:text-3xl font-bold text-text-primary", children: tr("fluidgrids.nodes.nodesPage.title", "Node Catalog") }),
399
+ /* @__PURE__ */ jsx("p", { className: "text-text-secondary mt-1", children: tr(
400
+ "fluidgrids.nodes.nodesPage.subtitle",
401
+ "Browse and manage available workflow nodes"
402
+ ) })
403
+ ] }),
404
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
405
+ /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => refetch(), children: [
406
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-2", width: 16 }),
407
+ tr("fluidgrids.nodes.nodesPage.refreshButton", "Refresh")
408
+ ] }),
409
+ /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => navigate("../list"), children: [
410
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:arrow-left", className: "mr-2", width: 16 }),
411
+ tr(
412
+ "fluidgrids.nodes.nodesPage.backToWorkflowsButton",
413
+ "Back to Workflows"
414
+ )
415
+ ] })
416
+ ] })
417
+ ]
418
+ }
419
+ ),
420
+ /* @__PURE__ */ jsxs(
421
+ "div",
422
+ {
423
+ className: "grid grid-cols-3 gap-3 mb-6",
424
+ "data-tour": "fluidgrids-nodes-stats",
425
+ children: [
426
+ /* @__PURE__ */ jsxs("div", { className: "p-3 rounded-lg bg-background-secondary border border-border-secondary", children: [
427
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
428
+ /* @__PURE__ */ jsx(
429
+ Icon,
430
+ {
431
+ icon: "mdi:puzzle",
432
+ width: 18,
433
+ className: "text-text-secondary"
434
+ }
435
+ ),
436
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary", children: tr("fluidgrids.nodes.nodesPage.statTotal", "Total Nodes") })
437
+ ] }),
438
+ /* @__PURE__ */ jsx("p", { className: "text-xl font-bold text-text-primary mt-1", children: loading ? "\u2014" : stats.total })
439
+ ] }),
440
+ /* @__PURE__ */ jsxs("div", { className: "p-3 rounded-lg bg-background-secondary border border-border-secondary", children: [
441
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
442
+ /* @__PURE__ */ jsx(
443
+ Icon,
444
+ {
445
+ icon: "mdi:check-circle",
446
+ width: 18,
447
+ className: "text-status-success-text"
448
+ }
449
+ ),
450
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary", children: tr("fluidgrids.nodes.nodesPage.statActive", "Active") })
451
+ ] }),
452
+ /* @__PURE__ */ jsx("p", { className: "text-xl font-bold text-status-success-text mt-1", children: loading ? "\u2014" : stats.active })
453
+ ] }),
454
+ /* @__PURE__ */ jsxs("div", { className: "p-3 rounded-lg bg-background-secondary border border-border-secondary", children: [
455
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
456
+ /* @__PURE__ */ jsx(
457
+ Icon,
458
+ {
459
+ icon: "mdi:alert",
460
+ width: 18,
461
+ className: "text-status-warning-text"
462
+ }
463
+ ),
464
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary", children: tr("fluidgrids.nodes.nodesPage.statDeprecated", "Deprecated") })
465
+ ] }),
466
+ /* @__PURE__ */ jsx("p", { className: "text-xl font-bold text-status-warning-text mt-1", children: loading ? "\u2014" : stats.deprecated })
467
+ ] })
468
+ ]
469
+ }
470
+ ),
471
+ /* @__PURE__ */ jsxs(
472
+ "div",
473
+ {
474
+ className: "relative max-w-md mb-6",
475
+ "data-tour": "fluidgrids-nodes-search",
476
+ children: [
416
477
  /* @__PURE__ */ jsx(
417
478
  Icon,
418
479
  {
419
- icon: "mdi:puzzle",
480
+ icon: "mdi:magnify",
420
481
  width: 18,
421
- className: "text-text-secondary"
482
+ className: "absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary"
422
483
  }
423
484
  ),
424
- /* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary", children: tr("fluidgrids.nodes.nodesPage.statTotal", "Total Nodes") })
425
- ] }),
426
- /* @__PURE__ */ jsx("p", { className: "text-xl font-bold text-text-primary mt-1", children: loading ? "\u2014" : stats.total })
427
- ] }),
428
- /* @__PURE__ */ jsxs("div", { className: "p-3 rounded-lg bg-background-secondary border border-border-secondary", children: [
429
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
430
485
  /* @__PURE__ */ jsx(
431
- Icon,
486
+ Input,
432
487
  {
433
- icon: "mdi:check-circle",
434
- width: 18,
435
- className: "text-status-success-text"
488
+ placeholder: tr(
489
+ "fluidgrids.nodes.nodesPage.searchPlaceholder",
490
+ "Search nodes by name, type, or keyword..."
491
+ ),
492
+ value: search,
493
+ onChange: (e) => setSearch(e.target.value),
494
+ className: "pl-10 bg-background-secondary border-border-secondary"
436
495
  }
437
- ),
438
- /* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary", children: tr("fluidgrids.nodes.nodesPage.statActive", "Active") })
439
- ] }),
440
- /* @__PURE__ */ jsx("p", { className: "text-xl font-bold text-status-success-text mt-1", children: loading ? "\u2014" : stats.active })
441
- ] }),
442
- /* @__PURE__ */ jsxs("div", { className: "p-3 rounded-lg bg-background-secondary border border-border-secondary", children: [
443
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
444
- /* @__PURE__ */ jsx(
445
- Icon,
496
+ )
497
+ ]
498
+ }
499
+ ),
500
+ /* @__PURE__ */ jsx(
501
+ "div",
502
+ {
503
+ className: "flex flex-wrap gap-2 mb-6",
504
+ "data-tour": "fluidgrids-nodes-categories",
505
+ children: NODE_CATEGORIES.map((cat) => {
506
+ const count = categoryCounts[cat.value] ?? 0;
507
+ const isActive = activeCategory === cat.value;
508
+ return /* @__PURE__ */ jsxs(
509
+ "button",
446
510
  {
447
- icon: "mdi:alert",
448
- width: 18,
449
- className: "text-status-warning-text"
450
- }
451
- ),
452
- /* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary", children: tr("fluidgrids.nodes.nodesPage.statDeprecated", "Deprecated") })
453
- ] }),
454
- /* @__PURE__ */ jsx("p", { className: "text-xl font-bold text-status-warning-text mt-1", children: loading ? "\u2014" : stats.deprecated })
455
- ] })
456
- ] }),
457
- /* @__PURE__ */ jsxs("div", { className: "relative max-w-md mb-6", children: [
458
- /* @__PURE__ */ jsx(
459
- Icon,
460
- {
461
- icon: "mdi:magnify",
462
- width: 18,
463
- className: "absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary"
464
- }
465
- ),
466
- /* @__PURE__ */ jsx(
467
- Input,
468
- {
469
- placeholder: tr(
470
- "fluidgrids.nodes.nodesPage.searchPlaceholder",
471
- "Search nodes by name, type, or keyword..."
472
- ),
473
- value: search,
474
- onChange: (e) => setSearch(e.target.value),
475
- className: "pl-10 bg-background-secondary border-border-secondary"
476
- }
477
- )
478
- ] }),
479
- /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2 mb-6", children: NODE_CATEGORIES.map((cat) => {
480
- const count = categoryCounts[cat.value] ?? 0;
481
- const isActive = activeCategory === cat.value;
482
- return /* @__PURE__ */ jsxs(
483
- "button",
484
- {
485
- onClick: () => setActiveCategory(cat.value),
486
- className: `inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-colors ${isActive ? "bg-background-tertiary text-text-primary border border-border-primary" : "bg-background-secondary text-text-secondary border border-border-secondary hover:text-text-primary hover:border-border-primary"}`,
487
- children: [
488
- /* @__PURE__ */ jsx(Icon, { icon: cat.icon, width: 16 }),
489
- cat.label,
490
- /* @__PURE__ */ jsxs(
491
- "span",
492
- {
493
- className: `ml-0.5 text-xs ${isActive ? "text-text-primary" : "text-text-secondary"}`,
494
- children: [
495
- "(",
496
- count,
497
- ")"
498
- ]
499
- }
500
- )
501
- ]
502
- },
503
- cat.value
504
- );
505
- }) }),
511
+ onClick: () => setActiveCategory(cat.value),
512
+ className: `inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-colors ${isActive ? "bg-background-tertiary text-text-primary border border-border-primary" : "bg-background-secondary text-text-secondary border border-border-secondary hover:text-text-primary hover:border-border-primary"}`,
513
+ children: [
514
+ /* @__PURE__ */ jsx(Icon, { icon: cat.icon, width: 16 }),
515
+ cat.label,
516
+ /* @__PURE__ */ jsxs(
517
+ "span",
518
+ {
519
+ className: `ml-0.5 text-xs ${isActive ? "text-text-primary" : "text-text-secondary"}`,
520
+ children: [
521
+ "(",
522
+ count,
523
+ ")"
524
+ ]
525
+ }
526
+ )
527
+ ]
528
+ },
529
+ cat.value
530
+ );
531
+ })
532
+ }
533
+ ),
506
534
  error && /* @__PURE__ */ jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsx(ErrorState, { message: error.message, onRetry: refetch }) }),
507
535
  loading ? /* @__PURE__ */ jsx(NodesSkeleton, {}) : filtered.length === 0 ? /* @__PURE__ */ jsx(
508
536
  EmptyState,
@@ -1,4 +1,5 @@
1
- import { useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination } from './chunk-HIXQIM22.js';
1
+ import { ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination } from './chunk-CV56O5R4.js';
2
+ import { useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh } from './chunk-VGIH3SOT.js';
2
3
  import { useWorkflowDefinitions } from './chunk-HP3A6BPK.js';
3
4
  import { useExecutionsStore } from './chunk-UZG3ZIQM.js';
4
5
  import { useTr } from './chunk-UULVIT25.js';
@@ -184,7 +185,7 @@ function ExecutionsListPage() {
184
185
  "Monitor and manage your workflow runs"
185
186
  ) })
186
187
  ] }),
187
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
188
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
188
189
  /* @__PURE__ */ jsxs("div", { className: "flex items-center bg-background-secondary rounded-lg border border-border-secondary p-1", children: [
189
190
  /* @__PURE__ */ jsx(
190
191
  "button",
@@ -1,6 +1,7 @@
1
- import { NEW_WORKFLOW_NAV } from './chunk-6N27YGMB.js';
1
+ import { NEW_WORKFLOW_NAV, firstWorkflowProgress, builderPathFor, GUIDED_FIRST_WORKFLOW_NAV } from './chunk-YGBDZ424.js';
2
+ import { useExecutions } from './chunk-VGIH3SOT.js';
2
3
  import { QuotaExhaustedDialog } from './chunk-SYVLFHWV.js';
3
- import { SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, SdkPermissionGate } from './chunk-ONVGFVNH.js';
4
+ import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, SdkPermissionButton, SdkPermissionGate } from './chunk-ONVGFVNH.js';
4
5
  import { useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-HP3A6BPK.js';
5
6
  import { workflowsListControls } from './chunk-D3UWK7GY.js';
6
7
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
@@ -11,7 +12,7 @@ import { useState, useMemo } from 'react';
11
12
  import { useNavigate } from 'react-router';
12
13
  import { v4 } from 'uuid';
13
14
  import { Icon } from '@iconify/react';
14
- import { Button, Badge, Input, IllustratedEmptyState, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Label, Textarea, DialogFooter, Skeleton, TooltipProvider, Card, Tooltip, TooltipTrigger, TooltipContent, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '@burdenoff/fe-libs/ui';
15
+ import { NextSteps, Button, Badge, Input, IllustratedEmptyState, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Label, Textarea, DialogFooter, Skeleton, TooltipProvider, Card, Tooltip, TooltipTrigger, TooltipContent, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '@burdenoff/fe-libs/ui';
15
16
  import { cn } from '@burdenoff/fe-libs/utils';
16
17
  import { TagBadge } from '@burdenoff/fe-libs/tag';
17
18
  import { toast } from 'sonner';
@@ -788,10 +789,19 @@ function WorkflowImportDialog({
788
789
  if (!nextOpen) reset();
789
790
  },
790
791
  children: [
791
- /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "default", onClick: () => setOpen(true), children: [
792
- /* @__PURE__ */ jsx(Icon, { icon: "mynaui:download", className: "size-4" }),
793
- tr("fluidgrids.workflowsList.importButton", "Import")
794
- ] }),
792
+ /* @__PURE__ */ jsxs(
793
+ Button,
794
+ {
795
+ variant: "outline",
796
+ size: "default",
797
+ onClick: () => setOpen(true),
798
+ "data-tour": "fluidgrids-list-import",
799
+ children: [
800
+ /* @__PURE__ */ jsx(Icon, { icon: "mynaui:download", className: "size-4" }),
801
+ tr("fluidgrids.workflowsList.importButton", "Import")
802
+ ]
803
+ }
804
+ ),
795
805
  /* @__PURE__ */ jsxs(DialogContent, { className: "max-h-[90vh] overflow-y-auto sm:max-w-2xl", children: [
796
806
  /* @__PURE__ */ jsxs(DialogHeader, { children: [
797
807
  /* @__PURE__ */ jsx(DialogTitle, { children: tr("fluidgrids.workflowsList.importTitle", "Import workflow JSON") }),
@@ -936,6 +946,165 @@ function WorkflowImportDialog({
936
946
  }
937
947
  );
938
948
  }
949
+ function firstWorkflowSteps({
950
+ progress,
951
+ canCreate,
952
+ onCreate,
953
+ onOpen,
954
+ onTemplates,
955
+ tr
956
+ }) {
957
+ const { runTarget, activateTarget } = progress;
958
+ return [
959
+ {
960
+ id: "create",
961
+ label: tr(
962
+ "fluidgrids.onboarding.createLabel",
963
+ "Build your first workflow, with a guided tour"
964
+ ),
965
+ description: tr(
966
+ "fluidgrids.onboarding.createDescription",
967
+ "Opens a new draft in the builder and walks you through adding a trigger, connecting nodes and saving."
968
+ ),
969
+ icon: /* @__PURE__ */ jsx(Icon, { icon: "mynaui:plus", className: "size-4", "aria-hidden": "true" }),
970
+ done: progress.created,
971
+ onClick: !progress.created && canCreate ? onCreate : void 0
972
+ },
973
+ {
974
+ id: "run",
975
+ label: tr("fluidgrids.onboarding.runLabel", "Run it once to test"),
976
+ description: tr(
977
+ "fluidgrids.onboarding.runDescription",
978
+ "Press Run in the builder. Every execution shows up in Runs with a step-by-step timeline and logs."
979
+ ),
980
+ icon: /* @__PURE__ */ jsx(
981
+ Icon,
982
+ {
983
+ icon: "mdi:play-circle-outline",
984
+ className: "size-4",
985
+ "aria-hidden": "true"
986
+ }
987
+ ),
988
+ done: progress.ran,
989
+ onClick: !progress.ran && runTarget ? () => onOpen(runTarget) : void 0
990
+ },
991
+ {
992
+ id: "activate",
993
+ label: tr(
994
+ "fluidgrids.onboarding.activateLabel",
995
+ "Activate it to go live"
996
+ ),
997
+ description: tr(
998
+ "fluidgrids.onboarding.activateDescription",
999
+ "An active workflow answers its webhooks, schedules and other automatic triggers."
1000
+ ),
1001
+ icon: /* @__PURE__ */ jsx(
1002
+ Icon,
1003
+ {
1004
+ icon: "mdi:lightning-bolt-outline",
1005
+ className: "size-4",
1006
+ "aria-hidden": "true"
1007
+ }
1008
+ ),
1009
+ done: progress.activated,
1010
+ onClick: !progress.activated && activateTarget ? () => onOpen(activateTarget) : void 0
1011
+ },
1012
+ {
1013
+ id: "templates",
1014
+ label: tr(
1015
+ "fluidgrids.onboarding.templatesLabel",
1016
+ "Or start from a template"
1017
+ ),
1018
+ description: tr(
1019
+ "fluidgrids.onboarding.templatesDescription",
1020
+ "Pick a pre-built workflow and adapt it instead of starting from a blank canvas."
1021
+ ),
1022
+ icon: /* @__PURE__ */ jsx(
1023
+ Icon,
1024
+ {
1025
+ icon: "mynaui:layers-three",
1026
+ className: "size-4",
1027
+ "aria-hidden": "true"
1028
+ }
1029
+ ),
1030
+ // Optional, so it never holds the checklist open: it counts as done once
1031
+ // the person has a workflow, however they made it.
1032
+ done: progress.created,
1033
+ onClick: progress.created ? void 0 : onTemplates
1034
+ }
1035
+ ];
1036
+ }
1037
+ function FirstWorkflowChecklistView(props) {
1038
+ const { progress, tr } = props;
1039
+ if (progress.complete) return null;
1040
+ return /* @__PURE__ */ jsx("div", { "data-tour": "fluidgrids-list-onboarding", children: /* @__PURE__ */ jsx(
1041
+ NextSteps,
1042
+ {
1043
+ storageKey: "fluidgrids-first-workflow",
1044
+ title: tr(
1045
+ "fluidgrids.onboarding.title",
1046
+ "Get started with your first workflow"
1047
+ ),
1048
+ steps: firstWorkflowSteps(props)
1049
+ }
1050
+ ) });
1051
+ }
1052
+ function useChecklistHandlers() {
1053
+ const navigate = useNavigate();
1054
+ return useMemo(
1055
+ () => ({
1056
+ onCreate: () => navigate(`../workflow/${v4()}/v1`, GUIDED_FIRST_WORKFLOW_NAV),
1057
+ onOpen: (workflow) => navigate(builderPathFor(workflow)),
1058
+ onTemplates: () => navigate("../templates")
1059
+ }),
1060
+ [navigate]
1061
+ );
1062
+ }
1063
+ function ChecklistWithRuns({
1064
+ workflows,
1065
+ canCreate
1066
+ }) {
1067
+ const tr = useTr();
1068
+ const handlers = useChecklistHandlers();
1069
+ const { total, loading, error } = useExecutions({ limit: 1 });
1070
+ const runsTotal = loading || error ? null : total;
1071
+ const progress = useMemo(
1072
+ () => firstWorkflowProgress(workflows, runsTotal),
1073
+ [workflows, runsTotal]
1074
+ );
1075
+ return /* @__PURE__ */ jsx(
1076
+ FirstWorkflowChecklistView,
1077
+ {
1078
+ progress,
1079
+ canCreate,
1080
+ tr,
1081
+ ...handlers
1082
+ }
1083
+ );
1084
+ }
1085
+ function ChecklistWithoutWorkflows({ canCreate }) {
1086
+ const tr = useTr();
1087
+ const handlers = useChecklistHandlers();
1088
+ const progress = useMemo(() => firstWorkflowProgress([], 0), []);
1089
+ return /* @__PURE__ */ jsx(
1090
+ FirstWorkflowChecklistView,
1091
+ {
1092
+ progress,
1093
+ canCreate,
1094
+ tr,
1095
+ ...handlers
1096
+ }
1097
+ );
1098
+ }
1099
+ function FirstWorkflowChecklist({
1100
+ workflows,
1101
+ canCreate
1102
+ }) {
1103
+ if (workflows.length === 0) {
1104
+ return /* @__PURE__ */ jsx(ChecklistWithoutWorkflows, { canCreate });
1105
+ }
1106
+ return /* @__PURE__ */ jsx(ChecklistWithRuns, { workflows, canCreate });
1107
+ }
939
1108
  function useStatusFilters() {
940
1109
  const tr = useTr();
941
1110
  return useMemo(
@@ -982,6 +1151,9 @@ function WorkflowsList() {
982
1151
  latestOnly: true
983
1152
  });
984
1153
  const { getWorkflow } = useLazyWorkflowDefinition();
1154
+ const { allowed: canCreate } = useFluidGridsPermission(
1155
+ FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE
1156
+ );
985
1157
  const [search, setSearch] = useState("");
986
1158
  const [statusFilter, setStatusFilter] = useState(null);
987
1159
  const [tagFilter, setTagFilter] = useState(null);
@@ -1108,6 +1280,7 @@ function WorkflowsList() {
1108
1280
  ]
1109
1281
  }
1110
1282
  ),
1283
+ !loading && !error && /* @__PURE__ */ jsx(FirstWorkflowChecklist, { workflows, canCreate }),
1111
1284
  !loading && !error && workflows.length > 0 && /* @__PURE__ */ jsxs(
1112
1285
  "div",
1113
1286
  {
@@ -1289,4 +1462,4 @@ function WorkflowsList() {
1289
1462
  );
1290
1463
  }
1291
1464
 
1292
- export { WorkflowsList };
1465
+ export { FirstWorkflowChecklist, FirstWorkflowChecklistView, WorkflowsList };
@@ -1,16 +1,58 @@
1
- import { isCreateIntent, decideMissingWorkflow } from './chunk-6N27YGMB.js';
2
- import { useInstalledNodes, buildNodeCheck, refetchStoreNodes, FlowBuilderPage, buildRequiredNodeTypes, mergeStickyNotes } from './chunk-T3UCFY7J.js';
1
+ import { isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent, isCreateIntent, decideMissingWorkflow } from './chunk-YGBDZ424.js';
2
+ import { useInstalledNodes, buildNodeCheck, refetchStoreNodes, FlowBuilderPage, buildRequiredNodeTypes, mergeStickyNotes } from './chunk-36RTRUCM.js';
3
3
  import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-HP3A6BPK.js';
4
4
  import { useFlowStore } from './chunk-VI2RFS65.js';
5
5
  import { useTr } from './chunk-UULVIT25.js';
6
- import { useNavigate, useParams, useLocation } from 'react-router';
6
+ import { useLocation, useNavigate, useParams } from 'react-router';
7
7
  import { toast } from 'sonner';
8
8
  import { Icon } from '@iconify/react';
9
9
  import { lazy, useRef, useEffect, useState, useCallback, useMemo, Suspense } from 'react';
10
+ import { useSafeToursContext, usePlayTour } from '@burdenoff/fe-libs/shared/tours';
10
11
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
11
12
  import { ErrorBoundary } from '@burdenoff/fe-libs/shared/components';
12
13
  import '@xyflow/react/dist/style.css';
13
14
 
15
+ var START_DELAY_MS = 800;
16
+ function StartGuidedTour() {
17
+ const location = useLocation();
18
+ const navigate = useNavigate();
19
+ const { pageTours, pageId, loading } = useSafeToursContext();
20
+ const playTour = usePlayTour();
21
+ const startedForKey = useRef(null);
22
+ const tour = loading ? null : pickGuidedTour(pageTours, pageId);
23
+ useEffect(() => {
24
+ if (!tour || startedForKey.current === location.key) return void 0;
25
+ const timer = setTimeout(() => {
26
+ startedForKey.current = location.key;
27
+ playTour(tour);
28
+ void navigate(
29
+ {
30
+ pathname: location.pathname,
31
+ search: location.search,
32
+ hash: location.hash
33
+ },
34
+ { replace: true, state: withoutGuidedTourIntent(location.state) }
35
+ );
36
+ }, START_DELAY_MS);
37
+ return () => clearTimeout(timer);
38
+ }, [
39
+ tour,
40
+ playTour,
41
+ navigate,
42
+ location.key,
43
+ location.pathname,
44
+ location.search,
45
+ location.hash,
46
+ location.state
47
+ ]);
48
+ return null;
49
+ }
50
+ function GuidedTourStarter({ ready }) {
51
+ const location = useLocation();
52
+ const { productId } = useSafeToursContext();
53
+ if (!ready || !productId || !isGuidedTourIntent(location.state)) return null;
54
+ return /* @__PURE__ */ jsx(StartGuidedTour, {});
55
+ }
14
56
  var LazyMissingNodesInstallModal = lazy(
15
57
  () => import('./MissingNodesInstallModal-OSAJLIBE.js').then(
16
58
  (m) => ({ default: m.MissingNodesInstallModal })
@@ -457,7 +499,8 @@ function WorkflowItem({
457
499
  installErrors
458
500
  }
459
501
  ) }),
460
- workflow && !isLoading && /* @__PURE__ */ jsx(FlowBuilderPage, { workflow })
502
+ workflow && !isLoading && /* @__PURE__ */ jsx(FlowBuilderPage, { workflow }),
503
+ /* @__PURE__ */ jsx(GuidedTourStarter, { ready: Boolean(workflow && !isLoading) })
461
504
  ] });
462
505
  }
463
506
  function WorkflowBuilder() {
@@ -498,4 +541,4 @@ function WorkflowBuilder() {
498
541
  );
499
542
  }
500
543
 
501
- export { WorkflowBuilder };
544
+ export { GuidedTourStarter, WorkflowBuilder };