@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 +2 -0
- package/lib/components/RelationFieldWrapper.d.ts +9 -0
- package/lib/components/RelationFieldWrapper.js +63 -0
- package/lib/components/filters/DateRangeFilter.d.ts +1 -1
- package/lib/components/filters/DateRangeFilter.js +46 -83
- package/lib/components/filters/NumberRangeFilter.js +58 -99
- package/lib/components/filters/RelationComponents.d.ts +4 -4
- package/lib/components/filters/RelationComponents.js +97 -215
- package/lib/components/filters/RelationFilterField.js +50 -91
- package/lib/components/index.d.ts +1 -0
- package/lib/components/shared/AdminBreadcrumbs.js +40 -88
- package/lib/components/shared/AdminErrorStates.js +87 -141
- package/lib/components/shared/AdminStatusDisplay.js +28 -61
- package/lib/context/AdminDataContext.d.ts +1 -1
- package/lib/context/AdminDataContext.js +13 -9
- package/lib/hooks/useRelationData.d.ts +1 -1
- package/lib/hooks/useRelationData.js +3 -2
- package/lib/layouts/AdminDataLayout.js +184 -280
- package/lib/pages/AdminDataCreatePage.js +256 -403
- package/lib/pages/AdminDataEditPage.js +443 -702
- package/lib/pages/AdminDataIndexPage.js +53 -80
- package/lib/pages/AdminDataListPage.js +608 -1111
- package/lib/utils/graphql-utils.d.ts +1 -1
- package/lib/utils/graphql-utils.js +119 -24
- package/lib/utils/string-utils.js +3 -3
- package/package.json +3 -3
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 = {
|
|
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 = {
|
|
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__ */
|
|
39
|
-
|
|
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)
|
|
10
|
-
const maxValue = (currentValue == null ? void 0 : currentValue.lte)
|
|
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 = {
|
|
23
|
+
const newValue = {
|
|
24
|
+
...currentValue
|
|
25
|
+
};
|
|
24
26
|
const parsedValue = parseNumber(value);
|
|
25
|
-
if (parsedValue
|
|
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 = {
|
|
39
|
+
const newValue = {
|
|
40
|
+
...currentValue
|
|
41
|
+
};
|
|
38
42
|
const parsedValue = parseNumber(value);
|
|
39
|
-
if (parsedValue
|
|
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__ */
|
|
52
|
-
|
|
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;
|