@nestledjs/data-browser 0.1.11 → 0.1.13

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.
package/index.js CHANGED
@@ -16,6 +16,7 @@ import { RelationFilterField } from "./lib/components/filters/RelationFilterFiel
16
16
  import { AdminBreadcrumbs } from "./lib/components/shared/AdminBreadcrumbs.js";
17
17
  import { AdminEmptyState, AdminErrorState, AdminLoadingState } from "./lib/components/shared/AdminErrorStates.js";
18
18
  import { AdminStatusDisplay, AdminUserStatus } from "./lib/components/shared/AdminStatusDisplay.js";
19
+ import { RelationFieldWrapper } from "./lib/components/RelationFieldWrapper.js";
19
20
  import { buildFormFields, cleanFormInput, getAdminDocuments, getMutationName } from "./lib/utils/graphql-utils.js";
20
21
  import { AdminLocalStorage, SecureAdminLocalStorage } from "./lib/utils/secure-storage.js";
21
22
  import { formatFieldName, getItemDisplayName, getSmartSearchFields, kebabCase, normalizeModelNameForDocument, spacedWords } from "./lib/utils/string-utils.js";
@@ -40,6 +41,7 @@ export {
40
41
  NumberRangeFilter,
41
42
  RelationDropdownButton,
42
43
  RelationDropdownContent,
44
+ RelationFieldWrapper,
43
45
  RelationFilterField,
44
46
  RelationItem,
45
47
  RelationItemList,
@@ -0,0 +1,9 @@
1
+ interface RelationFieldWrapperProps {
2
+ readonly children?: React.ReactNode;
3
+ readonly relationType?: string;
4
+ readonly initialValue?: string;
5
+ readonly fieldName?: string;
6
+ readonly basePath?: string;
7
+ }
8
+ export declare function RelationFieldWrapper({ children, relationType, initialValue, fieldName, basePath }: RelationFieldWrapperProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,63 @@
1
+ import { Link } from "react-router";
2
+ import { useState, useEffect } from "react";
3
+ var _jsxFileName = "/Users/justinhandley/IdeaProjects/nestled_template/libs/data-browser/src/lib/components/RelationFieldWrapper.tsx";
4
+ const toKebabCase = (str) => {
5
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
6
+ };
7
+ function RelationFieldWrapper({
8
+ children,
9
+ relationType,
10
+ initialValue,
11
+ fieldName,
12
+ basePath = "/admin/data"
13
+ }) {
14
+ const [currentValue, setCurrentValue] = useState(initialValue || "");
15
+ useEffect(() => {
16
+ if (initialValue && !currentValue) {
17
+ setCurrentValue(initialValue);
18
+ }
19
+ if (fieldName) {
20
+ const selectElement = document.querySelector(`[name="${fieldName}"]`);
21
+ if ((selectElement == null ? void 0 : selectElement.value) && selectElement.value !== currentValue) {
22
+ setCurrentValue(selectElement.value);
23
+ }
24
+ if (selectElement) {
25
+ const handleChange = (event) => {
26
+ const target = event.target;
27
+ if (target.value !== currentValue) {
28
+ setCurrentValue(target.value);
29
+ }
30
+ };
31
+ selectElement.addEventListener("change", handleChange);
32
+ return () => {
33
+ selectElement.removeEventListener("change", handleChange);
34
+ };
35
+ }
36
+ }
37
+ }, [fieldName, currentValue, initialValue]);
38
+ const showViewLink = !!(relationType && currentValue && currentValue !== "");
39
+ return /* @__PURE__ */ React.createElement("div", { className: "relative", __self: this, __source: {
40
+ fileName: _jsxFileName,
41
+ lineNumber: 64,
42
+ columnNumber: 5
43
+ } }, children, showViewLink && /* @__PURE__ */ React.createElement("div", { className: "mt-1", __self: this, __source: {
44
+ fileName: _jsxFileName,
45
+ lineNumber: 67,
46
+ columnNumber: 9
47
+ } }, /* @__PURE__ */ React.createElement(Link, { to: `${basePath}/${toKebabCase(relationType)}/${currentValue}`, className: "inline-flex items-center text-xs text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300 hover:underline", __self: this, __source: {
48
+ fileName: _jsxFileName,
49
+ lineNumber: 68,
50
+ columnNumber: 11
51
+ } }, /* @__PURE__ */ React.createElement("svg", { className: "h-3 w-3 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", __self: this, __source: {
52
+ fileName: _jsxFileName,
53
+ lineNumber: 72,
54
+ columnNumber: 13
55
+ } }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z", __self: this, __source: {
56
+ fileName: _jsxFileName,
57
+ lineNumber: 79,
58
+ columnNumber: 15
59
+ } })), "View ", relationType, " record")));
60
+ }
61
+ export {
62
+ RelationFieldWrapper
63
+ };
@@ -3,5 +3,5 @@ interface DateRangeFilterProps {
3
3
  currentValue: any;
4
4
  onChange: (value: any) => void;
5
5
  }
