@nestledjs/data-browser 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,315 +1,265 @@
1
- import { jsxDEV as e } from "react/jsx-dev-runtime";
2
- import { getPluralName as r } from "@nestledjs/helpers";
3
- import { useNavigate as M, useParams as C, Outlet as R } from "react-router";
4
- import { useState as x, useRef as B, useMemo as v } from "react";
5
- import { AdminLocalStorage as j } from "../utils/secure-storage.js";
6
- import { spacedWords as c, kebabCase as g } from "../utils/string-utils.js";
7
- import { useAdminDataContext as F } from "../context/AdminDataContext.js";
8
- function H() {
9
- const L = M(), b = C(), { databaseModels: h, basePath: P = "/admin/data" } = F(), [n, I] = x(!1), [d, y] = x(null), o = B(null), m = v(
10
- () => [...h].sort(
11
- (t, a) => r(c(t.name)).localeCompare(r(c(a.name)))
12
- ),
13
- [h]
14
- ), u = v(() => {
15
- const t = b.dataTypePlural;
16
- return t ? m.find((a) => g(r(a.name)).toLowerCase() === t.toLowerCase()) : null;
17
- }, [b.dataTypePlural, m]), k = (t) => {
18
- const a = t.target.value;
19
- if (a) {
20
- const s = m.find((l) => l.name === a);
21
- s && L(`${P}/${g(r(s.name))}`);
1
+ import { getPluralName } from "@nestledjs/helpers";
2
+ import { useNavigate, useParams, Outlet } from "react-router";
3
+ import { useState, useRef, useMemo } from "react";
4
+ import { AdminLocalStorage } from "../utils/secure-storage.js";
5
+ import { spacedWords, kebabCase } from "../utils/string-utils.js";
6
+ import { useAdminDataContext } from "../context/AdminDataContext.js";
7
+ var _jsxFileName = "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx";
8
+ function AdminDataLayout() {
9
+ const navigate = useNavigate();
10
+ const params = useParams();
11
+ const {
12
+ databaseModels,
13
+ basePath = "/admin/data"
14
+ } = useAdminDataContext();
15
+ const [isFullscreen, setIsFullscreen] = useState(false);
16
+ const [notification, setNotification] = useState(null);
17
+ const fileInputRef = useRef(null);
18
+ const sortedModels = useMemo(() => [...databaseModels].sort((a, b) => getPluralName(spacedWords(a.name)).localeCompare(getPluralName(spacedWords(b.name)))), [databaseModels]);
19
+ const currentModel = useMemo(() => {
20
+ const pluralParam = params.dataTypePlural;
21
+ if (!pluralParam) return null;
22
+ return sortedModels.find((m) => {
23
+ const modelUrlName = kebabCase(getPluralName(m.name));
24
+ return modelUrlName.toLowerCase() === pluralParam.toLowerCase();
25
+ });
26
+ }, [params.dataTypePlural, sortedModels]);
27
+ const handleModelChange = (event) => {
28
+ const selectedModelName = event.target.value;
29
+ if (selectedModelName) {
30
+ const selectedModel = sortedModels.find((m) => m.name === selectedModelName);
31
+ if (selectedModel) {
32
+ navigate(`${basePath}/${kebabCase(getPluralName(selectedModel.name))}`);
33
+ }
22
34
  }
23
- }, U = () => {
24
- I(!n);
25
- }, i = (t, a) => {
26
- y({ type: t, message: a }), setTimeout(() => y(null), 5e3);
27
- }, w = () => {
28
- const t = j.exportConfig();
29
- if (!t) {
30
- i("error", "Failed to export preferences");
35
+ };
36
+ const toggleFullscreen = () => {
37
+ setIsFullscreen(!isFullscreen);
38
+ };
39
+ const showNotification = (type, message) => {
40
+ setNotification({
41
+ type,
42
+ message
43
+ });
44
+ setTimeout(() => setNotification(null), 5e3);
45
+ };
46
+ const handleExport = () => {
47
+ const configJson = AdminLocalStorage.exportConfig();
48
+ if (!configJson) {
49
+ showNotification("error", "Failed to export preferences");
31
50
  return;
32
51
  }
33
- const a = new Blob([t], { type: "application/json" }), s = URL.createObjectURL(a), l = document.createElement("a");
34
- l.href = s, l.download = `admin-data-preferences-${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}.json`, document.body.appendChild(l), l.click(), document.body.removeChild(l), URL.revokeObjectURL(s), i("success", "Preferences exported successfully");
35
- }, A = (t) => {
36
- var l;
37
- const a = (l = t.target.files) == null ? void 0 : l[0];
38
- if (!a) return;
39
- const s = new FileReader();
40
- s.onload = (_) => {
41
- var p;
42
- const N = (p = _.target) == null ? void 0 : p.result;
43
- if (!N) {
44
- i("error", "Failed to read file");
52
+ const blob = new Blob([configJson], {
53
+ type: "application/json"
54
+ });
55
+ const url = URL.createObjectURL(blob);
56
+ const link = document.createElement("a");
57
+ link.href = url;
58
+ link.download = `admin-data-preferences-${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}.json`;
59
+ document.body.appendChild(link);
60
+ link.click();
61
+ document.body.removeChild(link);
62
+ URL.revokeObjectURL(url);
63
+ showNotification("success", "Preferences exported successfully");
64
+ };
65
+ const handleImport = (event) => {
66
+ var _a;
67
+ const file = (_a = event.target.files) == null ? void 0 : _a[0];
68
+ if (!file) return;
69
+ const reader = new FileReader();
70
+ reader.onload = (e) => {
71
+ var _a2;
72
+ const content2 = (_a2 = e.target) == null ? void 0 : _a2.result;
73
+ if (!content2) {
74
+ showNotification("error", "Failed to read file");
45
75
  return;
46
76
  }
47
- j.importConfig(N) ? (i("success", "Preferences imported successfully. Refreshing..."), setTimeout(() => window.location.reload(), 1500)) : i("error", "Invalid preferences file");
48
- }, s.onerror = () => {
49
- i("error", "Failed to read file");
50
- }, s.readAsText(a), o.current && (o.current.value = "");
51
- }, D = () => {
52
- var t;
53
- (t = o.current) == null || t.click();
54
- }, f = /* @__PURE__ */ e("div", { className: "max-w-full mx-auto flex flex-col", children: [
55
- d && /* @__PURE__ */ e("div", { className: `mb-4 px-4 py-3 rounded-md border ${d.type === "success" ? "bg-green-50 border-green-200 text-green-800 dark:bg-green-900/20 dark:border-green-800 dark:text-green-200" : "bg-red-50 border-red-200 text-red-800 dark:bg-red-900/20 dark:border-red-800 dark:text-red-200"}`, children: /* @__PURE__ */ e("div", { className: "flex items-center", children: [
56
- d.type === "success" ? /* @__PURE__ */ e("svg", { className: "w-5 h-5 mr-2", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ e("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }, void 0, !1, {
57
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
58
- lineNumber: 133,
59
- columnNumber: 17
60
- }, this) }, void 0, !1, {
61
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
62
- lineNumber: 132,
63
- columnNumber: 15
64
- }, this) : /* @__PURE__ */ e("svg", { className: "w-5 h-5 mr-2", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ e("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z", clipRule: "evenodd" }, void 0, !1, {
65
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
66
- lineNumber: 137,
67
- columnNumber: 17
68
- }, this) }, void 0, !1, {
69
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
70
- lineNumber: 136,
71
- columnNumber: 15
72
- }, this),
73
- /* @__PURE__ */ e("span", { className: "text-sm font-medium", children: d.message }, void 0, !1, {
74
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
75
- lineNumber: 140,
76
- columnNumber: 13
77
- }, this)
78
- ] }, void 0, !0, {
79
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
80
- lineNumber: 130,
81
- columnNumber: 11
82
- }, this) }, void 0, !1, {
83
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
84
- lineNumber: 125,
85
- columnNumber: 9
86
- }, this),
87
- /* @__PURE__ */ e("div", { className: "mb-6 space-y-3", children: [
88
- /* @__PURE__ */ e("div", { className: "flex items-end gap-3", children: [
89
- /* @__PURE__ */ e("div", { className: "flex-1", children: [
90
- /* @__PURE__ */ e("label", { htmlFor: "model-selector", className: "block text-sm font-medium text-gray-900 dark:text-gray-100 mb-2", children: "Select Model" }, void 0, !1, {
91
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
92
- lineNumber: 149,
93
- columnNumber: 13
94
- }, this),
95
- /* @__PURE__ */ e("div", { className: "relative", children: [
96
- /* @__PURE__ */ e(
97
- "select",
98
- {
99
- id: "model-selector",
100
- value: (u == null ? void 0 : u.name) || "",
101
- onChange: k,
102
- className: "w-full h-[50px] pl-4 pr-10 py-3 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-green-web focus:border-green-web text-base appearance-none cursor-pointer",
103
- children: [
104
- /* @__PURE__ */ e("option", { value: "", children: "Choose a model..." }, void 0, !1, {
105
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
106
- lineNumber: 159,
107
- columnNumber: 17
108
- }, this),
109
- m.map((t) => /* @__PURE__ */ e("option", { value: t.name, children: r(c(t.name)) }, t.name, !1, {
110
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
111
- lineNumber: 161,
112
- columnNumber: 19
113
- }, this))
114
- ]
115
- },
116
- void 0,
117
- !0,
118
- {
119
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
120
- lineNumber: 153,
121
- columnNumber: 15
122
- },
123
- this
124
- ),
125
- /* @__PURE__ */ e("div", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3", children: /* @__PURE__ */ e("svg", { className: "h-5 w-5 text-gray-400", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ e("path", { fillRule: "evenodd", d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z", clipRule: "evenodd" }, void 0, !1, {
126
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
127
- lineNumber: 169,
128
- columnNumber: 19
129
- }, this) }, void 0, !1, {
130
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
131
- lineNumber: 168,
132
- columnNumber: 17
133
- }, this) }, void 0, !1, {
134
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
135
- lineNumber: 167,
136
- columnNumber: 15
137
- }, this)
138
- ] }, void 0, !0, {
139
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
140
- lineNumber: 152,
141
- columnNumber: 13
142
- }, this)
143
- ] }, void 0, !0, {
144
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
145
- lineNumber: 148,
146
- columnNumber: 11
147
- }, this),
148
- /* @__PURE__ */ e(
149
- "button",
150
- {
151
- onClick: U,
152
- className: "h-[50px] px-4 py-3 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-green-web focus:border-green-web transition-colors",
153
- title: n ? "Exit fullscreen" : "Enter fullscreen",
154
- children: n ? /* @__PURE__ */ e("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 9V4.5M9 9H4.5M9 9L3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5l5.25 5.25" }, void 0, !1, {
155
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
156
- lineNumber: 183,
157
- columnNumber: 17
158
- }, this) }, void 0, !1, {
159
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
160
- lineNumber: 182,
161
- columnNumber: 15
162
- }, this) : /* @__PURE__ */ e("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4" }, void 0, !1, {
163
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
164
- lineNumber: 187,
165
- columnNumber: 17
166
- }, this) }, void 0, !1, {
167
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
168
- lineNumber: 186,
169
- columnNumber: 15
170
- }, this)
171
- },
172
- void 0,
173
- !1,
174
- {
175
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
176
- lineNumber: 176,
177
- columnNumber: 11
178
- },
179
- this
180
- )
181
- ] }, void 0, !0, {
182
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
183
- lineNumber: 147,
184
- columnNumber: 9
185
- }, this),
186
- /* @__PURE__ */ e("div", { className: "flex items-center gap-2 text-sm", children: [
187
- /* @__PURE__ */ e("span", { className: "text-gray-600 dark:text-gray-400", children: "Preferences:" }, void 0, !1, {
188
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
189
- lineNumber: 195,
190
- columnNumber: 11
191
- }, this),
192
- /* @__PURE__ */ e(
193
- "button",
194
- {
195
- onClick: w,
196
- className: "inline-flex items-center px-3 py-1.5 text-gray-700 dark:text-gray-300 hover:text-green-web dark:hover:text-green-web transition-colors",
197
- title: "Export your preferences to a file",
198
- children: [
199
- /* @__PURE__ */ e("svg", { className: "w-4 h-4 mr-1.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" }, void 0, !1, {
200
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
201
- lineNumber: 202,
202
- columnNumber: 15
203
- }, this) }, void 0, !1, {
204
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
205
- lineNumber: 201,
206
- columnNumber: 13
207
- }, this),
208
- "Export"
209
- ]
210
- },
211
- void 0,
212
- !0,
213
- {
214
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
215
- lineNumber: 196,
216
- columnNumber: 11
217
- },
218
- this
219
- ),
220
- /* @__PURE__ */ e("span", { className: "text-gray-300 dark:text-gray-600", children: "|" }, void 0, !1, {
221
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
222
- lineNumber: 206,
223
- columnNumber: 11
224
- }, this),
225
- /* @__PURE__ */ e(
226
- "button",
227
- {
228
- onClick: D,
229
- className: "inline-flex items-center px-3 py-1.5 text-gray-700 dark:text-gray-300 hover:text-green-web dark:hover:text-green-web transition-colors",
230
- title: "Import preferences from a file",
231
- children: [
232
- /* @__PURE__ */ e("svg", { className: "w-4 h-4 mr-1.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12" }, void 0, !1, {
233
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
234
- lineNumber: 213,
235
- columnNumber: 15
236
- }, this) }, void 0, !1, {
237
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
238
- lineNumber: 212,
239
- columnNumber: 13
240
- }, this),
241
- "Import"
242
- ]
243
- },
244
- void 0,
245
- !0,
246
- {
247
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
248
- lineNumber: 207,
249
- columnNumber: 11
250
- },
251
- this
252
- ),
253
- /* @__PURE__ */ e(
254
- "input",
255
- {
256
- ref: o,
257
- type: "file",
258
- accept: "application/json,.json",
259
- onChange: A,
260
- className: "hidden"
261
- },
262
- void 0,
263
- !1,
264
- {
265
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
266
- lineNumber: 217,
267
- columnNumber: 11
268
- },
269
- this
270
- )
271
- ] }, void 0, !0, {
272
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
273
- lineNumber: 194,
274
- columnNumber: 9
275
- }, this)
276
- ] }, void 0, !0, {
277
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
278
- lineNumber: 146,
279
- columnNumber: 7
280
- }, this),
281
- /* @__PURE__ */ e("div", { children: /* @__PURE__ */ e(R, {}, void 0, !1, {
282
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
283
- lineNumber: 229,
284
- columnNumber: 9
285
- }, this) }, void 0, !1, {
286
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
287
- lineNumber: 228,
288
- columnNumber: 7
289
- }, this)
290
- ] }, void 0, !0, {
291
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
77
+ const success = AdminLocalStorage.importConfig(content2);
78
+ if (success) {
79
+ showNotification("success", "Preferences imported successfully. Refreshing...");
80
+ setTimeout(() => window.location.reload(), 1500);
81
+ } else {
82
+ showNotification("error", "Invalid preferences file");
83
+ }
84
+ };
85
+ reader.onerror = () => {
86
+ showNotification("error", "Failed to read file");
87
+ };
88
+ reader.readAsText(file);
89
+ if (fileInputRef.current) {
90
+ fileInputRef.current.value = "";
91
+ }
92
+ };
93
+ const triggerImport = () => {
94
+ var _a;
95
+ (_a = fileInputRef.current) == null ? void 0 : _a.click();
96
+ };
97
+ const content = /* @__PURE__ */ React.createElement("div", { className: "max-w-full mx-auto flex flex-col", __self: this, __source: {
98
+ fileName: _jsxFileName,
292
99
  lineNumber: 122,
293
100
  columnNumber: 5
294
- }, this);
295
- return n ? /* @__PURE__ */ e("div", { className: "fixed inset-0 z-50 bg-white dark:bg-gray-900 flex flex-col", children: /* @__PURE__ */ e("div", { className: "w-full p-6 md:p-8 lg:p-12", children: f }, void 0, !1, {
296
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
297
- lineNumber: 237,
101
+ } }, notification && /* @__PURE__ */ React.createElement("div", { className: `mb-4 px-4 py-3 rounded-md border ${notification.type === "success" ? "bg-green-50 border-green-200 text-green-800 dark:bg-green-900/20 dark:border-green-800 dark:text-green-200" : "bg-red-50 border-red-200 text-red-800 dark:bg-red-900/20 dark:border-red-800 dark:text-red-200"}`, __self: this, __source: {
102
+ fileName: _jsxFileName,
103
+ lineNumber: 125,
298
104
  columnNumber: 9
299
- }, this) }, void 0, !1, {
300
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
301
- lineNumber: 236,
105
+ } }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center", __self: this, __source: {
106
+ fileName: _jsxFileName,
107
+ lineNumber: 130,
108
+ columnNumber: 11
109
+ } }, notification.type === "success" ? /* @__PURE__ */ React.createElement("svg", { className: "w-5 h-5 mr-2", fill: "currentColor", viewBox: "0 0 20 20", __self: this, __source: {
110
+ fileName: _jsxFileName,
111
+ lineNumber: 132,
112
+ columnNumber: 15
113
+ } }, /* @__PURE__ */ React.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd", __self: this, __source: {
114
+ fileName: _jsxFileName,
115
+ lineNumber: 133,
116
+ columnNumber: 17
117
+ } })) : /* @__PURE__ */ React.createElement("svg", { className: "w-5 h-5 mr-2", fill: "currentColor", viewBox: "0 0 20 20", __self: this, __source: {
118
+ fileName: _jsxFileName,
119
+ lineNumber: 136,
120
+ columnNumber: 15
121
+ } }, /* @__PURE__ */ React.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z", clipRule: "evenodd", __self: this, __source: {
122
+ fileName: _jsxFileName,
123
+ lineNumber: 137,
124
+ columnNumber: 17
125
+ } })), /* @__PURE__ */ React.createElement("span", { className: "text-sm font-medium", __self: this, __source: {
126
+ fileName: _jsxFileName,
127
+ lineNumber: 140,
128
+ columnNumber: 13
129
+ } }, notification.message))), /* @__PURE__ */ React.createElement("div", { className: "mb-6 space-y-3", __self: this, __source: {
130
+ fileName: _jsxFileName,
131
+ lineNumber: 146,
302
132
  columnNumber: 7
303
- }, this) : /* @__PURE__ */ e("div", { className: "flex flex-col", children: /* @__PURE__ */ e("main", { className: "w-full p-6 md:p-8 lg:p-12", children: f }, void 0, !1, {
304
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
305
- lineNumber: 246,
133
+ } }, /* @__PURE__ */ React.createElement("div", { className: "flex items-end gap-3", __self: this, __source: {
134
+ fileName: _jsxFileName,
135
+ lineNumber: 147,
136
+ columnNumber: 9
137
+ } }, /* @__PURE__ */ React.createElement("div", { className: "flex-1", __self: this, __source: {
138
+ fileName: _jsxFileName,
139
+ lineNumber: 148,
140
+ columnNumber: 11
141
+ } }, /* @__PURE__ */ React.createElement("label", { htmlFor: "model-selector", className: "block text-sm font-medium text-gray-900 dark:text-gray-100 mb-2", __self: this, __source: {
142
+ fileName: _jsxFileName,
143
+ lineNumber: 149,
144
+ columnNumber: 13
145
+ } }, "Select Model"), /* @__PURE__ */ React.createElement("div", { className: "relative", __self: this, __source: {
146
+ fileName: _jsxFileName,
147
+ lineNumber: 152,
148
+ columnNumber: 13
149
+ } }, /* @__PURE__ */ React.createElement("select", { id: "model-selector", value: (currentModel == null ? void 0 : currentModel.name) || "", onChange: handleModelChange, className: "w-full h-[50px] pl-4 pr-10 py-3 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-green-web focus:border-green-web text-base appearance-none cursor-pointer", __self: this, __source: {
150
+ fileName: _jsxFileName,
151
+ lineNumber: 153,
152
+ columnNumber: 15
153
+ } }, /* @__PURE__ */ React.createElement("option", { value: "", __self: this, __source: {
154
+ fileName: _jsxFileName,
155
+ lineNumber: 159,
156
+ columnNumber: 17
157
+ } }, "Choose a model..."), sortedModels.map((model) => /* @__PURE__ */ React.createElement("option", { key: model.name, value: model.name, __self: this, __source: {
158
+ fileName: _jsxFileName,
159
+ lineNumber: 161,
160
+ columnNumber: 19
161
+ } }, getPluralName(spacedWords(model.name))))), /* @__PURE__ */ React.createElement("div", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3", __self: this, __source: {
162
+ fileName: _jsxFileName,
163
+ lineNumber: 167,
164
+ columnNumber: 15
165
+ } }, /* @__PURE__ */ React.createElement("svg", { className: "h-5 w-5 text-gray-400", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", __self: this, __source: {
166
+ fileName: _jsxFileName,
167
+ lineNumber: 168,
168
+ columnNumber: 17
169
+ } }, /* @__PURE__ */ React.createElement("path", { fillRule: "evenodd", d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z", clipRule: "evenodd", __self: this, __source: {
170
+ fileName: _jsxFileName,
171
+ lineNumber: 169,
172
+ columnNumber: 19
173
+ } }))))), /* @__PURE__ */ React.createElement("button", { onClick: toggleFullscreen, className: "h-[50px] px-4 py-3 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-green-web focus:border-green-web transition-colors", title: isFullscreen ? "Exit fullscreen" : "Enter fullscreen", __self: this, __source: {
174
+ fileName: _jsxFileName,
175
+ lineNumber: 176,
176
+ columnNumber: 11
177
+ } }, isFullscreen ? /* @__PURE__ */ React.createElement("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", __self: this, __source: {
178
+ fileName: _jsxFileName,
179
+ lineNumber: 182,
180
+ columnNumber: 15
181
+ } }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 9V4.5M9 9H4.5M9 9L3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5l5.25 5.25", __self: this, __source: {
182
+ fileName: _jsxFileName,
183
+ lineNumber: 183,
184
+ columnNumber: 17
185
+ } })) : /* @__PURE__ */ React.createElement("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", __self: this, __source: {
186
+ fileName: _jsxFileName,
187
+ lineNumber: 186,
188
+ columnNumber: 15
189
+ } }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4", __self: this, __source: {
190
+ fileName: _jsxFileName,
191
+ lineNumber: 187,
192
+ columnNumber: 17
193
+ } })))), /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2 text-sm", __self: this, __source: {
194
+ fileName: _jsxFileName,
195
+ lineNumber: 194,
196
+ columnNumber: 9
197
+ } }, /* @__PURE__ */ React.createElement("span", { className: "text-gray-600 dark:text-gray-400", __self: this, __source: {
198
+ fileName: _jsxFileName,
199
+ lineNumber: 195,
200
+ columnNumber: 11
201
+ } }, "Preferences:"), /* @__PURE__ */ React.createElement("button", { onClick: handleExport, className: "inline-flex items-center px-3 py-1.5 text-gray-700 dark:text-gray-300 hover:text-green-web dark:hover:text-green-web transition-colors", title: "Export your preferences to a file", __self: this, __source: {
202
+ fileName: _jsxFileName,
203
+ lineNumber: 196,
204
+ columnNumber: 11
205
+ } }, /* @__PURE__ */ React.createElement("svg", { className: "w-4 h-4 mr-1.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", __self: this, __source: {
206
+ fileName: _jsxFileName,
207
+ lineNumber: 201,
208
+ columnNumber: 13
209
+ } }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4", __self: this, __source: {
210
+ fileName: _jsxFileName,
211
+ lineNumber: 202,
212
+ columnNumber: 15
213
+ } })), "Export"), /* @__PURE__ */ React.createElement("span", { className: "text-gray-300 dark:text-gray-600", __self: this, __source: {
214
+ fileName: _jsxFileName,
215
+ lineNumber: 206,
216
+ columnNumber: 11
217
+ } }, "|"), /* @__PURE__ */ React.createElement("button", { onClick: triggerImport, className: "inline-flex items-center px-3 py-1.5 text-gray-700 dark:text-gray-300 hover:text-green-web dark:hover:text-green-web transition-colors", title: "Import preferences from a file", __self: this, __source: {
218
+ fileName: _jsxFileName,
219
+ lineNumber: 207,
220
+ columnNumber: 11
221
+ } }, /* @__PURE__ */ React.createElement("svg", { className: "w-4 h-4 mr-1.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", __self: this, __source: {
222
+ fileName: _jsxFileName,
223
+ lineNumber: 212,
224
+ columnNumber: 13
225
+ } }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12", __self: this, __source: {
226
+ fileName: _jsxFileName,
227
+ lineNumber: 213,
228
+ columnNumber: 15
229
+ } })), "Import"), /* @__PURE__ */ React.createElement("input", { ref: fileInputRef, type: "file", accept: "application/json,.json", onChange: handleImport, className: "hidden", __self: this, __source: {
230
+ fileName: _jsxFileName,
231
+ lineNumber: 217,
232
+ columnNumber: 11
233
+ } }))), /* @__PURE__ */ React.createElement("div", { __self: this, __source: {
234
+ fileName: _jsxFileName,
235
+ lineNumber: 228,
306
236
  columnNumber: 7
307
- }, this) }, void 0, !1, {
308
- fileName: "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/layouts/AdminDataLayout.tsx",
237
+ } }, /* @__PURE__ */ React.createElement(Outlet, { __self: this, __source: {
238
+ fileName: _jsxFileName,
239
+ lineNumber: 229,
240
+ columnNumber: 9
241
+ } })));
242
+ if (isFullscreen) {
243
+ return /* @__PURE__ */ React.createElement("div", { className: "fixed inset-0 z-50 bg-white dark:bg-gray-900 flex flex-col", __self: this, __source: {
244
+ fileName: _jsxFileName,
245
+ lineNumber: 236,
246
+ columnNumber: 7
247
+ } }, /* @__PURE__ */ React.createElement("div", { className: "w-full p-6 md:p-8 lg:p-12", __self: this, __source: {
248
+ fileName: _jsxFileName,
249
+ lineNumber: 237,
250
+ columnNumber: 9
251
+ } }, content));
252
+ }
253
+ return /* @__PURE__ */ React.createElement("div", { className: "flex flex-col", __self: this, __source: {
254
+ fileName: _jsxFileName,
309
255
  lineNumber: 245,
310
256
  columnNumber: 5
311
- }, this);
257
+ } }, /* @__PURE__ */ React.createElement("main", { className: "w-full p-6 md:p-8 lg:p-12", __self: this, __source: {
258
+ fileName: _jsxFileName,
259
+ lineNumber: 246,
260
+ columnNumber: 7
261
+ } }, content));
312
262
  }
313
263
  export {
314
- H as AdminDataLayout
264
+ AdminDataLayout
315
265
  };