dn-react-router-toolkit 0.4.4 → 0.5.1

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 (95) hide show
  1. package/dist/api/create_api_handler.d.mts +28 -0
  2. package/dist/api/create_api_handler.d.ts +28 -0
  3. package/dist/api/create_api_handler.js +148 -0
  4. package/dist/api/create_api_handler.mjs +132 -0
  5. package/dist/api/create_handler.js +27 -25
  6. package/dist/api/create_handler.mjs +27 -25
  7. package/dist/api/index.js +27 -25
  8. package/dist/api/index.mjs +27 -25
  9. package/dist/api/item_api_handler.d.mts +18 -0
  10. package/dist/api/item_api_handler.d.ts +18 -0
  11. package/dist/api/item_api_handler.js +55 -0
  12. package/dist/api/item_api_handler.mjs +30 -0
  13. package/dist/auth/index.d.mts +1 -2
  14. package/dist/auth/index.d.ts +1 -2
  15. package/dist/auth/index.js +13 -21
  16. package/dist/auth/index.mjs +12 -20
  17. package/dist/auth/with_auth.d.mts +3 -3
  18. package/dist/auth/with_auth.d.ts +3 -3
  19. package/dist/auth/with_auth.js +13 -21
  20. package/dist/auth/with_auth.mjs +12 -20
  21. package/dist/crud/crud_form.d.mts +13 -0
  22. package/dist/crud/crud_form.d.ts +13 -0
  23. package/dist/crud/crud_form.js +88 -0
  24. package/dist/crud/crud_form.mjs +55 -0
  25. package/dist/crud/crud_form_provider.d.mts +34 -0
  26. package/dist/crud/crud_form_provider.d.ts +34 -0
  27. package/dist/crud/crud_form_provider.js +160 -0
  28. package/dist/crud/crud_form_provider.mjs +124 -0
  29. package/dist/crud/crud_loader.d.mts +21 -0
  30. package/dist/crud/crud_loader.d.ts +21 -0
  31. package/dist/crud/crud_loader.js +288 -0
  32. package/dist/crud/crud_loader.mjs +273 -0
  33. package/dist/crud/crud_page.d.mts +25 -0
  34. package/dist/crud/crud_page.d.ts +25 -0
  35. package/dist/crud/crud_page.js +645 -0
  36. package/dist/crud/crud_page.mjs +616 -0
  37. package/dist/crud/generate_handlers.d.mts +15 -0
  38. package/dist/crud/generate_handlers.d.ts +15 -0
  39. package/dist/crud/generate_handlers.js +39 -0
  40. package/dist/crud/generate_handlers.mjs +14 -0
  41. package/dist/crud/generate_pages.d.mts +11 -0
  42. package/dist/crud/generate_pages.d.ts +11 -0
  43. package/dist/crud/generate_pages.js +52 -0
  44. package/dist/crud/generate_pages.mjs +17 -0
  45. package/dist/crud/generate_routes.d.mts +5 -0
  46. package/dist/crud/generate_routes.d.ts +5 -0
  47. package/dist/crud/generate_routes.js +62 -0
  48. package/dist/crud/generate_routes.mjs +27 -0
  49. package/dist/crud/index.d.mts +21 -0
  50. package/dist/crud/index.d.ts +21 -0
  51. package/dist/crud/index.js +970 -0
  52. package/dist/crud/index.mjs +945 -0
  53. package/dist/db/index.d.mts +4 -0
  54. package/dist/db/index.d.ts +4 -0
  55. package/dist/db/index.js +46 -0
  56. package/dist/db/index.mjs +8 -0
  57. package/dist/index.d.mts +3 -2
  58. package/dist/index.d.ts +3 -2
  59. package/dist/seo/index.js +26 -25
  60. package/dist/seo/index.mjs +27 -26
  61. package/dist/seo/seo.js +26 -25
  62. package/dist/seo/seo.mjs +27 -26
  63. package/dist/table/buttons.d.mts +10 -0
  64. package/dist/table/buttons.d.ts +10 -0
  65. package/dist/table/buttons.js +102 -0
  66. package/dist/table/buttons.mjs +71 -0
  67. package/dist/table/index.d.mts +9 -0
  68. package/dist/table/index.d.ts +9 -0
  69. package/dist/table/index.js +570 -0
  70. package/dist/table/index.mjs +543 -0
  71. package/dist/table/item_loader.d.mts +12 -0
  72. package/dist/table/item_loader.d.ts +12 -0
  73. package/dist/table/item_loader.js +51 -0
  74. package/dist/table/item_loader.mjs +26 -0
  75. package/dist/table/loader.d.mts +28 -0
  76. package/dist/table/loader.d.ts +28 -0
  77. package/dist/table/loader.js +70 -0
  78. package/dist/table/loader.mjs +48 -0
  79. package/dist/table/page.d.mts +27 -0
  80. package/dist/table/page.d.ts +27 -0
  81. package/dist/table/page.js +444 -0
  82. package/dist/table/page.mjs +415 -0
  83. package/dist/table/repository.d.mts +38 -0
  84. package/dist/table/repository.d.ts +38 -0
  85. package/dist/table/repository.js +76 -0
  86. package/dist/table/repository.mjs +56 -0
  87. package/dist/table/table.d.mts +27 -0
  88. package/dist/table/table.d.ts +27 -0
  89. package/dist/table/table.js +290 -0
  90. package/dist/table/table.mjs +255 -0
  91. package/package.json +21 -3
  92. package/dist/auth/temp_user.d.mts +0 -5
  93. package/dist/auth/temp_user.d.ts +0 -5
  94. package/dist/auth/temp_user.js +0 -18
  95. package/dist/auth/temp_user.mjs +0 -0
