@burdenoff/fluidgrids-fe-sdk 2026.1013.1 → 2026.1013.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.
@@ -1,5 +1,5 @@
1
- export { ExecutionDetailPage } from './chunk-5I2FKLG5.js';
2
- import './chunk-MC3ADVN6.js';
1
+ export { ExecutionDetailPage } from './chunk-IPNGNROQ.js';
2
+ import './chunk-NM5TH27W.js';
3
3
  import './chunk-QBFAJNUC.js';
4
4
  import './chunk-SYU74PMY.js';
5
5
  import './chunk-JL7CASN5.js';
@@ -1,5 +1,5 @@
1
- export { ExecutionsListPage } from './chunk-SSTHXJMO.js';
2
- import './chunk-MC3ADVN6.js';
1
+ export { ExecutionsListPage } from './chunk-ZB45VAXM.js';
2
+ import './chunk-NM5TH27W.js';
3
3
  import './chunk-QBFAJNUC.js';
4
4
  import './chunk-IYTHK7B5.js';
5
5
  import './chunk-D3UWK7GY.js';
@@ -1,4 +1,4 @@
1
- import { useExecution, buildNodeDisplayMap, useExecutionActions, useAutoRefresh, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-MC3ADVN6.js';
1
+ import { useExecution, buildNodeDisplayMap, useExecutionActions, useAutoRefresh, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-NM5TH27W.js';
2
2
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-SYU74PMY.js';
3
3
  import { getFluidGridsConfig } from './chunk-UZG3ZIQM.js';
4
4
  import { RunLogsDocument, RunLogAppendedDocument } from './chunk-F2OUXT3V.js';
@@ -216,6 +216,38 @@ function NodeStatusBadge({
216
216
  }
217
217
  );
218
218
  }
219
+
220
+ // src/modules/executions/utils/date-range.ts
221
+ function toDate(value) {
222
+ if (value === null || value === void 0 || value === "") return null;
223
+ const date = value instanceof Date ? value : new Date(value);
224
+ return Number.isNaN(date.getTime()) ? null : date;
225
+ }
226
+ function validateDateRange(start, end, preset) {
227
+ const startDate = toDate(start);
228
+ const endDate = toDate(end);
229
+ if (startDate && endDate && startDate.getTime() > endDate.getTime()) {
230
+ return { valid: false, start: null, end: null, preset: preset ?? "all" };
231
+ }
232
+ return {
233
+ valid: true,
234
+ start: startDate,
235
+ end: endDate,
236
+ preset: preset ?? "all"
237
+ };
238
+ }
239
+ function dateRangeToInput(start, end) {
240
+ const {
241
+ valid,
242
+ start: validatedStart,
243
+ end: validatedEnd
244
+ } = validateDateRange(start, end);
245
+ if (!valid) return {};
246
+ const input = {};
247
+ if (validatedStart) input.startDate = validatedStart.toISOString();
248
+ if (validatedEnd) input.endDate = validatedEnd.toISOString();
249
+ return input;
250
+ }
219
251
  function ExecutionFilters({
220
252
  workflows = [],
221
253
  onRefresh
@@ -639,41 +671,54 @@ function ExecutionFilters({
639
671
  }
640
672
  )
641
673
  ] }),
642
- showCustomDate && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-3 items-center p-3 bg-background-secondary rounded-lg border border-border-secondary", children: [
643
- /* @__PURE__ */ jsx("label", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionFilters.fromLabel", "From:") }),
644
- /* @__PURE__ */ jsx(
645
- "input",
646
- {
647
- type: "datetime-local",
648
- value: filter.dateRange.start?.toISOString().slice(0, 16) ?? "",
649
- onChange: (e) => setDateRange({
650
- ...filter.dateRange,
651
- start: e.target.value ? new Date(e.target.value) : null,
652
- preset: "custom"
653
- }),
654
- className: "px-3 py-1.5 bg-background-primary border border-border-secondary rounded text-text-primary text-sm"
655
- }
656
- ),
657
- /* @__PURE__ */ jsx("label", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionFilters.toLabel", "To:") }),
658
- /* @__PURE__ */ jsx(
659
- "input",
660
- {
661
- type: "datetime-local",
662
- value: filter.dateRange.end?.toISOString().slice(0, 16) ?? "",
663
- onChange: (e) => setDateRange({
664
- ...filter.dateRange,
665
- end: e.target.value ? new Date(e.target.value) : null,
666
- preset: "custom"
667
- }),
668
- className: "px-3 py-1.5 bg-background-primary border border-border-secondary rounded text-text-primary text-sm"
669
- }
670
- ),
671
- /* @__PURE__ */ jsx(
672
- "button",
674
+ showCustomDate && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
675
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-3 items-center p-3 bg-background-secondary rounded-lg border border-border-secondary", children: [
676
+ /* @__PURE__ */ jsx("label", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionFilters.fromLabel", "From:") }),
677
+ /* @__PURE__ */ jsx(
678
+ "input",
679
+ {
680
+ type: "datetime-local",
681
+ value: filter.dateRange.start?.toISOString().slice(0, 16) ?? "",
682
+ onChange: (e) => setDateRange({
683
+ ...filter.dateRange,
684
+ start: e.target.value ? new Date(e.target.value) : null,
685
+ preset: "custom"
686
+ }),
687
+ className: "px-3 py-1.5 bg-background-primary border border-border-secondary rounded text-text-primary text-sm"
688
+ }
689
+ ),
690
+ /* @__PURE__ */ jsx("label", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionFilters.toLabel", "To:") }),
691
+ /* @__PURE__ */ jsx(
692
+ "input",
693
+ {
694
+ type: "datetime-local",
695
+ value: filter.dateRange.end?.toISOString().slice(0, 16) ?? "",
696
+ onChange: (e) => setDateRange({
697
+ ...filter.dateRange,
698
+ end: e.target.value ? new Date(e.target.value) : null,
699
+ preset: "custom"
700
+ }),
701
+ className: "px-3 py-1.5 bg-background-primary border border-border-secondary rounded text-text-primary text-sm"
702
+ }
703
+ ),
704
+ /* @__PURE__ */ jsx(
705
+ "button",
706
+ {
707
+ onClick: () => setShowCustomDate(false),
708
+ className: "text-text-secondary hover:text-text-primary",
709
+ children: /* @__PURE__ */ jsx(Icon, { icon: "mdi:close", width: 18 })
710
+ }
711
+ )
712
+ ] }),
713
+ !validateDateRange(filter.dateRange.start, filter.dateRange.end).valid && /* @__PURE__ */ jsx(
714
+ "p",
673
715
  {
674
- onClick: () => setShowCustomDate(false),
675
- className: "text-text-secondary hover:text-text-primary",
676
- children: /* @__PURE__ */ jsx(Icon, { icon: "mdi:close", width: 18 })
716
+ role: "alert",
717
+ className: "text-sm text-[var(--color-status-error-text)]",
718
+ children: tr(
719
+ "fluidgrids.executions.executionFilters.dateRangeInvalid",
720
+ 'Invalid date range: "From" must be before or equal to "To".'
721
+ )
677
722
  }
678
723
  )
679
724
  ] }),
