@react-querybuilder/datetime 8.20.1-alpha.0 → 8.20.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 (147) hide show
  1. package/README.md +9 -3
  2. package/dist/cjs/getDatetimeRuleProcessorTanStackDB-BVNfYaIj.js +2 -0
  3. package/dist/cjs/getDatetimeRuleProcessorTanStackDB-BVNfYaIj.js.map +1 -0
  4. package/dist/cjs/{getDatetimeRuleProcessorTanStackDB-CL79A1_x.js → getDatetimeRuleProcessorTanStackDB-cmGqMT0Q.js} +83 -216
  5. package/dist/cjs/getDatetimeRuleProcessorTanStackDB-cmGqMT0Q.js.map +1 -0
  6. package/dist/cjs/react-querybuilder_datetime.cjs.development.d.ts +3 -123
  7. package/dist/cjs/react-querybuilder_datetime.cjs.development.date-fns.d.ts +2 -2
  8. package/dist/cjs/react-querybuilder_datetime.cjs.development.date-fns.js +3 -2
  9. package/dist/cjs/react-querybuilder_datetime.cjs.development.date-fns.js.map +1 -1
  10. package/dist/cjs/react-querybuilder_datetime.cjs.development.dayjs.d.ts +2 -2
  11. package/dist/cjs/react-querybuilder_datetime.cjs.development.dayjs.js +53 -26
  12. package/dist/cjs/react-querybuilder_datetime.cjs.development.dayjs.js.map +1 -1
  13. package/dist/cjs/react-querybuilder_datetime.cjs.development.js +10 -467
  14. package/dist/cjs/react-querybuilder_datetime.cjs.development.js.map +1 -1
  15. package/dist/cjs/react-querybuilder_datetime.cjs.development.jsdate.d.ts +2 -2
  16. package/dist/cjs/react-querybuilder_datetime.cjs.development.jsdate.js +26 -144
  17. package/dist/cjs/react-querybuilder_datetime.cjs.development.jsdate.js.map +1 -1
  18. package/dist/cjs/react-querybuilder_datetime.cjs.development.luxon.d.ts +2 -2
  19. package/dist/cjs/react-querybuilder_datetime.cjs.development.luxon.js +3 -2
  20. package/dist/cjs/react-querybuilder_datetime.cjs.development.luxon.js.map +1 -1
  21. package/dist/cjs/react-querybuilder_datetime.cjs.development.ui.d.ts +228 -0
  22. package/dist/cjs/react-querybuilder_datetime.cjs.development.ui.js +464 -0
  23. package/dist/cjs/react-querybuilder_datetime.cjs.development.ui.js.map +1 -0
  24. package/dist/cjs/react-querybuilder_datetime.cjs.production.d.ts +3 -123
  25. package/dist/cjs/react-querybuilder_datetime.cjs.production.date-fns.d.ts +2 -2
  26. package/dist/cjs/react-querybuilder_datetime.cjs.production.date-fns.js +1 -1
  27. package/dist/cjs/react-querybuilder_datetime.cjs.production.date-fns.js.map +1 -1
  28. package/dist/cjs/react-querybuilder_datetime.cjs.production.dayjs.d.ts +2 -2
  29. package/dist/cjs/react-querybuilder_datetime.cjs.production.dayjs.js +1 -1
  30. package/dist/cjs/react-querybuilder_datetime.cjs.production.dayjs.js.map +1 -1
  31. package/dist/cjs/react-querybuilder_datetime.cjs.production.js +1 -1
  32. package/dist/cjs/react-querybuilder_datetime.cjs.production.js.map +1 -1
  33. package/dist/cjs/react-querybuilder_datetime.cjs.production.jsdate.d.ts +2 -2
  34. package/dist/cjs/react-querybuilder_datetime.cjs.production.jsdate.js +1 -1
  35. package/dist/cjs/react-querybuilder_datetime.cjs.production.jsdate.js.map +1 -1
  36. package/dist/cjs/react-querybuilder_datetime.cjs.production.luxon.d.ts +2 -2
  37. package/dist/cjs/react-querybuilder_datetime.cjs.production.luxon.js +1 -1
  38. package/dist/cjs/react-querybuilder_datetime.cjs.production.luxon.js.map +1 -1
  39. package/dist/cjs/react-querybuilder_datetime.cjs.production.ui.d.ts +228 -0
  40. package/dist/cjs/react-querybuilder_datetime.cjs.production.ui.js +2 -0
  41. package/dist/cjs/react-querybuilder_datetime.cjs.production.ui.js.map +1 -0
  42. package/dist/cjs/rolldown-runtime-CMqjfN_6.js +1 -0
  43. package/dist/cjs/rolldown-runtime-D6vf50IK.js +28 -0
  44. package/dist/cjs/rqbDateTimeLibraryAPI.jsdate-BPEcMhhr.js +128 -0
  45. package/dist/cjs/rqbDateTimeLibraryAPI.jsdate-BPEcMhhr.js.map +1 -0
  46. package/dist/cjs/rqbDateTimeLibraryAPI.jsdate-ioz2B1zh.js +2 -0
  47. package/dist/cjs/rqbDateTimeLibraryAPI.jsdate-ioz2B1zh.js.map +1 -0
  48. package/dist/cjs/{types-XYMw0jFT.d.ts → types-Di8kFIXV.d.ts} +3 -103
  49. package/dist/cjs/ui.d.ts +1 -0
  50. package/dist/cjs/ui.js +6 -0
  51. package/dist/cjs/utils-DUePrC--.js +154 -0
  52. package/dist/cjs/utils-DUePrC--.js.map +1 -0
  53. package/dist/cjs/utils-jkW5R1AA.js +2 -0
  54. package/dist/cjs/utils-jkW5R1AA.js.map +1 -0
  55. package/dist/{getDatetimeRuleProcessorTanStackDB-BcOC-o2A.mjs → getDatetimeRuleProcessorTanStackDB-B93XaPdB.mjs} +4 -107
  56. package/dist/getDatetimeRuleProcessorTanStackDB-B93XaPdB.mjs.map +1 -0
  57. package/dist/{getDatetimeRuleProcessorTanStackDB-BL8mbdbl.js → getDatetimeRuleProcessorTanStackDB-BDFJlfJh.js} +4 -181
  58. package/dist/getDatetimeRuleProcessorTanStackDB-BDFJlfJh.js.map +1 -0
  59. package/dist/getDatetimeRuleProcessorTanStackDB-Czg9Fbb8.mjs +2 -0
  60. package/dist/getDatetimeRuleProcessorTanStackDB-Czg9Fbb8.mjs.map +1 -0
  61. package/dist/objectSpread2-73AKOozq.js +181 -0
  62. package/dist/objectSpread2-73AKOozq.js.map +1 -0
  63. package/dist/react-querybuilder_datetime.d.mts +3 -123
  64. package/dist/react-querybuilder_datetime.date-fns.d.mts +2 -2
  65. package/dist/react-querybuilder_datetime.date-fns.mjs +2 -1
  66. package/dist/react-querybuilder_datetime.date-fns.mjs.map +1 -1
  67. package/dist/react-querybuilder_datetime.dayjs.d.mts +2 -2
  68. package/dist/react-querybuilder_datetime.dayjs.mjs +27 -2
  69. package/dist/react-querybuilder_datetime.dayjs.mjs.map +1 -1
  70. package/dist/react-querybuilder_datetime.jsdate.d.mts +2 -2
  71. package/dist/react-querybuilder_datetime.jsdate.mjs +2 -120
  72. package/dist/react-querybuilder_datetime.jsdate.mjs.map +1 -1
  73. package/dist/react-querybuilder_datetime.legacy-esm.d.ts +3 -123
  74. package/dist/react-querybuilder_datetime.legacy-esm.date-fns.d.ts +2 -2
  75. package/dist/react-querybuilder_datetime.legacy-esm.date-fns.js +2 -1
  76. package/dist/react-querybuilder_datetime.legacy-esm.date-fns.js.map +1 -1
  77. package/dist/react-querybuilder_datetime.legacy-esm.dayjs.d.ts +2 -2
  78. package/dist/react-querybuilder_datetime.legacy-esm.dayjs.js +27 -2
  79. package/dist/react-querybuilder_datetime.legacy-esm.dayjs.js.map +1 -1
  80. package/dist/react-querybuilder_datetime.legacy-esm.js +4 -449
  81. package/dist/react-querybuilder_datetime.legacy-esm.js.map +1 -1
  82. package/dist/react-querybuilder_datetime.legacy-esm.jsdate.d.ts +2 -2
  83. package/dist/react-querybuilder_datetime.legacy-esm.jsdate.js +2 -120
  84. package/dist/react-querybuilder_datetime.legacy-esm.jsdate.js.map +1 -1
  85. package/dist/react-querybuilder_datetime.legacy-esm.luxon.d.ts +2 -2
  86. package/dist/react-querybuilder_datetime.legacy-esm.luxon.js +2 -1
  87. package/dist/react-querybuilder_datetime.legacy-esm.luxon.js.map +1 -1
  88. package/dist/react-querybuilder_datetime.legacy-esm.ui.d.ts +228 -0
  89. package/dist/react-querybuilder_datetime.legacy-esm.ui.js +451 -0
  90. package/dist/react-querybuilder_datetime.legacy-esm.ui.js.map +1 -0
  91. package/dist/react-querybuilder_datetime.luxon.d.mts +2 -2
  92. package/dist/react-querybuilder_datetime.luxon.mjs +2 -1
  93. package/dist/react-querybuilder_datetime.luxon.mjs.map +1 -1
  94. package/dist/react-querybuilder_datetime.mjs +4 -446
  95. package/dist/react-querybuilder_datetime.mjs.map +1 -1
  96. package/dist/react-querybuilder_datetime.production.d.mts +3 -123
  97. package/dist/react-querybuilder_datetime.production.date-fns.d.mts +2 -2
  98. package/dist/react-querybuilder_datetime.production.date-fns.mjs +1 -1
  99. package/dist/react-querybuilder_datetime.production.date-fns.mjs.map +1 -1
  100. package/dist/react-querybuilder_datetime.production.dayjs.d.mts +2 -2
  101. package/dist/react-querybuilder_datetime.production.dayjs.mjs +1 -1
  102. package/dist/react-querybuilder_datetime.production.dayjs.mjs.map +1 -1
  103. package/dist/react-querybuilder_datetime.production.jsdate.d.mts +2 -2
  104. package/dist/react-querybuilder_datetime.production.jsdate.mjs +1 -1
  105. package/dist/react-querybuilder_datetime.production.jsdate.mjs.map +1 -1
  106. package/dist/react-querybuilder_datetime.production.luxon.d.mts +2 -2
  107. package/dist/react-querybuilder_datetime.production.luxon.mjs +1 -1
  108. package/dist/react-querybuilder_datetime.production.luxon.mjs.map +1 -1
  109. package/dist/react-querybuilder_datetime.production.mjs +1 -1
  110. package/dist/react-querybuilder_datetime.production.mjs.map +1 -1
  111. package/dist/react-querybuilder_datetime.production.ui.d.mts +228 -0
  112. package/dist/react-querybuilder_datetime.production.ui.mjs +2 -0
  113. package/dist/react-querybuilder_datetime.production.ui.mjs.map +1 -0
  114. package/dist/react-querybuilder_datetime.ui.d.mts +228 -0
  115. package/dist/react-querybuilder_datetime.ui.mjs +448 -0
  116. package/dist/react-querybuilder_datetime.ui.mjs.map +1 -0
  117. package/dist/rqbDateTimeLibraryAPI.jsdate-CDOtydFq.mjs +2 -0
  118. package/dist/rqbDateTimeLibraryAPI.jsdate-CDOtydFq.mjs.map +1 -0
  119. package/dist/rqbDateTimeLibraryAPI.jsdate-CpGoQAje.js +123 -0
  120. package/dist/rqbDateTimeLibraryAPI.jsdate-CpGoQAje.js.map +1 -0
  121. package/dist/rqbDateTimeLibraryAPI.jsdate-D66yJ1hK.mjs +123 -0
  122. package/dist/rqbDateTimeLibraryAPI.jsdate-D66yJ1hK.mjs.map +1 -0
  123. package/dist/{types-CdjHqQ0k.d.ts → types-Di8kFIXV.d.mts} +3 -103
  124. package/dist/{types-CdjHqQ0k.d.mts → types-Di8kFIXV.d.ts} +3 -103
  125. package/dist/utils-BC2SALFm.mjs +107 -0
  126. package/dist/utils-BC2SALFm.mjs.map +1 -0
  127. package/dist/utils-VKS8YY2D.mjs +2 -0
  128. package/dist/utils-VKS8YY2D.mjs.map +1 -0
  129. package/package.json +27 -8
  130. package/ui/package.json +4 -0
  131. package/dist/cjs/getDatetimeRuleProcessorTanStackDB-CL79A1_x.js.map +0 -1
  132. package/dist/cjs/getDatetimeRuleProcessorTanStackDB-DgUg_arY.js +0 -2
  133. package/dist/cjs/getDatetimeRuleProcessorTanStackDB-DgUg_arY.js.map +0 -1
  134. package/dist/cjs/rqbDateTimeLibraryAPI.dayjs-BfILPx88.js +0 -2
  135. package/dist/cjs/rqbDateTimeLibraryAPI.dayjs-BfILPx88.js.map +0 -1
  136. package/dist/cjs/rqbDateTimeLibraryAPI.dayjs-CzLh_zi9.js +0 -63
  137. package/dist/cjs/rqbDateTimeLibraryAPI.dayjs-CzLh_zi9.js.map +0 -1
  138. package/dist/getDatetimeRuleProcessorTanStackDB-BL8mbdbl.js.map +0 -1
  139. package/dist/getDatetimeRuleProcessorTanStackDB-BcOC-o2A.mjs.map +0 -1
  140. package/dist/getDatetimeRuleProcessorTanStackDB-Dloxv6k2.mjs +0 -2
  141. package/dist/getDatetimeRuleProcessorTanStackDB-Dloxv6k2.mjs.map +0 -1
  142. package/dist/rqbDateTimeLibraryAPI.dayjs-BW7faYFD.mjs +0 -29
  143. package/dist/rqbDateTimeLibraryAPI.dayjs-BW7faYFD.mjs.map +0 -1
  144. package/dist/rqbDateTimeLibraryAPI.dayjs-BoX90aqZ.mjs +0 -2
  145. package/dist/rqbDateTimeLibraryAPI.dayjs-BoX90aqZ.mjs.map +0 -1
  146. package/dist/rqbDateTimeLibraryAPI.dayjs-Da4VXvFM.js +0 -29
  147. package/dist/rqbDateTimeLibraryAPI.dayjs-Da4VXvFM.js.map +0 -1