@@ -0,0 +1,645 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/crud/crud_page.tsx
31
+ var crud_page_exports = {};
32
+ __export(crud_page_exports, {
33
+ crudPage: () => crudPage
34
+ });
35
+ module.exports = __toCommonJS(crud_page_exports);
36
+ var import_react_router5 = require("react-router");
37
+
38
+ // src/crud/crud_form_provider.tsx
39
+ var import_react_router = require("react-router");
40
+ var import_store = require("dn-react-toolkit/store");
41
+ var import_react = require("react");
42
+ var import_react2 = __toESM(require("react"));
43
+ var FormContext = (0, import_react.createContext)({});
44
+ function useFormContext() {
45
+ return (0, import_react.useContext)(FormContext);
46
+ }
47
+ function CrudFormProvider({
48
+ primaryKey = "id",
49
+ name,
50
+ prefix,
51
+ item,
52
+ columns = {},
53
+ children
54
+ }) {
55
+ const apiPrefix = `/api${prefix}`;
56
+ const store = (0, import_store.useStore)({
57
+ ...item || {}
58
+ });
59
+ const navigate = (0, import_react_router.useNavigate)();
60
+ const submit = async () => {
61
+ const res = await fetch(apiPrefix, {
62
+ method: "POST",
63
+ headers: {
64
+ "Content-Type": "application/json"
65
+ },
66
+ body: JSON.stringify(
67
+ Object.entries(store.state).reduce(
68
+ function reducer(acc, [key, value]) {
69
+ const converter = (value2) => {
70
+ if (value2 === void 0) {
71
+ return void 0;
72
+ }
73
+ if (value2 === null) {
74
+ return {
75
+ type: "null",
76
+ value: null
77
+ };
78
+ }
79
+ if (typeof value2 === "string") {
80
+ return {
81
+ type: "string",
82
+ value: value2
83
+ };
84
+ }
85
+ if (typeof value2 === "number") {
86
+ return {
87
+ type: "number",
88
+ value: value2
89
+ };
90
+ }
91
+ if (typeof value2 === "boolean") {
92
+ return {
93
+ type: "boolean",
94
+ value: value2
95
+ };
96
+ }
97
+ if (value2 instanceof Date) {
98
+ return {
99
+ type: "date",
100
+ value: value2.toISOString()
101
+ };
102
+ }
103
+ if (Array.isArray(value2)) {
104
+ return value2.map((v) => converter(v));
105
+ }
106
+ if (typeof value2 === "object") {
107
+ return Object.entries(
108
+ value2
109
+ ).reduce(reducer, {});
110
+ }
111
+ };
112
+ return {
113
+ ...acc,
114
+ [key]: converter(value)
115
+ };
116
+ },
117
+ {}
118
+ )
119
+ )
120
+ });
121
+ if (!res.ok) {
122
+ const { message } = await res.json();
123
+ alert(message);
124
+ return;
125
+ }
126
+ alert(`${name}\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.`);
127
+ const { id } = await res.json();
128
+ navigate(`${prefix}/${id}`);
129
+ };
130
+ const deleteItem = async () => {
131
+ if (!item || !primaryKey) {
132
+ return;
133
+ }
134
+ const ok = confirm("\uC815\uB9D0\uB85C \uC0AD\uC81C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?");
135
+ if (!ok) {
136
+ return;
137
+ }
138
+ const res = await fetch(`${apiPrefix}/${item[primaryKey]}`, {
139
+ method: "DELETE"
140
+ });
141
+ if (!res.ok) {
142
+ const { message } = await res.json();
143
+ alert(message);
144
+ return;
145
+ }
146
+ alert(`${name}\uB97C \uC0AD\uC81C\uD588\uC2B5\uB2C8\uB2E4.`);
147
+ navigate(`${prefix}`);
148
+ };
149
+ return /* @__PURE__ */ import_react2.default.createElement(
150
+ FormContext.Provider,
151
+ {
152
+ value: { name, item, store, submit, delete: deleteItem, columns }
153
+ },
154
+ children
155
+ );
156
+ }
157
+
158
+ // src/table/page.tsx
159
+ var import_react_router4 = require("react-router");
160
+
161
+ // node_modules/react-icons/lib/iconBase.mjs
162
+ var import_react4 = __toESM(require("react"), 1);
163
+
164
+ // node_modules/react-icons/lib/iconContext.mjs
165
+ var import_react3 = __toESM(require("react"), 1);
166
+ var DefaultContext = {
167
+ color: void 0,
168
+ size: void 0,
169
+ className: void 0,
170
+ style: void 0,
171
+ attr: void 0
172
+ };
173
+ var IconContext = import_react3.default.createContext && /* @__PURE__ */ import_react3.default.createContext(DefaultContext);
174
+
175
+ // node_modules/react-icons/lib/iconBase.mjs
176
+ var _excluded = ["attr", "size", "title"];
177
+ function _objectWithoutProperties(source, excluded) {
178
+ if (source == null) return {};
179
+ var target = _objectWithoutPropertiesLoose(source, excluded);
180
+ var key, i;
181
+ if (Object.getOwnPropertySymbols) {
182
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
183
+ for (i = 0; i < sourceSymbolKeys.length; i++) {
184
+ key = sourceSymbolKeys[i];
185
+ if (excluded.indexOf(key) >= 0) continue;
186
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
187
+ target[key] = source[key];
188
+ }
189
+ }
190
+ return target;
191
+ }
192
+ function _objectWithoutPropertiesLoose(source, excluded) {
193
+ if (source == null) return {};
194
+ var target = {};
195
+ for (var key in source) {
196
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
197
+ if (excluded.indexOf(key) >= 0) continue;
198
+ target[key] = source[key];
199
+ }
200
+ }
201
+ return target;
202
+ }
203
+ function _extends() {
204
+ _extends = Object.assign ? Object.assign.bind() : function(target) {
205
+ for (var i = 1; i < arguments.length; i++) {
206
+ var source = arguments[i];
207
+ for (var key in source) {
208
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
209
+ target[key] = source[key];
210
+ }
211
+ }
212
+ }
213
+ return target;
214
+ };
215
+ return _extends.apply(this, arguments);
216
+ }
217
+ function ownKeys(e, r) {
218
+ var t = Object.keys(e);
219
+ if (Object.getOwnPropertySymbols) {
220
+ var o = Object.getOwnPropertySymbols(e);
221
+ r && (o = o.filter(function(r2) {
222
+ return Object.getOwnPropertyDescriptor(e, r2).enumerable;
223
+ })), t.push.apply(t, o);
224
+ }
225
+ return t;
226
+ }
227
+ function _objectSpread(e) {
228
+ for (var r = 1; r < arguments.length; r++) {
229
+ var t = null != arguments[r] ? arguments[r] : {};
230
+ r % 2 ? ownKeys(Object(t), true).forEach(function(r2) {
231
+ _defineProperty(e, r2, t[r2]);
232
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r2) {
233
+ Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2));
234
+ });
235
+ }
236
+ return e;
237
+ }
238
+ function _defineProperty(obj, key, value) {
239
+ key = _toPropertyKey(key);
240
+ if (key in obj) {
241
+ Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
242
+ } else {
243
+ obj[key] = value;
244
+ }
245
+ return obj;
246
+ }
247
+ function _toPropertyKey(t) {
248
+ var i = _toPrimitive(t, "string");
249
+ return "symbol" == typeof i ? i : i + "";
250
+ }
251
+ function _toPrimitive(t, r) {
252
+ if ("object" != typeof t || !t) return t;
253
+ var e = t[Symbol.toPrimitive];
254
+ if (void 0 !== e) {
255
+ var i = e.call(t, r || "default");
256
+ if ("object" != typeof i) return i;
257
+ throw new TypeError("@@toPrimitive must return a primitive value.");
258
+ }
259
+ return ("string" === r ? String : Number)(t);
260
+ }
261
+ function Tree2Element(tree) {
262
+ return tree && tree.map((node, i) => /* @__PURE__ */ import_react4.default.createElement(node.tag, _objectSpread({
263
+ key: i
264
+ }, node.attr), Tree2Element(node.child)));
265
+ }
266
+ function GenIcon(data) {
267
+ return (props) => /* @__PURE__ */ import_react4.default.createElement(IconBase, _extends({
268
+ attr: _objectSpread({}, data.attr)
269
+ }, props), Tree2Element(data.child));
270
+ }
271
+ function IconBase(props) {
272
+ var elem = (conf) => {
273
+ var {
274
+ attr,
275
+ size,
276
+ title
277
+ } = props, svgProps = _objectWithoutProperties(props, _excluded);
278
+ var computedSize = size || conf.size || "1em";
279
+ var className;
280
+ if (conf.className) className = conf.className;
281
+ if (props.className) className = (className ? className + " " : "") + props.className;
282
+ return /* @__PURE__ */ import_react4.default.createElement("svg", _extends({
283
+ stroke: "currentColor",
284
+ fill: "currentColor",
285
+ strokeWidth: "0"
286
+ }, conf.attr, attr, svgProps, {
287
+ className,
288
+ style: _objectSpread(_objectSpread({
289
+ color: props.color || conf.color
290
+ }, conf.style), props.style),
291
+ height: computedSize,
292
+ width: computedSize,
293
+ xmlns: "http://www.w3.org/2000/svg"
294
+ }), title && /* @__PURE__ */ import_react4.default.createElement("title", null, title), props.children);
295
+ };
296
+ return IconContext !== void 0 ? /* @__PURE__ */ import_react4.default.createElement(IconContext.Consumer, null, (conf) => elem(conf)) : elem(DefaultContext);
297
+ }
298
+
299
+ // node_modules/react-icons/go/index.mjs
300
+ function GoArrowDown(props) {
301
+ return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24" }, "child": [{ "tag": "path", "attr": { "d": "M4.97 13.22a.75.75 0 0 1 1.06 0L11 18.19V3.75a.75.75 0 0 1 1.5 0v14.44l4.97-4.97a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734l-6.25 6.25a.75.75 0 0 1-1.06 0l-6.25-6.25a.75.75 0 0 1 0-1.06Z" }, "child": [] }] })(props);
302
+ }
303
+ function GoArrowUp(props) {
304
+ return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24" }, "child": [{ "tag": "path", "attr": { "d": "M18.655 10.405a.75.75 0 0 1-1.06 0l-4.97-4.97v14.44a.75.75 0 0 1-1.5 0V5.435l-4.97 4.97a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l6.25-6.25a.75.75 0 0 1 1.06 0l6.25 6.25a.75.75 0 0 1 0 1.06Z" }, "child": [] }] })(props);
305
+ }
306
+ function GoSearch(props) {
307
+ return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24" }, "child": [{ "tag": "path", "attr": { "d": "M10.25 2a8.25 8.25 0 0 1 6.34 13.53l5.69 5.69a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-5.69-5.69A8.25 8.25 0 1 1 10.25 2ZM3.5 10.25a6.75 6.75 0 1 0 13.5 0 6.75 6.75 0 0 0-13.5 0Z" }, "child": [] }] })(props);
308
+ }
309
+
310
+ // src/table/buttons.tsx
311
+ var import_utils = require("dn-react-toolkit/utils");
312
+ var import_react_router2 = require("react-router");
313
+ var import_react5 = __toESM(require("react"));
314
+ function TablePageButtons({
315
+ MAX_PAGES_TO_SHOW,
316
+ total,
317
+ limit,
318
+ offset
319
+ }) {
320
+ const pages = Math.ceil(total / limit);
321
+ const { pathname } = (0, import_react_router2.useLocation)();
322
+ const [searchParams] = (0, import_react_router2.useSearchParams)();
323
+ const currentPage = Math.floor(offset / limit) + 1;
324
+ const startButton = (Math.ceil(currentPage / MAX_PAGES_TO_SHOW) - 1) * MAX_PAGES_TO_SHOW;
325
+ const endButton = Math.min(startButton + MAX_PAGES_TO_SHOW - 1, pages);
326
+ return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, pages > 1 && /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex justify-center items-center my-8 gap-4 text-neutral-400" }, startButton > 1 && /* @__PURE__ */ import_react5.default.createElement(
327
+ import_react_router2.Link,
328
+ {
329
+ to: (() => {
330
+ searchParams.set(
331
+ "offset",
332
+ String((startButton - 1) * limit)
333
+ );
334
+ return `${pathname}?${searchParams.toString()}`;
335
+ })(),
336
+ className: "w-10 block text-center transition-colors hover:text-primary"
337
+ },
338
+ "\uC774\uC804"
339
+ ), Array.from({
340
+ length: Math.min(
341
+ MAX_PAGES_TO_SHOW,
342
+ pages - startButton
343
+ )
344
+ }).map((_, index) => {
345
+ return /* @__PURE__ */ import_react5.default.createElement(
346
+ import_react_router2.Link,
347
+ {
348
+ key: index,
349
+ to: (() => {
350
+ searchParams.set(
351
+ "offset",
352
+ String((startButton + index) * limit)
353
+ );
354
+ return `${pathname}?${searchParams.toString()}`;
355
+ })(),
356
+ className: (0, import_utils.cn)(
357
+ "w-6 block text-center transition-colors",
358
+ currentPage === startButton + index + 1 ? "font-bold text-primary" : "hover:text-primary"
359
+ )
360
+ },
361
+ startButton + index + 1
362
+ );
363
+ }), endButton < pages && /* @__PURE__ */ import_react5.default.createElement(
364
+ import_react_router2.Link,
365
+ {
366
+ to: (() => {
367
+ searchParams.set(
368
+ "offset",
369
+ String((endButton + 1) * limit)
370
+ );
371
+ return `${pathname}?${searchParams.toString()}`;
372
+ })(),
373
+ className: "w-10 block text-center transition-colors hover:text-primary"
374
+ },
375
+ "\uB2E4\uC74C"
376
+ )));
377
+ }
378
+
379
+ // src/table/table.tsx
380
+ var import_utils2 = require("dn-react-toolkit/utils");
381
+ var import_react_router3 = require("react-router");
382
+ var import_react6 = __toESM(require("react"));
383
+ function Table({
384
+ className = "min-w-full whitespace-nowrap",
385
+ data,
386
+ columns,
387
+ mapper: Mapper,
388
+ getLink,
389
+ limit,
390
+ offset,
391
+ orderBy,
392
+ direction
393
+ }) {
394
+ const keys = Object.entries(columns).filter((entry) => entry[1]).map(([key]) => key);
395
+ const sortedArray = [...data];
396
+ const [_, setSearchParams] = (0, import_react_router3.useSearchParams)();
397
+ return /* @__PURE__ */ import_react6.default.createElement(
398
+ "table",
399
+ {
400
+ className: (0, import_utils2.cn)(
401
+ className,
402
+ "text-[15px] border-separate border-spacing-0"
403
+ )
404
+ },
405
+ /* @__PURE__ */ import_react6.default.createElement("thead", null, /* @__PURE__ */ import_react6.default.createElement("tr", null, keys.map((key) => {
406
+ const value = columns[key];
407
+ function getReactNode() {
408
+ if (value && typeof value === "object" && "label" in value) {
409
+ return value.label;
410
+ }
411
+ return value;
412
+ }
413
+ function Head() {
414
+ const reactNode = getReactNode();
415
+ if (typeof reactNode === "string") {
416
+ return /* @__PURE__ */ import_react6.default.createElement(
417
+ "button",
418
+ {
419
+ className: (0, import_utils2.cn)(
420
+ orderBy === key ? "text-neutral-900 font-medium" : "text-neutral-500",
421
+ "px-4 h-14 flex items-center w-full"
422
+ ),
423
+ onClick: () => {
424
+ let newDirection = "asc";
425
+ if (orderBy === key) {
426
+ newDirection = direction === "asc" ? "desc" : "asc";
427
+ }
428
+ setSearchParams({
429
+ orderBy: key,
430
+ direction: newDirection
431
+ });
432
+ }
433
+ },
434
+ reactNode,
435
+ orderBy === key && /* @__PURE__ */ import_react6.default.createElement("div", { className: "ml-0.5" }, direction === "asc" ? /* @__PURE__ */ import_react6.default.createElement(GoArrowUp, null) : /* @__PURE__ */ import_react6.default.createElement(GoArrowDown, null))
436
+ );
437
+ }
438
+ return /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, reactNode);
439
+ }
440
+ return /* @__PURE__ */ import_react6.default.createElement(
441
+ "th",
442
+ {
443
+ key,
444
+ className: (0, import_utils2.cn)("border-y font-normal")
445
+ },
446
+ /* @__PURE__ */ import_react6.default.createElement(Head, null)
447
+ );
448
+ }))),
449
+ /* @__PURE__ */ import_react6.default.createElement("tbody", null, sortedArray.length === 0 && /* @__PURE__ */ import_react6.default.createElement("tr", null, /* @__PURE__ */ import_react6.default.createElement(
450
+ "td",
451
+ {
452
+ colSpan: keys.length,
453
+ className: "px-4 h-14 text-neutral-400 text-center"
454
+ },
455
+ "\uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
456
+ )), sortedArray.map((item, i) => /* @__PURE__ */ import_react6.default.createElement("tr", { key: i, className: "hover:bg-gray-50 transition-colors" }, keys.map((key, i2) => {
457
+ const value = item[key];
458
+ function Content() {
459
+ if (key in columns) {
460
+ const column = columns[key];
461
+ if (column && typeof column === "object" && "mapper" in column) {
462
+ const mapper = column.mapper;
463
+ if (mapper) {
464
+ return /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, mapper(item));
465
+ }
466
+ }
467
+ }
468
+ return /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, String(value));
469
+ }
470
+ const linkedContent = getLink ? /* @__PURE__ */ import_react6.default.createElement(
471
+ import_react_router3.Link,
472
+ {
473
+ to: getLink(item),
474
+ className: "block content-center px-4 w-full h-full"
475
+ },
476
+ /* @__PURE__ */ import_react6.default.createElement(Content, null)
477
+ ) : /* @__PURE__ */ import_react6.default.createElement(Content, null);
478
+ const cell = Mapper ? /* @__PURE__ */ import_react6.default.createElement(Mapper, { item, index: i2 }, linkedContent) : linkedContent;
479
+ return /* @__PURE__ */ import_react6.default.createElement("td", { key, className: "px-0 h-14 border-b" }, cell);
480
+ }))))
481
+ );
482
+ }
483
+
484
+ // src/table/page.tsx
485
+ var import_react7 = __toESM(require("react"));
486
+ function createTablePage({
487
+ name,
488
+ columns,
489
+ primaryKey = "id"
490
+ }) {
491
+ return function TablePage({
492
+ AdminLayout
493
+ }) {
494
+ const { pathname } = (0, import_react_router4.useLocation)();
495
+ const { table } = (0, import_react_router4.useLoaderData)();
496
+ const { items, total, limit, offset, orderBy, direction, searchKey } = table;
497
+ const navigate = (0, import_react_router4.useNavigate)();
498
+ const search = (query) => {
499
+ const searchParams2 = new URLSearchParams(window.location.search);
500
+ searchParams2.set("query", query);
501
+ searchParams2.set("offset", "0");
502
+ navigate(`${pathname}?${searchParams2.toString()}`);
503
+ };
504
+ const [searchParams] = (0, import_react_router4.useSearchParams)();
505
+ return /* @__PURE__ */ import_react7.default.createElement(
506
+ AdminLayout,
507
+ {
508
+ title: name,
509
+ actions: /* @__PURE__ */ import_react7.default.createElement(import_react_router4.Link, { to: `${pathname}/new`, className: "button-primary" }, name, " \uCD94\uAC00")
510
+ },
511
+ searchKey && /* @__PURE__ */ import_react7.default.createElement(
512
+ "form",
513
+ {
514
+ className: "h-18 px-4 flex items-center border-t",
515
+ onSubmit: (e) => {
516
+ e.preventDefault();
517
+ const formData = new FormData(e.currentTarget);
518
+ const query = formData.get("query");
519
+ search(query);
520
+ }
521
+ },
522
+ /* @__PURE__ */ import_react7.default.createElement(
523
+ "button",
524
+ {
525
+ type: "submit",
526
+ className: "w-10 h-10 flex justify-center items-center"
527
+ },
528
+ /* @__PURE__ */ import_react7.default.createElement(GoSearch, { className: "text-xl mr-4" })
529
+ ),
530
+ /* @__PURE__ */ import_react7.default.createElement(
531
+ "input",
532
+ {
533
+ className: "outline-none h-full flex-1",
534
+ placeholder: "\uC5EC\uAE30\uC5D0 \uAC80\uC0C9\uD558\uC138\uC694...",
535
+ name: "query",
536
+ defaultValue: searchParams.get("query") ?? ""
537
+ }
538
+ )
539
+ ),
540
+ /* @__PURE__ */ import_react7.default.createElement(
541
+ Table,
542
+ {
543
+ data: items,
544
+ columns,
545
+ getLink: primaryKey ? (item) => `${pathname}/${item[primaryKey]}` : void 0,
546
+ limit,
547
+ offset,
548
+ orderBy,
549
+ direction
550
+ }
551
+ ),
552
+ /* @__PURE__ */ import_react7.default.createElement(
553
+ TablePageButtons,
554
+ {
555
+ total,
556
+ limit,
557
+ offset,
558
+ MAX_PAGES_TO_SHOW: 10
559
+ }
560
+ )
561
+ );
562
+ };
563
+ }
564
+
565
+ // src/crud/crud_form.tsx
566
+ var import_store2 = require("dn-react-toolkit/store");
567
+ var import_react8 = __toESM(require("react"));
568
+ function CrudForm({ AdminLayout }) {
569
+ const form = useFormContext();
570
+ return /* @__PURE__ */ import_react8.default.createElement(
571
+ AdminLayout,
572
+ {
573
+ title: `${form.name} ${form.item ? "\uC218\uC815" : "\uCD94\uAC00"}`,
574
+ actions: /* @__PURE__ */ import_react8.default.createElement(
575
+ "button",
576
+ {
577
+ type: "button",
578
+ className: "button-primary",
579
+ onClick: form.submit
580
+ },
581
+ "\uC800\uC7A5\uD558\uAE30"
582
+ ),
583
+ className: "max-w-3xl mx-auto"
584
+ },
585
+ Object.keys(form.columns).length > 0 && /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, Object.entries(form.columns).map(
586
+ ([key, value]) => /* @__PURE__ */ import_react8.default.createElement("label", { key }, value.label, value.component ? /* @__PURE__ */ import_react8.default.createElement(value.component, null) : /* @__PURE__ */ import_react8.default.createElement(
587
+ import_store2.SyncInput,
588
+ {
589
+ store: form.store,
590
+ property: key,
591
+ className: "input-form"
592
+ }
593
+ ))
594
+ )),
595
+ form.item && /* @__PURE__ */ import_react8.default.createElement(
596
+ "button",
597
+ {
598
+ className: "button-dangerous mt-8",
599
+ onClick: () => {
600
+ form.delete();
601
+ }
602
+ },
603
+ "\uC0AD\uC81C\uD558\uAE30"
604
+ )
605
+ );
606
+ }
607
+
608
+ // src/crud/crud_page.tsx
609
+ var import_react9 = __toESM(require("react"));
610
+ function crudPage({
611
+ name,
612
+ tablePageOptions,
613
+ formOptions,
614
+ AdminLayout
615
+ }) {
616
+ return (prefix) => {
617
+ return function Page() {
618
+ const data = (0, import_react_router5.useLoaderData)();
619
+ const { pathname } = (0, import_react_router5.useLocation)();
620
+ if (pathname === prefix) {
621
+ const Component = createTablePage({
622
+ ...tablePageOptions,
623
+ name
624
+ });
625
+ return /* @__PURE__ */ import_react9.default.createElement(Component, { AdminLayout });
626
+ }
627
+ if (pathname.startsWith(prefix)) {
628
+ return /* @__PURE__ */ import_react9.default.createElement(
629
+ CrudFormProvider,
630
+ {
631
+ item: data?.item,
632
+ prefix,
633
+ name,
634
+ columns: formOptions.columns
635
+ },
636
+ formOptions.form ? /* @__PURE__ */ import_react9.default.createElement(formOptions.form, null) : /* @__PURE__ */ import_react9.default.createElement(CrudForm, { AdminLayout })
637
+ );
638
+ }
639
+ };
640
+ };
641
+ }
642
+ // Annotate the CommonJS export names for ESM import in node:
643
+ 0 && (module.exports = {
644
+ crudPage
645
+ });