@@ -2969,12 +3014,10 @@ function useExecutionsWithStore() {
2969
3014
  if (filter.workflowKey) {
2970
3015
  baseInput.workflowKey = filter.workflowKey;
2971
3016
  }
2972
- if (filter.dateRange.start) {
2973
- baseInput.startDate = filter.dateRange.start.toISOString();
2974
- }
2975
- if (filter.dateRange.end) {
2976
- baseInput.endDate = filter.dateRange.end.toISOString();
2977
- }
3017
+ Object.assign(
3018
+ baseInput,
3019
+ dateRangeToInput(filter.dateRange.start, filter.dateRange.end)
3020
+ );
2978
3021
  const term = debouncedSearch.trim();
2979
3022
  if (term) {
2980
3023
  baseInput.search = term;
@@ -1,4 +1,4 @@
1
- import { useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination } from './chunk-MC3ADVN6.js';
1
+ import { useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination } from './chunk-NM5TH27W.js';
2
2
  import { useWorkflowDefinitions } from './chunk-IYTHK7B5.js';
3
3
  import { useExecutionsStore } from './chunk-UZG3ZIQM.js';
4
4
  import { useTr } from './chunk-UULVIT25.js';
@@ -1,7 +1,7 @@
1
1
  import './chunk-AD3BXTJS.js';
2
- export { ExecutionsListPage } from './chunk-SSTHXJMO.js';
3
- export { ExecutionDetailPage } from './chunk-5I2FKLG5.js';
4
- import './chunk-MC3ADVN6.js';
2
+ export { ExecutionsListPage } from './chunk-ZB45VAXM.js';
3
+ export { ExecutionDetailPage } from './chunk-IPNGNROQ.js';
4
+ import './chunk-NM5TH27W.js';
5
5
  import './chunk-QBFAJNUC.js';
6
6
  import './chunk-SYU74PMY.js';
7
7
  import './chunk-JL7CASN5.js';
package/dist/index.js CHANGED
@@ -4,9 +4,9 @@ export { WorkflowBuilder as WorkflowBuilderPage } from './chunk-CADRCSD5.js';
4
4
  export { WorkflowsList } from './chunk-HPUNEDCO.js';
5
5
  import './chunk-6N27YGMB.js';
6
6
  import './chunk-AD3BXTJS.js';
7
- export { ExecutionsListPage } from './chunk-SSTHXJMO.js';
8
- export { ExecutionDetailPage } from './chunk-5I2FKLG5.js';
9
- import './chunk-MC3ADVN6.js';
7
+ export { ExecutionsListPage } from './chunk-ZB45VAXM.js';
8
+ export { ExecutionDetailPage } from './chunk-IPNGNROQ.js';
9
+ import './chunk-NM5TH27W.js';
10
10
  export { HistoryPage } from './chunk-DFITJZLD.js';
11
11
  export { NodesPage, fetchAllNodesWithManifests, useLazyNodeManifest, useNodeEndpoint, useNodeEndpoints, useNodeManifest } from './chunk-Z2KX5KUL.js';
12
12
  export { DataSinkDashboardPage, ErrorAnalyticsPage, InsightsPage } from './chunk-KZYQPCMK.js';
@@ -70,12 +70,12 @@ var WorkflowBuilder3 = lazy(
70
70
  }))
71
71
  );
72
72
  var ExecutionsListPage2 = lazy(
73
- () => import('./ExecutionsListPage-3GIQYVGR.js').then((m) => ({
73
+ () => import('./ExecutionsListPage-WWVTV3NI.js').then((m) => ({
74
74
  default: m.ExecutionsListPage
75
75
  }))
76
76
  );
77
77
  var ExecutionDetailPage2 = lazy(
78
- () => import('./ExecutionDetailPage-WYQGMRCE.js').then((m) => ({
78
+ () => import('./ExecutionDetailPage-3XZJRSMI.js').then((m) => ({
79
79
  default: m.ExecutionDetailPage
80
80
  }))
81
81
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fluidgrids-fe-sdk",
3
- "version": "2026.1013.1",
3
+ "version": "2026.1013.2",
4
4
  "description": "FluidGrids Workflow Builder SDK - Embeddable visual workflow automation",
5
5
  "type": "module",
6
6
  "imports": {