@@ -0,0 +1,228 @@
1
+ import { _ as RelativeDateTimeAnchor, b as RelativeDateTimeValue, i as RQBDateTimeLibraryAPI, y as RelativeDateTimeUnit } from "./types-Di8kFIXV.mjs";
2
+ import { FullOption } from "@react-querybuilder/core";
3
+ import * as React from "react";
4
+ import { ComponentType, ReactNode } from "react";
5
+ import { FullOperator, FullOption as FullOption$1, QueryBuilderContextProvider, ValueEditorProps } from "react-querybuilder";
6
+
7
+ //#region src/ui/types.d.ts
8
+ /**
9
+ * Customizable content/labels for the absolute/relative mode toggle rendered by
10
+ * {@link toggleModeController}. The default glyphs come from CSS pseudo-elements, so
11
+ * `absoluteContent`/`relativeContent` are only needed to override them (e.g. to render
12
+ * an icon component or localized text).
13
+ */
14
+ interface RelativeDateTimeToggleLabels {
15
+ /** Accessible label (`aria-label`) for the toggle button. */
16
+ label?: string;
17
+ /** Tooltip shown while in absolute mode (clicking switches to relative). */
18
+ absoluteTitle?: string;
19
+ /** Tooltip shown while in relative mode (clicking switches to absolute). */
20
+ relativeTitle?: string;
21
+ /** Custom content rendered while in absolute mode. Defaults to a CSS glyph. */
22
+ absoluteContent?: ReactNode;
23
+ /** Custom content rendered while in relative mode. Defaults to a CSS glyph. */
24
+ relativeContent?: ReactNode;
25
+ }
26
+ /**
27
+ * Props passed to a {@link RelativeDateTimeModeController}'s `ModeControl` component —
28
+ * the affordance (e.g. a toggle button) that switches a rule between absolute and
29
+ * relative date/time entry.
30
+ */
31
+ interface RelativeDateTimeModeControlProps {
32
+ /** Whether the rule is currently in relative mode. */
33
+ isRelative: boolean;
34
+ /** Switches the rule between absolute and relative mode. */
35
+ setMode: (mode: "absolute" | "relative") => void;
36
+ /** The value editor's schema (for theme-aware rendering). */
37
+ schema: ValueEditorProps["schema"];
38
+ /** Whether the control is disabled. */
39
+ disabled?: boolean;
40
+ /** Class name applied to the control. */
41
+ className?: string;
42
+ /** Title/tooltip from the value editor (fallback when labels omit titles). */
43
+ title?: string;
44
+ /** Test ID from the value editor. */
45
+ testID?: string;
46
+ /** Resolved toggle labels (merged with defaults). */
47
+ labels: Required<RelativeDateTimeToggleLabels>;
48
+ }
49
+ /**
50
+ * A pluggable strategy that governs how a user switches between absolute and relative
51
+ * date/time entry in the {@link RelativeDateTimeValueEditor}. The stored value shape is
52
+ * unaffected — a controller only decides the current mode and (optionally) renders an
53
+ * affordance to change it.
54
+ *
55
+ * Ships with {@link toggleModeController} (the zero-config default); build an
56
+ * operator-driven controller with {@link createOperatorModeController}, or supply a custom
57
+ * object to fully control the UX.
58
+ */
59
+ interface RelativeDateTimeModeController {
60
+ /** Derives the current mode from the rule (its operator and/or value). */
61
+ isRelative: (props: ValueEditorProps) => boolean;
62
+ /**
63
+ * Optional affordance rendered inside the editor to switch modes. Omit it (as the
64
+ * operator-driven controller does) when the mode is selected elsewhere, e.g. via the
65
+ * operator selector.
66
+ */
67
+ ModeControl?: ComponentType<RelativeDateTimeModeControlProps>;
68
+ }
69
+ /**
70
+ * Configuration for the {@link RelativeDateTimeValueEditor}, supplied as props to
71
+ * {@link QueryBuilderDateTime} (or via the relative date/time config context). Every
72
+ * field is optional; omitting all of them yields the zero-config toggle experience.
73
+ */
74
+ interface RelativeDateTimeEditorConfig {
75
+ /** Strategy for switching between absolute and relative modes. Defaults to {@link toggleModeController}. */
76
+ modeController?: RelativeDateTimeModeController;
77
+ /** Anchor (reference-point) options. Defaults to {@link defaultRelativeDateTimeAnchors}. */
78
+ anchors?: FullOption$1<RelativeDateTimeAnchor>[];
79
+ /** Unit options. Defaults to {@link defaultRelativeDateTimeUnits}. */
80
+ units?: FullOption$1<RelativeDateTimeUnit>[];
81
+ /** Content/labels for the absolute/relative toggle. */
82
+ toggleLabels?: RelativeDateTimeToggleLabels;
83
+ /**
84
+ * Date/time library adapter used by the value editor to parse/validate the rule value
85
+ * for the native date input. Defaults to the plain JavaScript adapter. Pass the adapter
86
+ * matching your chosen entry point (e.g. from `@react-querybuilder/datetime/luxon`) so the
87
+ * editor interprets values consistently with the rule processors.
88
+ */
89
+ dateTimeAPI?: RQBDateTimeLibraryAPI;
90
+ }
91
+ /**
92
+ * Maps operator names that are used only to _signal_ relative mode (see
93
+ * {@link createOperatorModeController}) to the real comparison operator that should be used
94
+ * when exporting via `formatQuery`. Supplied through `context.relativeOperatorMap`. Operators
95
+ * not present in the map are exported unchanged.
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * formatQuery(query, {
100
+ * format: 'sql',
101
+ * ruleProcessor: datetimeRuleProcessorSQL,
102
+ * context: { relativeOperatorMap: { relativeEq: '=' } },
103
+ * });
104
+ * ```
105
+ */
106
+ type RelativeOperatorMap = Record<string, string>;
107
+ //#endregion
108
+ //#region src/ui/QueryBuilderDateTime.d.ts
109
+ declare const DateTimeValueEditor: (props: ValueEditorProps) => React.JSX.Element;
110
+ declare const QueryBuilderDateTimeContext: QueryBuilderContextProvider;
111
+ /** Props for {@link QueryBuilderDateTime}: {@link RelativeDateTimeEditorConfig} plus children. */
112
+ interface QueryBuilderDateTimeProps extends RelativeDateTimeEditorConfig {
113
+ children?: React.ReactNode;
114
+ }
115
+ /**
116
+ * Context provider enabling date/time features for a wrapped
117
+ * {@link react-querybuilder!QueryBuilder QueryBuilder}: renders the relative-capable
118
+ * {@link RelativeDateTimeValueEditor} for date/time fields, and accepts optional
119
+ * {@link RelativeDateTimeEditorConfig} props (mode controller, anchor/unit options, and
120
+ * toggle labels). With no props it provides the zero-config toggle experience.
121
+ *
122
+ * @group Components
123
+ */
124
+ declare const QueryBuilderDateTime: ({
125
+ children,
126
+ modeController,
127
+ anchors,
128
+ units,
129
+ toggleLabels,
130
+ dateTimeAPI
131
+ }: QueryBuilderDateTimeProps) => React.JSX.Element;
132
+ //#endregion
133
+ //#region src/ui/RelativeDateTimeConfigContext.d.ts
134
+ /** Fully-resolved relative date/time editor config (no optional fields). */
135
+ interface ResolvedRelativeDateTimeConfig {
136
+ modeController: RelativeDateTimeModeController;
137
+ anchors: FullOption$1<RelativeDateTimeAnchor>[];
138
+ units: FullOption$1<RelativeDateTimeUnit>[];
139
+ toggleLabels: Required<RelativeDateTimeToggleLabels>;
140
+ dateTimeAPI: RQBDateTimeLibraryAPI;
141
+ }
142
+ /**
143
+ * Carries {@link RelativeDateTimeEditorConfig} to the {@link RelativeDateTimeValueEditor}.
144
+ * Provided by {@link QueryBuilderDateTime}; defaults apply when no provider is present.
145
+ */
146
+ declare const RelativeDateTimeConfigContext: React.Context<RelativeDateTimeEditorConfig>;
147
+ /** Reads the relative date/time editor config from context, merged with defaults. */
148
+ declare const useRelativeDateTimeConfig: () => ResolvedRelativeDateTimeConfig;
149
+ //#endregion
150
+ //#region src/ui/RelativeDateTimeValueEditor.d.ts
151
+ /**
152
+ * Value editor with support for {@link RelativeDateTimeValue relative date/time values}
153
+ * (e.g. "three months ago" or "the beginning of this year"). How the user switches
154
+ * between absolute and relative modes is delegated to a pluggable
155
+ * {@link RelativeDateTimeModeController} (default: a compact toggle), supplied via
156
+ * {@link QueryBuilderDateTime}. In relative mode it renders anchor + signed offset + unit
157
+ * selectors; the unit selector is hidden when the offset is `0`.
158
+ *
159
+ * For the `between`/`notBetween` operators it renders two independent value editors (each
160
+ * with its own mode affordance) and stores the bounds as a two-element array, so the from
161
+ * and to bounds can independently be absolute or relative.
162
+ *
163
+ * @group Components
164
+ */
165
+ declare const RelativeDateTimeValueEditor: (props: ValueEditorProps) => React.JSX.Element;
166
+ //#endregion
167
+ //#region src/ui/relativeDateTimeConstants.d.ts
168
+ /**
169
+ * Class name applied to the absolute/relative mode toggle button. Package-local (not part
170
+ * of the core `standardClassnames`) to avoid coupling core to this extension.
171
+ */
172
+ declare const relativeDateTimeToggleClassName = "rule-value-dateTimeRelative-toggle";
173
+ /** Default value applied when switching a rule to relative mode. */
174
+ declare const defaultRelativeDateTimeValue: RelativeDateTimeValue;
175
+ /** Default anchor (reference-point) options for the relative date/time editor. */
176
+ declare const defaultRelativeDateTimeAnchors: FullOption<RelativeDateTimeAnchor>[];
177
+ /** Default unit options for the relative date/time editor. */
178
+ declare const defaultRelativeDateTimeUnits: FullOption<RelativeDateTimeUnit>[];
179
+ /** Default labels/content for the absolute/relative mode toggle. */
180
+ declare const defaultRelativeDateTimeToggleLabels: Required<RelativeDateTimeToggleLabels>;
181
+ //#endregion
182
+ //#region src/ui/relativeDateTimeModeControllers.d.ts
183
+ /**
184
+ * Compact absolute/relative toggle rendered by {@link toggleModeController}. A
185
+ * `role="switch"` button whose default glyph is supplied by CSS (keyed on
186
+ * `aria-checked`); override via the `toggleLabels` config.
187
+ *
188
+ * @group Components
189
+ */
190
+ declare const RelativeDateTimeModeToggle: ({
191
+ isRelative,
192
+ setMode,
193
+ disabled,
194
+ className,
195
+ labels
196
+ }: RelativeDateTimeModeControlProps) => React.JSX.Element;
197
+ /**
198
+ * Zero-config default {@link RelativeDateTimeModeController}: derives the mode from the
199
+ * value shape and renders a compact toggle button to switch between absolute and
200
+ * relative entry.
201
+ */
202
+ declare const toggleModeController: RelativeDateTimeModeController;
203
+ /**
204
+ * Builds an operator-driven {@link RelativeDateTimeModeController} that derives the mode
205
+ * from the rule's operator. Pass the operator name(s) (or a predicate) that should put the
206
+ * editor in relative mode. No toggle is rendered — the operator selector is the mode
207
+ * affordance.
208
+ *
209
+ * NOTE: the chosen operators only signal _mode_; the rule's value remains a
210
+ * {@link RelativeDateTimeValue}. For these operators to export correctly, map each one to a
211
+ * real comparison operator via `context.relativeOperatorMap` when calling `formatQuery`
212
+ * (e.g. `{ relativeEq: '=' }`). See the documentation.
213
+ */
214
+ declare const createOperatorModeController: (relativeOperators: string[] | ((operator: string) => boolean)) => RelativeDateTimeModeController;
215
+ interface FieldWithOperators {
216
+ operators?: FullOperator[];
217
+ [key: string]: unknown;
218
+ }
219
+ /**
220
+ * Appends the given `operators` to each field's `operators` list, so the operator-driven
221
+ * controller (see {@link createOperatorModeController}) has an operator to switch into
222
+ * relative mode. Fields without an explicit `operators` list fall back to the core
223
+ * `defaultOperators`.
224
+ */
225
+ declare const withRelativeOperators: <F extends FieldWithOperators>(fields: F[], operators: FullOperator[]) => F[];
226
+ //#endregion
227
+ export { DateTimeValueEditor, QueryBuilderDateTime, QueryBuilderDateTimeContext, QueryBuilderDateTimeProps, RelativeDateTimeConfigContext, RelativeDateTimeEditorConfig, RelativeDateTimeModeControlProps, RelativeDateTimeModeController, RelativeDateTimeModeToggle, RelativeDateTimeToggleLabels, RelativeDateTimeValueEditor, RelativeOperatorMap, ResolvedRelativeDateTimeConfig, createOperatorModeController, defaultRelativeDateTimeAnchors, defaultRelativeDateTimeToggleLabels, defaultRelativeDateTimeUnits, defaultRelativeDateTimeValue, relativeDateTimeToggleClassName, toggleModeController, useRelativeDateTimeConfig, withRelativeOperators };
228
+ //# sourceMappingURL=react-querybuilder_datetime.ui.d.mts.map
@@ -0,0 +1,448 @@
1
+ import { r as isRelativeDateTimeValue } from "./utils-BC2SALFm.mjs";
2
+ import { t as rqbDateTimeLibraryAPI } from "./rqbDateTimeLibraryAPI.jsdate-D66yJ1hK.mjs";
3
+ import * as React from "react";
4
+ import { createContext, useCallback, useContext, useMemo } from "react";
5
+ import { QueryBuilderContext, ValueEditor, clsx, defaultOperators, getCompatContextProvider, parseNumber, standardClassnames, toArray, useValueEditor } from "react-querybuilder";
6
+ //#region src/ui/InheritedValueEditorContext.ts
7
+ /**
8
+ * Holds the value editor inherited from an outer (compat package) context provider,
9
+ * captured _before_ {@link QueryBuilderDateTime} overrides it. Lets the date/time value
10
+ * editor delegate non-date fields (and absolute date inputs) to the compat editor instead
11
+ * of the bare default {@link react-querybuilder!ValueEditor ValueEditor}. `null` = none
12
+ * inherited (fall back to default).
13
+ */
14
+ const InheritedValueEditorContext = createContext(null);
15
+ /** Inherited (compat) value editor, or `null` if none. See {@link InheritedValueEditorContext}. */
16
+ const useInheritedValueEditor = () => useContext(InheritedValueEditorContext);
17
+ //#endregion
18
+ //#region src/ui/relativeDateTimeConstants.ts
19
+ /**
20
+ * Class name applied to the absolute/relative mode toggle button. Package-local (not part
21
+ * of the core `standardClassnames`) to avoid coupling core to this extension.
22
+ */
23
+ const relativeDateTimeToggleClassName = "rule-value-dateTimeRelative-toggle";
24
+ /** Default value applied when switching a rule to relative mode. */
25
+ const defaultRelativeDateTimeValue = {
26
+ mode: "relative",
27
+ anchor: "now",
28
+ offset: 0,
29
+ unit: "day"
30
+ };
31
+ /** Default anchor (reference-point) options for the relative date/time editor. */
32
+ const defaultRelativeDateTimeAnchors = [
33
+ {
34
+ name: "now",
35
+ value: "now",
36
+ label: "now"
37
+ },
38
+ {
39
+ name: "startOfDay",
40
+ value: "startOfDay",
41
+ label: "start of day"
42
+ },
43
+ {
44
+ name: "endOfDay",
45
+ value: "endOfDay",
46
+ label: "end of day"
47
+ },
48
+ {
49
+ name: "startOfWeek",
50
+ value: "startOfWeek",
51
+ label: "start of week"
52
+ },
53
+ {
54
+ name: "endOfWeek",
55
+ value: "endOfWeek",
56
+ label: "end of week"
57
+ },
58
+ {
59
+ name: "startOfMonth",
60
+ value: "startOfMonth",
61
+ label: "start of month"
62
+ },
63
+ {
64
+ name: "endOfMonth",
65
+ value: "endOfMonth",
66
+ label: "end of month"
67
+ },
68
+ {
69
+ name: "startOfYear",
70
+ value: "startOfYear",
71
+ label: "start of year"
72
+ },
73
+ {
74
+ name: "endOfYear",
75
+ value: "endOfYear",
76
+ label: "end of year"
77
+ }
78
+ ];
79
+ /** Default unit options for the relative date/time editor. */
80
+ const defaultRelativeDateTimeUnits = [
81
+ {
82
+ name: "minute",
83
+ value: "minute",
84
+ label: "minute(s)"
85
+ },
86
+ {
87
+ name: "hour",
88
+ value: "hour",
89
+ label: "hour(s)"
90
+ },
91
+ {
92
+ name: "day",
93
+ value: "day",
94
+ label: "day(s)"
95
+ },
96
+ {
97
+ name: "week",
98
+ value: "week",
99
+ label: "week(s)"
100
+ },
101
+ {
102
+ name: "month",
103
+ value: "month",
104
+ label: "month(s)"
105
+ },
106
+ {
107
+ name: "year",
108
+ value: "year",
109
+ label: "year(s)"
110
+ }
111
+ ];
112
+ /** Default labels/content for the absolute/relative mode toggle. */
113
+ const defaultRelativeDateTimeToggleLabels = {
114
+ label: "Toggle relative date/time",
115
+ absoluteTitle: "Absolute date/time (click for relative)",
116
+ relativeTitle: "Relative date/time (click for absolute)",
117
+ absoluteContent: "",
118
+ relativeContent: ""
119
+ };
120
+ //#endregion
121
+ //#region src/ui/relativeDateTimeModeControllers.tsx
122
+ /**
123
+ * Compact absolute/relative toggle rendered by {@link toggleModeController}. A
124
+ * `role="switch"` button whose default glyph is supplied by CSS (keyed on
125
+ * `aria-checked`); override via the `toggleLabels` config.
126
+ *
127
+ * @group Components
128
+ */
129
+ const RelativeDateTimeModeToggle = ({ isRelative, setMode, disabled, className, labels }) => {
130
+ const onClick = React.useCallback(() => setMode(isRelative ? "absolute" : "relative"), [setMode, isRelative]);
131
+ return /* @__PURE__ */ React.createElement("button", {
132
+ type: "button",
133
+ role: "switch",
134
+ "aria-checked": isRelative,
135
+ "aria-label": labels.label,
136
+ title: isRelative ? labels.relativeTitle : labels.absoluteTitle,
137
+ disabled,
138
+ className: clsx(relativeDateTimeToggleClassName, className),
139
+ onClick
140
+ }, isRelative ? labels.relativeContent : labels.absoluteContent);
141
+ };
142
+ /**
143
+ * Zero-config default {@link RelativeDateTimeModeController}: derives the mode from the
144
+ * value shape and renders a compact toggle button to switch between absolute and
145
+ * relative entry.
146
+ */
147
+ const toggleModeController = {
148
+ isRelative: (props) => isRelativeDateTimeValue(props.value),
149
+ ModeControl: RelativeDateTimeModeToggle
150
+ };
151
+ /**
152
+ * Builds an operator-driven {@link RelativeDateTimeModeController} that derives the mode
153
+ * from the rule's operator. Pass the operator name(s) (or a predicate) that should put the
154
+ * editor in relative mode. No toggle is rendered — the operator selector is the mode
155
+ * affordance.
156
+ *
157
+ * NOTE: the chosen operators only signal _mode_; the rule's value remains a
158
+ * {@link RelativeDateTimeValue}. For these operators to export correctly, map each one to a
159
+ * real comparison operator via `context.relativeOperatorMap` when calling `formatQuery`
160
+ * (e.g. `{ relativeEq: '=' }`). See the documentation.
161
+ */
162
+ const createOperatorModeController = (relativeOperators) => ({ isRelative: (props) => typeof relativeOperators === "function" ? relativeOperators(props.operator) : relativeOperators.includes(props.operator) });
163
+ /**
164
+ * Appends the given `operators` to each field's `operators` list, so the operator-driven
165
+ * controller (see {@link createOperatorModeController}) has an operator to switch into
166
+ * relative mode. Fields without an explicit `operators` list fall back to the core
167
+ * `defaultOperators`.
168
+ */
169
+ const withRelativeOperators = (fields, operators) => fields.map((field) => ({
170
+ ...field,
171
+ operators: [...field.operators ?? defaultOperators, ...operators]
172
+ }));
173
+ //#endregion
174
+ //#region src/ui/RelativeDateTimeConfigContext.tsx
175
+ /**
176
+ * Carries {@link RelativeDateTimeEditorConfig} to the {@link RelativeDateTimeValueEditor}.
177
+ * Provided by {@link QueryBuilderDateTime}; defaults apply when no provider is present.
178
+ */
179
+ const RelativeDateTimeConfigContext = createContext({});
180
+ /** Reads the relative date/time editor config from context, merged with defaults. */
181
+ const useRelativeDateTimeConfig = () => {
182
+ const config = useContext(RelativeDateTimeConfigContext);
183
+ return useMemo(() => ({
184
+ modeController: config.modeController ?? toggleModeController,
185
+ anchors: config.anchors ?? defaultRelativeDateTimeAnchors,
186
+ units: config.units ?? defaultRelativeDateTimeUnits,
187
+ toggleLabels: {
188
+ ...defaultRelativeDateTimeToggleLabels,
189
+ ...config.toggleLabels
190
+ },
191
+ dateTimeAPI: config.dateTimeAPI ?? rqbDateTimeLibraryAPI
192
+ }), [config]);
193
+ };
194
+ //#endregion
195
+ //#region src/ui/RelativeDateTimeValueEditor.tsx
196
+ const dummyPath = [];
197
+ const dummyFieldData = {
198
+ name: "",
199
+ value: "",
200
+ label: ""
201
+ };
202
+ /** Splits a value into the from/to pair used by between/notBetween, object-safe. */
203
+ const toBetweenArray = (value) => Array.isArray(value) ? value : isRelativeDateTimeValue(value) ? [value] : toArray(value);
204
+ /**
205
+ * Renders a single absolute-or-relative date/time value: a mode affordance (per the
206
+ * controller) plus either an absolute date input or anchor + signed offset + unit
207
+ * selectors. Reused once per slot so between/notBetween can mix bounds (e.g. an absolute
208
+ * "from" and a relative "to").
209
+ */
210
+ const RelativeDateTimeSingleValueEditor = ({ baseProps, value, onChange, absoluteOperator, config, SelectorComponent, NumericEditorComponent, valueListItemClassName, numericSchema }) => {
211
+ const { schema, disabled, title, testID } = baseProps;
212
+ const { modeController, anchors, units, toggleLabels } = config;
213
+ const isRelative = modeController.isRelative({
214
+ ...baseProps,
215
+ value
216
+ });
217
+ const relValue = isRelativeDateTimeValue(value) ? value : defaultRelativeDateTimeValue;
218
+ const handleSetMode = useCallback((mode) => onChange(mode === "relative" ? defaultRelativeDateTimeValue : ""), [onChange]);
219
+ const handleChangeAnchor = useCallback((anchor) => onChange({
220
+ ...relValue,
221
+ anchor
222
+ }), [onChange, relValue]);
223
+ const handleChangeOffset = useCallback((offset) => onChange({
224
+ ...relValue,
225
+ offset: parseNumber(offset, { parseNumbers: true }) || 0
226
+ }), [onChange, relValue]);
227
+ const handleChangeUnit = useCallback((unit) => onChange({
228
+ ...relValue,
229
+ unit
230
+ }), [onChange, relValue]);
231
+ const { ModeControl } = modeController;
232
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, ModeControl && /* @__PURE__ */ React.createElement(ModeControl, {
233
+ isRelative,
234
+ setMode: handleSetMode,
235
+ schema,
236
+ disabled,
237
+ className: valueListItemClassName,
238
+ title,
239
+ testID,
240
+ labels: toggleLabels
241
+ }), isRelative ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(SelectorComponent, {
242
+ schema,
243
+ testID,
244
+ title,
245
+ className: valueListItemClassName,
246
+ handleOnChange: handleChangeAnchor,
247
+ disabled,
248
+ value: relValue.anchor,
249
+ options: anchors,
250
+ multiple: false,
251
+ listsAsArrays: false,
252
+ path: dummyPath,
253
+ level: 0
254
+ }), /* @__PURE__ */ React.createElement(NumericEditorComponent, {
255
+ skipHook: true,
256
+ testID,
257
+ inputType: "number",
258
+ title,
259
+ className: valueListItemClassName,
260
+ disabled,
261
+ handleOnChange: handleChangeOffset,
262
+ field: "",
263
+ operator: "",
264
+ value: relValue.offset,
265
+ valueSource: "value",
266
+ fieldData: dummyFieldData,
267
+ schema: numericSchema,
268
+ path: dummyPath,
269
+ level: 0,
270
+ rule: {
271
+ field: "",
272
+ operator: "=",
273
+ value: relValue.offset
274
+ }
275
+ }), relValue.offset !== 0 && /* @__PURE__ */ React.createElement(SelectorComponent, {
276
+ schema,
277
+ testID,
278
+ title,
279
+ className: valueListItemClassName,
280
+ handleOnChange: handleChangeUnit,
281
+ disabled,
282
+ value: relValue.unit,
283
+ options: units,
284
+ multiple: false,
285
+ listsAsArrays: false,
286
+ path: dummyPath,
287
+ level: 0
288
+ })) : /* @__PURE__ */ React.createElement(DateTimeValueEditor, {
289
+ ...baseProps,
290
+ operator: absoluteOperator,
291
+ value,
292
+ handleOnChange: onChange,
293
+ className: standardClassnames.value
294
+ }));
295
+ };
296
+ /**
297
+ * Value editor with support for {@link RelativeDateTimeValue relative date/time values}
298
+ * (e.g. "three months ago" or "the beginning of this year"). How the user switches
299
+ * between absolute and relative modes is delegated to a pluggable
300
+ * {@link RelativeDateTimeModeController} (default: a compact toggle), supplied via
301
+ * {@link QueryBuilderDateTime}. In relative mode it renders anchor + signed offset + unit
302
+ * selectors; the unit selector is hidden when the offset is `0`.
303
+ *
304
+ * For the `between`/`notBetween` operators it renders two independent value editors (each
305
+ * with its own mode affordance) and stores the bounds as a two-element array, so the from
306
+ * and to bounds can independently be absolute or relative.
307
+ *
308
+ * @group Components
309
+ */
310
+ const RelativeDateTimeValueEditor = (props) => {
311
+ const { valueListItemClassName } = useValueEditor(props);
312
+ const { className, value, handleOnChange, schema, operator, separator } = props;
313
+ const { suppressStandardClassnames } = schema;
314
+ const SelectorComponent = props.selectorComponent ?? schema.controls.valueSelector;
315
+ const NumericEditorComponent = useInheritedValueEditor() ?? ValueEditor;
316
+ const config = useRelativeDateTimeConfig();
317
+ const numericSchema = useMemo(() => ({
318
+ ...schema,
319
+ parseNumbers: true
320
+ }), [schema]);
321
+ const outerClassname = useMemo(() => clsx(suppressStandardClassnames || standardClassnames.valueDateTimeRelative, className), [suppressStandardClassnames, className]);
322
+ const isBetween = operator === "between" || operator === "notBetween";
323
+ const valueAsArray = useMemo(() => toBetweenArray(value), [value]);
324
+ const handleChangeBound = useCallback((index) => (boundValue) => {
325
+ const next = [valueAsArray[0], valueAsArray[1]];
326
+ next[index] = boundValue;
327
+ handleOnChange(next);
328
+ }, [valueAsArray, handleOnChange]);
329
+ if (isBetween) return /* @__PURE__ */ React.createElement("span", { className: outerClassname }, /* @__PURE__ */ React.createElement(RelativeDateTimeSingleValueEditor, {
330
+ baseProps: props,
331
+ value: valueAsArray[0],
332
+ onChange: handleChangeBound(0),
333
+ absoluteOperator: "=",
334
+ config,
335
+ SelectorComponent,
336
+ NumericEditorComponent,
337
+ valueListItemClassName,
338
+ numericSchema
339
+ }), separator, /* @__PURE__ */ React.createElement(RelativeDateTimeSingleValueEditor, {
340
+ baseProps: props,
341
+ value: valueAsArray[1],
342
+ onChange: handleChangeBound(1),
343
+ absoluteOperator: "=",
344
+ config,
345
+ SelectorComponent,
346
+ NumericEditorComponent,
347
+ valueListItemClassName,
348
+ numericSchema
349
+ }));
350
+ return /* @__PURE__ */ React.createElement("span", { className: outerClassname }, /* @__PURE__ */ React.createElement(RelativeDateTimeSingleValueEditor, {
351
+ baseProps: props,
352
+ value,
353
+ onChange: handleOnChange,
354
+ absoluteOperator: operator,
355
+ config,
356
+ SelectorComponent,
357
+ NumericEditorComponent,
358
+ valueListItemClassName,
359
+ numericSchema
360
+ }));
361
+ };
362
+ //#endregion
363
+ //#region src/ui/QueryBuilderDateTime.tsx
364
+ /**
365
+ * Whether a rule should use a date/time editor, based on either the coerced input
366
+ * type (`date`/`datetime-local`) or a date-like `datatype` (`date`/`datetime`/`timestamp`).
367
+ */
368
+ const isDateTimeEditor = (props, inputTypeCoerced) => props.type === "text" && (inputTypeCoerced === "date" || inputTypeCoerced === "datetime-local") || /^(?:date|datetime|timestamp)\b/i.test(props.fieldData?.datatype);
369
+ const pad2 = (n) => `${n}`.padStart(2, "0");
370
+ /**
371
+ * Formats a `Date` into the local value expected by a native `date`/`datetime-local`
372
+ * input (library-agnostic; the date library only handles parsing/validation).
373
+ */
374
+ const formatDateInputValue = (d, withTime) => {
375
+ const datePart = `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;
376
+ return withTime ? `${datePart}T${pad2(d.getHours())}:${pad2(d.getMinutes())}` : datePart;
377
+ };
378
+ /**
379
+ * Renders the inherited (compat) editor when one is provided, otherwise the default
380
+ * {@link react-querybuilder!ValueEditor ValueEditor}. The editor is received as a prop (rather
381
+ * than read from context here) so the JSX element type stays prop-sourced and stable.
382
+ */
383
+ const FallbackValueEditor = ({ editor: Editor, ...props }) => Editor ? /* @__PURE__ */ React.createElement(Editor, props) : /* @__PURE__ */ React.createElement(ValueEditor, {
384
+ ...props,
385
+ skipHook: true
386
+ });
387
+ const DateTimeValueEditor = (props) => {
388
+ const uVE = useValueEditor(props);
389
+ const InheritedEditor = useInheritedValueEditor();
390
+ const { dateTimeAPI } = useRelativeDateTimeConfig();
391
+ const fallback = (p) => /* @__PURE__ */ React.createElement(FallbackValueEditor, {
392
+ editor: InheritedEditor,
393
+ ...p
394
+ });
395
+ if (!isDateTimeEditor(props, uVE.inputTypeCoerced)) return fallback(props);
396
+ if (dateTimeAPI.isValid(props.value)) {
397
+ const value = formatDateInputValue(dateTimeAPI.toDate(props.value), uVE.inputTypeCoerced !== "date");
398
+ return fallback({
399
+ ...props,
400
+ value
401
+ });
402
+ }
403
+ return fallback(props);
404
+ };
405
+ /**
406
+ * Provider value editor: renders the relative-capable {@link RelativeDateTimeValueEditor}
407
+ * for date/time fields and falls back to the inherited (compat) editor for everything else.
408
+ */
409
+ const QueryBuilderDateTimeValueEditor = (props) => {
410
+ const uVE = useValueEditor(props);
411
+ const InheritedEditor = useInheritedValueEditor();
412
+ if (isDateTimeEditor(props, uVE.inputTypeCoerced)) return /* @__PURE__ */ React.createElement(RelativeDateTimeValueEditor, props);
413
+ return /* @__PURE__ */ React.createElement(FallbackValueEditor, {
414
+ editor: InheritedEditor,
415
+ ...props
416
+ });
417
+ };
418
+ const QueryBuilderDateTimeContext = getCompatContextProvider({ controlElements: { valueEditor: QueryBuilderDateTimeValueEditor } });
419
+ /**
420
+ * Context provider enabling date/time features for a wrapped
421
+ * {@link react-querybuilder!QueryBuilder QueryBuilder}: renders the relative-capable
422
+ * {@link RelativeDateTimeValueEditor} for date/time fields, and accepts optional
423
+ * {@link RelativeDateTimeEditorConfig} props (mode controller, anchor/unit options, and
424
+ * toggle labels). With no props it provides the zero-config toggle experience.
425
+ *
426
+ * @group Components
427
+ */
428
+ const QueryBuilderDateTime = ({ children, modeController, anchors, units, toggleLabels, dateTimeAPI }) => {
429
+ const config = useMemo(() => ({
430
+ modeController,
431
+ anchors,
432
+ units,
433
+ toggleLabels,
434
+ dateTimeAPI
435
+ }), [
436
+ modeController,
437
+ anchors,
438
+ units,
439
+ toggleLabels,
440
+ dateTimeAPI
441
+ ]);
442
+ const inheritedValueEditor = useContext(QueryBuilderContext).controlElements?.valueEditor ?? null;
443
+ return /* @__PURE__ */ React.createElement(RelativeDateTimeConfigContext.Provider, { value: config }, /* @__PURE__ */ React.createElement(InheritedValueEditorContext.Provider, { value: inheritedValueEditor }, /* @__PURE__ */ React.createElement(QueryBuilderDateTimeContext, null, children)));
444
+ };
445
+ //#endregion
446
+ export { DateTimeValueEditor, QueryBuilderDateTime, QueryBuilderDateTimeContext, RelativeDateTimeConfigContext, RelativeDateTimeModeToggle, RelativeDateTimeValueEditor, createOperatorModeController, defaultRelativeDateTimeAnchors, defaultRelativeDateTimeToggleLabels, defaultRelativeDateTimeUnits, defaultRelativeDateTimeValue, relativeDateTimeToggleClassName, toggleModeController, useRelativeDateTimeConfig, withRelativeOperators };
447
+
448
+ //# sourceMappingURL=react-querybuilder_datetime.ui.mjs.map