6
- export declare function DateRangeFilter({ fieldName, currentValue, onChange }: DateRangeFilterProps): import("react/jsx-runtime").JSX.Element;
6
+ export declare function DateRangeFilter({ fieldName, currentValue, onChange }: Readonly<DateRangeFilterProps>): import("react/jsx-runtime").JSX.Element;
7
7
  export {};
@@ -1,5 +1,5 @@
1
- import { jsxDEV } from "react/jsx-dev-runtime";
2
1
  import { formatFieldName } from "../../utils/string-utils.js";
2
+ var _jsxFileName = "/Users/justinhandley/IdeaProjects/nestled_template/libs/data-browser/src/lib/components/filters/DateRangeFilter.tsx";
3
3
  function DateRangeFilter({
4
4
  fieldName,
5
5
  currentValue,
@@ -8,7 +8,9 @@ function DateRangeFilter({
8
8
  const fromDate = (currentValue == null ? void 0 : currentValue.gte) ? new Date(currentValue.gte).toISOString().split("T")[0] : "";
9
9
  const toDate = (currentValue == null ? void 0 : currentValue.lte) ? new Date(currentValue.lte).toISOString().split("T")[0] : "";
10
10
  const handleFromChange = (date) => {
11
- const newValue = { ...currentValue };
11
+ const newValue = {
12
+ ...currentValue
13
+ };
12
14
  if (date) {
13
15
  newValue.gte = new Date(date).toISOString();
14
16
  } else {
@@ -21,7 +23,9 @@ function DateRangeFilter({
21
23
  }
22
24
  };
23
25
  const handleToChange = (date) => {
24
- const newValue = { ...currentValue };
26
+ const newValue = {
27
+ ...currentValue
28
+ };
25
29
  if (date) {
26
30
  const endOfDay = new Date(date);
27
31
  endOfDay.setHours(23, 59, 59, 999);
@@ -35,88 +39,47 @@ function DateRangeFilter({
35
39
  onChange(newValue);
36
40
  }
37
41
  };
38
- return /* @__PURE__ */ jsxDEV("div", { className: "space-y-1", children: [
39
- /* @__PURE__ */ jsxDEV("label", { className: "block text-sm font-medium text-gray-700", children: formatFieldName(fieldName) }, void 0, false, {
40
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/DateRangeFilter.tsx",
41
- lineNumber: 56,
42
- columnNumber: 7
43
- }, this),
44
- /* @__PURE__ */ jsxDEV("div", { className: "grid grid-cols-2 gap-2", children: [
45
- /* @__PURE__ */ jsxDEV("div", { children: [
46
- /* @__PURE__ */ jsxDEV("label", { className: "block text-xs text-gray-500 mb-1", children: "From" }, void 0, false, {
47
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/DateRangeFilter.tsx",
48
- lineNumber: 61,
49
- columnNumber: 11
50
- }, this),
51
- /* @__PURE__ */ jsxDEV(
52
- "input",
53
- {
54
- type: "date",
55
- value: fromDate,
56
- onChange: (e) => handleFromChange(e.target.value),
57
- className: "w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-green-web focus:border-green-web"
58
- },
59
- void 0,
60
- false,
61
- {
62
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/DateRangeFilter.tsx",
63
- lineNumber: 62,
64
- columnNumber: 11
65
- },
66
- this
67
- )
68
- ] }, void 0, true, {
69
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/DateRangeFilter.tsx",
70
- lineNumber: 60,
71
- columnNumber: 9
72
- }, this),
73
- /* @__PURE__ */ jsxDEV("div", { children: [
74
- /* @__PURE__ */ jsxDEV("label", { className: "block text-xs text-gray-500 mb-1", children: "To" }, void 0, false, {
75
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/DateRangeFilter.tsx",
76
- lineNumber: 70,
77
- columnNumber: 11
78
- }, this),
79
- /* @__PURE__ */ jsxDEV(
80
- "input",
81
- {
82
- type: "date",
83
- value: toDate,
84
- onChange: (e) => handleToChange(e.target.value),
85
- className: "w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-green-web focus:border-green-web"
86
- },
87
- void 0,
88
- false,
89
- {
90
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/DateRangeFilter.tsx",
91
- lineNumber: 71,
92
- columnNumber: 11
93
- },
94
- this
95
- )
96
- ] }, void 0, true, {
97
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/DateRangeFilter.tsx",
98
- lineNumber: 69,
99
- columnNumber: 9
100
- }, this)
101
- ] }, void 0, true, {
102
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/DateRangeFilter.tsx",
103
- lineNumber: 59,
104
- columnNumber: 7
105
- }, this),
106
- (fromDate || toDate) && /* @__PURE__ */ jsxDEV("div", { className: "text-xs text-gray-500", children: [
107
- fromDate && toDate && `${fromDate} to ${toDate}`,
108
- fromDate && !toDate && `From ${fromDate}`,
109
- !fromDate && toDate && `Until ${toDate}`
110
- ] }, void 0, true, {
111
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/DateRangeFilter.tsx",
112
- lineNumber: 80,
113
- columnNumber: 9
114
- }, this)
115
- ] }, void 0, true, {
116
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/DateRangeFilter.tsx",
42
+ return /* @__PURE__ */ React.createElement("div", { className: "space-y-1", __self: this, __source: {
43
+ fileName: _jsxFileName,
117
44
  lineNumber: 55,
118
45
  columnNumber: 5
119
- }, this);
46
+ } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
47
+ fileName: _jsxFileName,
48
+ lineNumber: 56,
49
+ columnNumber: 7
50
+ } }, formatFieldName(fieldName)), /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-2 gap-2", __self: this, __source: {
51
+ fileName: _jsxFileName,
52
+ lineNumber: 59,
53
+ columnNumber: 7
54
+ } }, /* @__PURE__ */ React.createElement("div", { __self: this, __source: {
55
+ fileName: _jsxFileName,
56
+ lineNumber: 60,
57
+ columnNumber: 9
58
+ } }, /* @__PURE__ */ React.createElement("label", { htmlFor: `${fieldName}-from`, className: "block text-xs text-gray-500 mb-1", __self: this, __source: {
59
+ fileName: _jsxFileName,
60
+ lineNumber: 61,
61
+ columnNumber: 11
62
+ } }, "From"), /* @__PURE__ */ React.createElement("input", { id: `${fieldName}-from`, type: "date", value: fromDate, onChange: (e) => handleFromChange(e.target.value), className: "w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-green-web focus:border-green-web", __self: this, __source: {
63
+ fileName: _jsxFileName,
64
+ lineNumber: 62,
65
+ columnNumber: 11
66
+ } })), /* @__PURE__ */ React.createElement("div", { __self: this, __source: {
67
+ fileName: _jsxFileName,
68
+ lineNumber: 70,
69
+ columnNumber: 9
70
+ } }, /* @__PURE__ */ React.createElement("label", { htmlFor: `${fieldName}-to`, className: "block text-xs text-gray-500 mb-1", __self: this, __source: {
71
+ fileName: _jsxFileName,
72
+ lineNumber: 71,
73
+ columnNumber: 11
74
+ } }, "To"), /* @__PURE__ */ React.createElement("input", { id: `${fieldName}-to`, type: "date", value: toDate, onChange: (e) => handleToChange(e.target.value), className: "w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-green-web focus:border-green-web", __self: this, __source: {
75
+ fileName: _jsxFileName,
76
+ lineNumber: 72,
77
+ columnNumber: 11
78
+ } }))), (fromDate || toDate) && /* @__PURE__ */ React.createElement("div", { className: "text-xs text-gray-500", __self: this, __source: {
79
+ fileName: _jsxFileName,
80
+ lineNumber: 82,
81
+ columnNumber: 9
82
+ } }, fromDate && toDate && `${fromDate} to ${toDate}`, fromDate && !toDate && `From ${fromDate}`, !fromDate && toDate && `Until ${toDate}`));
120
83
  }
121
84
  export {
122
85
  DateRangeFilter
@@ -1,31 +1,33 @@
1
- import { jsxDEV } from "react/jsx-dev-runtime";
2
1
  import { formatFieldName } from "../../utils/string-utils.js";
2
+ var _jsxFileName = "/Users/justinhandley/IdeaProjects/nestled_template/libs/data-browser/src/lib/components/filters/NumberRangeFilter.tsx";
3
3
  function NumberRangeFilter({
4
4
  fieldName,
5
5
  fieldType,
6
6
  currentValue,
7
7
  onChange
8
8
  }) {
9
- const minValue = (currentValue == null ? void 0 : currentValue.gte) !== void 0 ? currentValue.gte.toString() : "";
10
- const maxValue = (currentValue == null ? void 0 : currentValue.lte) !== void 0 ? currentValue.lte.toString() : "";
9
+ const minValue = (currentValue == null ? void 0 : currentValue.gte) === void 0 ? "" : currentValue.gte.toString();
10
+ const maxValue = (currentValue == null ? void 0 : currentValue.lte) === void 0 ? "" : currentValue.lte.toString();
11
11
  const parseNumber = (value) => {
12
12
  if (!value) return void 0;
13
13
  if (fieldType === "int" || fieldType === "bigint") {
14
- const parsed = parseInt(value, 10);
15
- return isNaN(parsed) ? void 0 : parsed;
14
+ const parsed = Number.parseInt(value, 10);
15
+ return Number.isNaN(parsed) ? void 0 : parsed;
16
16
  } else if (fieldType === "float" || fieldType === "decimal") {
17
- const parsed = parseFloat(value);
18
- return isNaN(parsed) ? void 0 : parsed;
17
+ const parsed = Number.parseFloat(value);
18
+ return Number.isNaN(parsed) ? void 0 : parsed;
19
19
  }
20
20
  return void 0;
21
21
  };
22
22
  const handleMinChange = (value) => {
23
- const newValue = { ...currentValue };
23
+ const newValue = {
24
+ ...currentValue
25
+ };
24
26
  const parsedValue = parseNumber(value);
25
- if (parsedValue !== void 0) {
26
- newValue.gte = parsedValue;
27
- } else {
27
+ if (parsedValue === void 0) {
28
28
  delete newValue.gte;
29
+ } else {
30
+ newValue.gte = parsedValue;
29
31
  }
30
32
  if (newValue.gte === void 0 && newValue.lte === void 0) {
31
33
  onChange(void 0);
@@ -34,12 +36,14 @@ function NumberRangeFilter({
34
36
  }
35
37
  };
36
38
  const handleMaxChange = (value) => {
37
- const newValue = { ...currentValue };
39
+ const newValue = {
40
+ ...currentValue
41
+ };
38
42
  const parsedValue = parseNumber(value);
39
- if (parsedValue !== void 0) {
40
- newValue.lte = parsedValue;
41
- } else {
43
+ if (parsedValue === void 0) {
42
44
  delete newValue.lte;
45
+ } else {
46
+ newValue.lte = parsedValue;
43
47
  }
44
48
  if (newValue.gte === void 0 && newValue.lte === void 0) {
45
49
  onChange(void 0);
@@ -48,92 +52,47 @@ function NumberRangeFilter({
48
52
  }
49
53
  };
50
54
  const step = fieldType === "int" || fieldType === "bigint" ? "1" : "any";
51
- return /* @__PURE__ */ jsxDEV("div", { className: "space-y-1", children: [
52
- /* @__PURE__ */ jsxDEV("label", { className: "block text-sm font-medium text-gray-700", children: formatFieldName(fieldName) }, void 0, false, {
53
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/NumberRangeFilter.tsx",
54
- lineNumber: 75,
55
- columnNumber: 7
56
- }, this),
57
- /* @__PURE__ */ jsxDEV("div", { className: "grid grid-cols-2 gap-2", children: [
58
- /* @__PURE__ */ jsxDEV("div", { children: [
59
- /* @__PURE__ */ jsxDEV("label", { className: "block text-xs text-gray-500 mb-1", children: "Min" }, void 0, false, {
60
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/NumberRangeFilter.tsx",
61
- lineNumber: 80,
62
- columnNumber: 11
63
- }, this),
64
- /* @__PURE__ */ jsxDEV(
65
- "input",
66
- {
67
- type: "number",
68
- step,
69
- value: minValue,
70
- onChange: (e) => handleMinChange(e.target.value),
71
- placeholder: "No minimum",
72
- className: "w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-green-web focus:border-green-web"
73
- },
74
- void 0,
75
- false,
76
- {
77
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/NumberRangeFilter.tsx",
78
- lineNumber: 81,
79
- columnNumber: 11
80
- },
81
- this
82
- )
83
- ] }, void 0, true, {
84
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/NumberRangeFilter.tsx",
85
- lineNumber: 79,
86
- columnNumber: 9
87
- }, this),
88
- /* @__PURE__ */ jsxDEV("div", { children: [
89
- /* @__PURE__ */ jsxDEV("label", { className: "block text-xs text-gray-500 mb-1", children: "Max" }, void 0, false, {
90
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/NumberRangeFilter.tsx",
91
- lineNumber: 91,
92
- columnNumber: 11
93
- }, this),
94
- /* @__PURE__ */ jsxDEV(
95
- "input",
96
- {
97
- type: "number",
98
- step,
99
- value: maxValue,
100
- onChange: (e) => handleMaxChange(e.target.value),
101
- placeholder: "No maximum",
102
- className: "w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-green-web focus:border-green-web"
103
- },
104
- void 0,
105
- false,
106
- {
107
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/NumberRangeFilter.tsx",
108
- lineNumber: 92,
109
- columnNumber: 11
110
- },
111
- this
112
- )
113
- ] }, void 0, true, {
114
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/NumberRangeFilter.tsx",
115
- lineNumber: 90,
116
- columnNumber: 9
117
- }, this)
118
- ] }, void 0, true, {
119
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/NumberRangeFilter.tsx",
120
- lineNumber: 78,
121
- columnNumber: 7
122
- }, this),
123
- (minValue || maxValue) && /* @__PURE__ */ jsxDEV("div", { className: "text-xs text-gray-500", children: [
124
- minValue && maxValue && `${minValue} to ${maxValue}`,
125
- minValue && !maxValue && `≥ ${minValue}`,
126
- !minValue && maxValue && `≤ ${maxValue}`
127
- ] }, void 0, true, {
128
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/NumberRangeFilter.tsx",
129
- lineNumber: 103,
130
- columnNumber: 9
131
- }, this)
132
- ] }, void 0, true, {
133
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/components/filters/NumberRangeFilter.tsx",
55
+ return /* @__PURE__ */ React.createElement("div", { className: "space-y-1", __self: this, __source: {
56
+ fileName: _jsxFileName,
134
57
  lineNumber: 74,
135
58
  columnNumber: 5
136
- }, this);
59
+ } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
60
+ fileName: _jsxFileName,
61
+ lineNumber: 75,
62
+ columnNumber: 7
63
+ } }, formatFieldName(fieldName)), /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-2 gap-2", __self: this, __source: {
64
+ fileName: _jsxFileName,
65
+ lineNumber: 78,
66
+ columnNumber: 7
67
+ } }, /* @__PURE__ */ React.createElement("div", { __self: this, __source: {
68
+ fileName: _jsxFileName,
69
+ lineNumber: 79,
70
+ columnNumber: 9
71
+ } }, /* @__PURE__ */ React.createElement("label", { htmlFor: `${fieldName}-min`, className: "block text-xs text-gray-500 mb-1", __self: this, __source: {
72
+ fileName: _jsxFileName,
73
+ lineNumber: 80,
74
+ columnNumber: 11
75
+ } }, "Min"), /* @__PURE__ */ React.createElement("input", { id: `${fieldName}-min`, type: "number", step, value: minValue, onChange: (e) => handleMinChange(e.target.value), placeholder: "No minimum", className: "w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-green-web focus:border-green-web", __self: this, __source: {
76
+ fileName: _jsxFileName,
77
+ lineNumber: 81,
78
+ columnNumber: 11
79
+ } })), /* @__PURE__ */ React.createElement("div", { __self: this, __source: {
80
+ fileName: _jsxFileName,
81
+ lineNumber: 91,
82
+ columnNumber: 9
83
+ } }, /* @__PURE__ */ React.createElement("label", { htmlFor: `${fieldName}-max`, className: "block text-xs text-gray-500 mb-1", __self: this, __source: {
84
+ fileName: _jsxFileName,
85
+ lineNumber: 92,
86
+ columnNumber: 11
87
+ } }, "Max"), /* @__PURE__ */ React.createElement("input", { id: `${fieldName}-max`, type: "number", step, value: maxValue, onChange: (e) => handleMaxChange(e.target.value), placeholder: "No maximum", className: "w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-green-web focus:border-green-web", __self: this, __source: {
88
+ fileName: _jsxFileName,
89
+ lineNumber: 93,
90
+ columnNumber: 11
91
+ } }))), (minValue || maxValue) && /* @__PURE__ */ React.createElement("div", { className: "text-xs text-gray-500", __self: this, __source: {
92
+ fileName: _jsxFileName,
93
+ lineNumber: 105,
94
+ columnNumber: 9
95
+ } }, minValue && maxValue && `${minValue} to ${maxValue}`, minValue && !maxValue && `≥ ${minValue}`, !minValue && maxValue && `≤ ${maxValue}`));
137
96
  }
138
97
  export {
139
98
  NumberRangeFilter
@@ -9,10 +9,10 @@ export declare function RelationSearchInput({ searchTerm, onSearchChange, relate
9
9
  onSearchChange: (value: string) => void;
10
10
  relatedModelName: string;
11
11
  }>): import("react/jsx-runtime").JSX.Element;
12
- export declare function RelationItem({ item, onSelect }: {
12
+ export declare function RelationItem({ item, onSelect }: Readonly<{
13
13
  item: any;
14
14
  onSelect: (item: any) => void;
15
- }): import("react/jsx-runtime").JSX.Element;
15
+ }>): import("react/jsx-runtime").JSX.Element;
16
16
  export declare function RelationItemList({ items, loading, error, onSelect, onClear }: Readonly<{
17
17
  items: any[];
18
18
  loading: boolean;
@@ -20,7 +20,7 @@ export declare function RelationItemList({ items, loading, error, onSelect, onCl
20
20
  onSelect: (item: any) => void;
21
21
  onClear: () => void;
22
22
  }>): import("react/jsx-runtime").JSX.Element;
23
- export declare function RelationDropdownContent({ searchTerm, onSearchChange, relatedModelName, items, loading, error, onSelect, onClear }: {
23
+ export declare function RelationDropdownContent({ searchTerm, onSearchChange, relatedModelName, items, loading, error, onSelect, onClear }: Readonly<{
24
24
  searchTerm: string;
25
25
  onSearchChange: (value: string) => void;
26
26
  relatedModelName: string;
@@ -29,4 +29,4 @@ export declare function RelationDropdownContent({ searchTerm, onSearchChange, re
29
29
  error?: any;
30
30
  onSelect: (item: any) => void;
31
31
  onClear: () => void;
32
- }): import("react/jsx-runtime").JSX.Element;
32
+ }>): import("react/jsx-runtime").JSX.Element;