dn-react-router-toolkit 0.5.9 → 0.6.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 (69) hide show
  1. package/dist/auth/cookie_store.d.mts +1 -1
  2. package/dist/auth/cookie_store.d.ts +1 -1
  3. package/dist/auth/cookie_store.js +4 -4
  4. package/dist/auth/cookie_store.mjs +4 -4
  5. package/dist/auth/index.js +4 -4
  6. package/dist/auth/index.mjs +4 -4
  7. package/dist/client/env_loader.d.mts +2 -2
  8. package/dist/client/env_loader.d.ts +2 -2
  9. package/dist/client/file_input.d.mts +10 -0
  10. package/dist/client/file_input.d.ts +10 -0
  11. package/dist/client/file_input.js +80 -0
  12. package/dist/client/file_input.mjs +45 -0
  13. package/dist/client/index.d.mts +4 -0
  14. package/dist/client/index.d.ts +4 -0
  15. package/dist/client/index.js +104 -0
  16. package/dist/client/index.mjs +102 -0
  17. package/dist/client/store_text_editor.d.mts +13 -0
  18. package/dist/client/store_text_editor.d.ts +13 -0
  19. package/dist/client/store_text_editor.js +94 -0
  20. package/dist/client/store_text_editor.mjs +59 -0
  21. package/dist/crud/crud_form.d.mts +4 -6
  22. package/dist/crud/crud_form.d.ts +4 -6
  23. package/dist/crud/crud_form.js +147 -100
  24. package/dist/crud/crud_form.mjs +148 -106
  25. package/dist/crud/crud_form_provider.d.mts +10 -10
  26. package/dist/crud/crud_form_provider.d.ts +10 -10
  27. package/dist/crud/crud_form_provider.js +5 -6
  28. package/dist/crud/crud_form_provider.mjs +4 -5
  29. package/dist/crud/crud_page.d.mts +8 -8
  30. package/dist/crud/crud_page.d.ts +8 -8
  31. package/dist/crud/crud_page.js +203 -160
  32. package/dist/crud/crud_page.mjs +200 -162
  33. package/dist/crud/generate_pages.d.mts +3 -3
  34. package/dist/crud/generate_pages.d.ts +3 -3
  35. package/dist/crud/index.d.mts +1 -1
  36. package/dist/crud/index.d.ts +1 -1
  37. package/dist/crud/index.js +256 -213
  38. package/dist/crud/index.mjs +240 -202
  39. package/dist/form/create_form_component.d.mts +28 -0
  40. package/dist/form/create_form_component.d.ts +28 -0
  41. package/dist/form/create_form_component.js +47 -0
  42. package/dist/form/create_form_component.mjs +12 -0
  43. package/dist/form/form_components.d.mts +7 -0
  44. package/dist/form/form_components.d.ts +7 -0
  45. package/dist/form/form_components.js +64 -0
  46. package/dist/form/form_components.mjs +25 -0
  47. package/dist/form/index.d.mts +3 -0
  48. package/dist/form/index.d.ts +3 -0
  49. package/dist/form/index.js +66 -0
  50. package/dist/form/index.mjs +26 -0
  51. package/dist/post/index.js +1 -0
  52. package/dist/post/index.mjs +1 -0
  53. package/dist/post/thumbnail_picker.d.mts +8 -7
  54. package/dist/post/thumbnail_picker.d.ts +8 -7
  55. package/dist/post/thumbnail_picker.js +8 -4
  56. package/dist/post/thumbnail_picker.mjs +8 -4
  57. package/dist/seo/seo.d.mts +2 -2
  58. package/dist/seo/seo.d.ts +2 -2
  59. package/dist/table/buttons.d.mts +2 -2
  60. package/dist/table/buttons.d.ts +2 -2
  61. package/dist/table/index.js +44 -47
  62. package/dist/table/index.mjs +44 -47
  63. package/dist/table/page.d.mts +5 -7
  64. package/dist/table/page.d.ts +5 -7
  65. package/dist/table/page.js +44 -47
  66. package/dist/table/page.mjs +44 -47
  67. package/dist/table/table.d.mts +4 -4
  68. package/dist/table/table.d.ts +4 -4
  69. package/package.json +92 -85
@@ -1,26 +1,26 @@
1
- import { RxStore } from 'dn-react-toolkit/store';
2
- import React from 'react';
1
+ import { Store } from 'react-store-input';
2
+ import React__default from 'react';
3
3
 
4
4
  type FormState<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never> = Omit<TModel, TPrimaryKey> & {
5
5
  [K in TPrimaryKey]?: TModel[K];
6
6
  };
7
7
  type FormColumnValue<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never> = {
8
8
  label: string;
9
- type?: React.HTMLInputTypeAttribute | "textarea";
10
- component?: React.FC<{
11
- store: RxStore<FormState<TModel, TPrimaryKey>>;
9
+ type?: React__default.HTMLInputTypeAttribute | "textarea";
10
+ component?: React__default.FC<{
11
+ store: Store<FormState<TModel, TPrimaryKey>>;
12
12
  property: string;
13
13
  }>;
14
- options?: React.FC;
14
+ options?: React__default.FC;
15
15
  };
16
16
  type FormColumns<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never> = Partial<{
17
17
  [K in keyof TModel]: FormColumnValue<TModel, TPrimaryKey>;
18
18
  }>;
19
- declare const FormContext: React.Context<{}>;
19
+ declare const FormContext: React__default.Context<{}>;
20
20
  declare function useFormContext<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>(): {
21
21
  name: string;
22
22
  item?: TModel;
23
- store: RxStore<FormState<TModel, TPrimaryKey>>;
23
+ store: Store<FormState<TModel, TPrimaryKey>>;
24
24
  submit: () => Promise<void>;
25
25
  delete: () => Promise<void>;
26
26
  columns: FormColumns<TModel, TPrimaryKey>;
@@ -31,8 +31,8 @@ type CrudFormProps<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof
31
31
  prefix: string;
32
32
  item?: TModel;
33
33
  columns?: FormColumns<TModel, TPrimaryKey>;
34
- children?: React.ReactNode;
34
+ children?: React__default.ReactNode;
35
35
  };
36
- declare function CrudFormProvider<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>({ primaryKey, name, prefix, item, columns, children, }: CrudFormProps<TModel, TPrimaryKey>): React.JSX.Element;
36
+ declare function CrudFormProvider<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>({ primaryKey, name, prefix, item, columns, children, }: CrudFormProps<TModel, TPrimaryKey>): React__default.JSX.Element;
37
37
 
38
38
  export { type CrudFormProps, type FormColumnValue, type FormColumns, FormContext, type FormState, CrudFormProvider as default, useFormContext };
@@ -1,26 +1,26 @@
1
- import { RxStore } from 'dn-react-toolkit/store';
2
- import React from 'react';
1
+ import { Store } from 'react-store-input';
2
+ import React__default from 'react';
3
3
 
4
4
  type FormState<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never> = Omit<TModel, TPrimaryKey> & {
5
5
  [K in TPrimaryKey]?: TModel[K];
6
6
  };
7
7
  type FormColumnValue<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never> = {
8
8
  label: string;
9
- type?: React.HTMLInputTypeAttribute | "textarea";
10
- component?: React.FC<{
11
- store: RxStore<FormState<TModel, TPrimaryKey>>;
9
+ type?: React__default.HTMLInputTypeAttribute | "textarea";
10
+ component?: React__default.FC<{
11
+ store: Store<FormState<TModel, TPrimaryKey>>;
12
12
  property: string;
13
13
  }>;
14
- options?: React.FC;
14
+ options?: React__default.FC;
15
15
  };
16
16
  type FormColumns<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never> = Partial<{
17
17
  [K in keyof TModel]: FormColumnValue<TModel, TPrimaryKey>;
18
18
  }>;
19
- declare const FormContext: React.Context<{}>;
19
+ declare const FormContext: React__default.Context<{}>;
20
20
  declare function useFormContext<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>(): {
21
21
  name: string;
22
22
  item?: TModel;
23
- store: RxStore<FormState<TModel, TPrimaryKey>>;
23
+ store: Store<FormState<TModel, TPrimaryKey>>;
24
24
  submit: () => Promise<void>;
25
25
  delete: () => Promise<void>;
26
26
  columns: FormColumns<TModel, TPrimaryKey>;
@@ -31,8 +31,8 @@ type CrudFormProps<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof
31
31
  prefix: string;
32
32
  item?: TModel;
33
33
  columns?: FormColumns<TModel, TPrimaryKey>;
34
- children?: React.ReactNode;
34
+ children?: React__default.ReactNode;
35
35
  };
36
- declare function CrudFormProvider<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>({ primaryKey, name, prefix, item, columns, children, }: CrudFormProps<TModel, TPrimaryKey>): React.JSX.Element;
36
+ declare function CrudFormProvider<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>({ primaryKey, name, prefix, item, columns, children, }: CrudFormProps<TModel, TPrimaryKey>): React__default.JSX.Element;
37
37
 
38
38
  export { type CrudFormProps, type FormColumnValue, type FormColumns, FormContext, type FormState, CrudFormProvider as default, useFormContext };
@@ -36,7 +36,7 @@ __export(crud_form_provider_exports, {
36
36
  });
37
37
  module.exports = __toCommonJS(crud_form_provider_exports);
38
38
  var import_react_router = require("react-router");
39
- var import_store = require("dn-react-toolkit/store");
39
+ var import_react_store_input = require("react-store-input");
40
40
  var import_react = require("react");
41
41
  var import_react2 = __toESM(require("react"));
42
42
  var FormContext = (0, import_react.createContext)({});
@@ -52,7 +52,7 @@ function CrudFormProvider({
52
52
  children
53
53
  }) {
54
54
  const apiPrefix = `/api${prefix}`;
55
- const store = (0, import_store.useStore)({
55
+ const store = (0, import_react_store_input.useStore)({
56
56
  ...item || {}
57
57
  });
58
58
  const navigate = (0, import_react_router.useNavigate)();
@@ -102,10 +102,9 @@ function CrudFormProvider({
102
102
  return value2.map((v) => converter(v));
103
103
  }
104
104
  if (typeof value2 === "object") {
105
- return Object.entries(value2).reduce(
106
- reducer,
107
- {}
108
- );
105
+ return Object.entries(
106
+ value2
107
+ ).reduce(reducer, {});
109
108
  }
110
109
  };
111
110
  return {
@@ -1,6 +1,6 @@
1
1
  // src/crud/crud_form_provider.tsx
2
2
  import { useNavigate } from "react-router";
3
- import { useStore } from "dn-react-toolkit/store";
3
+ import { useStore } from "react-store-input";
4
4
  import { createContext, useContext } from "react";
5
5
  import React from "react";
6
6
  var FormContext = createContext({});
@@ -66,10 +66,9 @@ function CrudFormProvider({
66
66
  return value2.map((v) => converter(v));
67
67
  }
68
68
  if (typeof value2 === "object") {
69
- return Object.entries(value2).reduce(
70
- reducer,
71
- {}
72
- );
69
+ return Object.entries(
70
+ value2
71
+ ).reduce(reducer, {});
73
72
  }
74
73
  };
75
74
  return {
@@ -1,24 +1,24 @@
1
1
  import { CrudFormProps } from './crud_form_provider.mjs';
2
2
  import { TablePageOptions } from '../table/page.mjs';
3
- import React from 'react';
4
- import 'dn-react-toolkit/store';
3
+ import React__default from 'react';
4
+ import 'react-store-input';
5
5
  import '../table/table.mjs';
6
6
 
7
7
  type CrudPageOptions<TModel, TPrimaryKey extends keyof TModel> = {
8
8
  name: string;
9
9
  tablePageOptions: Omit<TablePageOptions<TModel>, "name">;
10
10
  formOptions: {
11
- form?: React.FC;
11
+ form?: React__default.FC;
12
12
  columns: CrudFormProps<TModel, TPrimaryKey>["columns"];
13
13
  };
14
- AdminLayout: React.FC<{
14
+ AdminHeader: React__default.FC<{
15
15
  title: string;
16
- actions?: React.ReactNode;
16
+ actions?: React__default.ReactNode;
17
17
  className?: string;
18
- children?: React.ReactNode;
18
+ children?: React__default.ReactNode;
19
19
  }>;
20
20
  };
21
- type CrudPage = (prefix: string) => React.FC;
22
- declare function crudPage<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>({ name, tablePageOptions, formOptions, AdminLayout, }: CrudPageOptions<TModel, TPrimaryKey>): CrudPage;
21
+ type CrudPage = (prefix: string) => React__default.FC;
22
+ declare function crudPage<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>({ name, tablePageOptions, formOptions, AdminHeader, }: CrudPageOptions<TModel, TPrimaryKey>): CrudPage;
23
23
 
24
24
  export { type CrudPage, type CrudPageOptions, crudPage };
@@ -1,24 +1,24 @@
1
1
  import { CrudFormProps } from './crud_form_provider.js';
2
2
  import { TablePageOptions } from '../table/page.js';
3
- import React from 'react';
4
- import 'dn-react-toolkit/store';
3
+ import React__default from 'react';
4
+ import 'react-store-input';
5
5
  import '../table/table.js';
6
6
 
7
7
  type CrudPageOptions<TModel, TPrimaryKey extends keyof TModel> = {
8
8
  name: string;
9
9
  tablePageOptions: Omit<TablePageOptions<TModel>, "name">;
10
10
  formOptions: {
11
- form?: React.FC;
11
+ form?: React__default.FC;
12
12
  columns: CrudFormProps<TModel, TPrimaryKey>["columns"];
13
13
  };
14
- AdminLayout: React.FC<{
14
+ AdminHeader: React__default.FC<{
15
15
  title: string;
16
- actions?: React.ReactNode;
16
+ actions?: React__default.ReactNode;
17
17
  className?: string;
18
- children?: React.ReactNode;
18
+ children?: React__default.ReactNode;
19
19
  }>;
20
20
  };
21
- type CrudPage = (prefix: string) => React.FC;
22
- declare function crudPage<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>({ name, tablePageOptions, formOptions, AdminLayout, }: CrudPageOptions<TModel, TPrimaryKey>): CrudPage;
21
+ type CrudPage = (prefix: string) => React__default.FC;
22
+ declare function crudPage<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>({ name, tablePageOptions, formOptions, AdminHeader, }: CrudPageOptions<TModel, TPrimaryKey>): CrudPage;
23
23
 
24
24
  export { type CrudPage, type CrudPageOptions, crudPage };
@@ -33,11 +33,11 @@ __export(crud_page_exports, {
33
33
  crudPage: () => crudPage
34
34
  });
35
35
  module.exports = __toCommonJS(crud_page_exports);
36
- var import_react_router5 = require("react-router");
36
+ var import_react_router7 = require("react-router");
37
37
 
38
38
  // src/crud/crud_form_provider.tsx
39
39
  var import_react_router = require("react-router");
40
- var import_store = require("dn-react-toolkit/store");
40
+ var import_react_store_input = require("react-store-input");
41
41
  var import_react = require("react");
42
42
  var import_react2 = __toESM(require("react"));
43
43
  var FormContext = (0, import_react.createContext)({});
@@ -53,7 +53,7 @@ function CrudFormProvider({
53
53
  children
54
54
  }) {
55
55
  const apiPrefix = `/api${prefix}`;
56
- const store = (0, import_store.useStore)({
56
+ const store = (0, import_react_store_input.useStore)({
57
57
  ...item || {}
58
58
  });
59
59
  const navigate = (0, import_react_router.useNavigate)();
@@ -103,10 +103,9 @@ function CrudFormProvider({
103
103
  return value2.map((v) => converter(v));
104
104
  }
105
105
  if (typeof value2 === "object") {
106
- return Object.entries(value2).reduce(
107
- reducer,
108
- {}
109
- );
106
+ return Object.entries(
107
+ value2
108
+ ).reduce(reducer, {});
110
109
  }
111
110
  };
112
111
  return {
@@ -487,7 +486,7 @@ function createTablePage({
487
486
  primaryKey = "id"
488
487
  }) {
489
488
  return function TablePage({
490
- AdminLayout
489
+ AdminHeader
491
490
  }) {
492
491
  const { pathname } = (0, import_react_router4.useLocation)();
493
492
  const { table } = (0, import_react_router4.useLoaderData)();
@@ -500,198 +499,242 @@ function createTablePage({
500
499
  navigate(`${pathname}?${searchParams2.toString()}`);
501
500
  };
502
501
  const [searchParams] = (0, import_react_router4.useSearchParams)();
503
- return /* @__PURE__ */ import_react7.default.createElement(
504
- AdminLayout,
502
+ return /* @__PURE__ */ import_react7.default.createElement(import_react7.default.Fragment, null, /* @__PURE__ */ import_react7.default.createElement(
503
+ AdminHeader,
505
504
  {
506
505
  title: name,
507
506
  actions: /* @__PURE__ */ import_react7.default.createElement(import_react_router4.Link, { to: `${pathname}/new`, className: "button-primary" }, name, " \uCD94\uAC00")
507
+ }
508
+ ), /* @__PURE__ */ import_react7.default.createElement("div", { className: "max-w-7xl mx-auto" }, searchKey && /* @__PURE__ */ import_react7.default.createElement(
509
+ "form",
510
+ {
511
+ className: "h-18 px-4 flex items-center border-t",
512
+ onSubmit: (e) => {
513
+ e.preventDefault();
514
+ const formData = new FormData(e.currentTarget);
515
+ const query = formData.get("query");
516
+ search(query);
517
+ }
508
518
  },
509
- searchKey && /* @__PURE__ */ import_react7.default.createElement(
510
- "form",
511
- {
512
- className: "h-18 px-4 flex items-center border-t",
513
- onSubmit: (e) => {
514
- e.preventDefault();
515
- const formData = new FormData(e.currentTarget);
516
- const query = formData.get("query");
517
- search(query);
518
- }
519
- },
520
- /* @__PURE__ */ import_react7.default.createElement(
521
- "button",
522
- {
523
- type: "submit",
524
- className: "w-10 h-10 flex justify-center items-center"
525
- },
526
- /* @__PURE__ */ import_react7.default.createElement(GoSearch, { className: "text-xl mr-4" })
527
- ),
528
- /* @__PURE__ */ import_react7.default.createElement(
529
- "input",
530
- {
531
- className: "outline-none h-full flex-1",
532
- placeholder: "\uC5EC\uAE30\uC5D0 \uAC80\uC0C9\uD558\uC138\uC694...",
533
- name: "query",
534
- defaultValue: searchParams.get("query") ?? ""
535
- }
536
- )
537
- ),
538
519
  /* @__PURE__ */ import_react7.default.createElement(
539
- Table,
520
+ "button",
540
521
  {
541
- data: items,
542
- columns,
543
- getLink: primaryKey ? (item) => `${pathname}/${item[primaryKey]}` : void 0,
544
- limit,
545
- offset,
546
- orderBy,
547
- direction
548
- }
522
+ type: "submit",
523
+ className: "w-10 h-10 flex justify-center items-center"
524
+ },
525
+ /* @__PURE__ */ import_react7.default.createElement(GoSearch, { className: "text-xl mr-4" })
549
526
  ),
550
527
  /* @__PURE__ */ import_react7.default.createElement(
551
- TablePageButtons,
528
+ "input",
552
529
  {
553
- total,
554
- limit,
555
- offset,
556
- MAX_PAGES_TO_SHOW: 10
530
+ className: "outline-none h-full flex-1",
531
+ placeholder: "\uC5EC\uAE30\uC5D0 \uAC80\uC0C9\uD558\uC138\uC694...",
532
+ name: "query",
533
+ defaultValue: searchParams.get("query") ?? ""
557
534
  }
558
535
  )
559
- );
536
+ ), /* @__PURE__ */ import_react7.default.createElement(
537
+ Table,
538
+ {
539
+ data: items,
540
+ columns,
541
+ getLink: primaryKey ? (item) => `${pathname}/${item[primaryKey]}` : void 0,
542
+ limit,
543
+ offset,
544
+ orderBy,
545
+ direction
546
+ }
547
+ ), /* @__PURE__ */ import_react7.default.createElement(
548
+ TablePageButtons,
549
+ {
550
+ total,
551
+ limit,
552
+ offset,
553
+ MAX_PAGES_TO_SHOW: 10
554
+ }
555
+ )));
560
556
  };
561
557
  }
562
558
 
563
559
  // src/crud/crud_form.tsx
564
- var import_store2 = require("dn-react-toolkit/store");
560
+ var import_react13 = __toESM(require("react"));
561
+ var import_dn_react_text_editor2 = require("dn-react-text-editor");
562
+ var import_react_store_input3 = require("react-store-input");
563
+
564
+ // src/client/env_loader.tsx
565
565
  var import_react8 = __toESM(require("react"));
566
+ var import_react_router5 = require("react-router");
567
+
568
+ // src/client/file_input.tsx
569
+ var import_react9 = require("react");
570
+ var import_react10 = __toESM(require("react"));
571
+
572
+ // src/client/use_user_agent.tsx
573
+ var import_react_router6 = require("react-router");
574
+
575
+ // src/client/store_text_editor.tsx
576
+ var import_dn_react_text_editor = require("dn-react-text-editor");
577
+ var import_react_store_input2 = require("react-store-input");
578
+ var import_react11 = __toESM(require("react"));
579
+ function createStoreTextEditor(TextEditor2) {
580
+ function StoreComponent({
581
+ store,
582
+ name,
583
+ defaultValue,
584
+ ...props
585
+ }) {
586
+ const { ref, onChange } = (0, import_react_store_input2.useStoreController)(
587
+ store,
588
+ {
589
+ ref: props.ref,
590
+ onSubscribe: (state, element) => {
591
+ const result = (props.getter ? props.getter(state) : name ? state[name] : "") || "";
592
+ if (element.value !== result) {
593
+ element.value = result;
594
+ }
595
+ },
596
+ onDispatch: (state, element) => {
597
+ if (props.setter) {
598
+ props.setter(state, element.value);
599
+ return;
600
+ }
601
+ if (name) {
602
+ state[name] = element.value;
603
+ }
604
+ }
605
+ }
606
+ );
607
+ const getDefaultValue = () => {
608
+ if (props.getter) {
609
+ return props.getter(store.state);
610
+ }
611
+ if (name) {
612
+ return store.state[name];
613
+ }
614
+ return void 0;
615
+ };
616
+ return /* @__PURE__ */ import_react11.default.createElement(
617
+ TextEditor2,
618
+ {
619
+ ...props,
620
+ ref,
621
+ defaultValue: defaultValue ?? getDefaultValue(),
622
+ onChange: (e) => {
623
+ onChange();
624
+ props.onChange?.(e);
625
+ }
626
+ }
627
+ );
628
+ }
629
+ return StoreComponent;
630
+ }
631
+
632
+ // src/form/create_form_component.tsx
566
633
  var import_utils3 = require("dn-react-toolkit/utils");
567
- var import_text_editor = require("dn-react-toolkit/text_editor");
568
- var textarea = (0, import_text_editor.createTextEditor)();
569
- function CrudForm({ AdminLayout }) {
634
+ var import_react12 = __toESM(require("react"));
635
+ function createComponent(tag, options) {
636
+ return function FormComponent({ className, ...props }) {
637
+ const Tag = tag;
638
+ return /* @__PURE__ */ import_react12.default.createElement(Tag, { ...props, className: (0, import_utils3.cn)(options.className, className) });
639
+ };
640
+ }
641
+
642
+ // src/form/form_components.tsx
643
+ var FormEntry = createComponent("div", {
644
+ className: "flex-1"
645
+ });
646
+ var FormRow = createComponent("div", {
647
+ className: "flex-1 flex gap-4 mb-6"
648
+ });
649
+ var FormLabel = createComponent("label", {
650
+ className: "flex-1 font-semibold mb-2.5 block"
651
+ });
652
+
653
+ // src/crud/crud_form.tsx
654
+ var TextEditor = createStoreTextEditor((0, import_dn_react_text_editor2.createTextEditor)());
655
+ function CrudForm({ AdminHeader }) {
570
656
  const form = useFormContext();
571
- return /* @__PURE__ */ import_react8.default.createElement(
572
- AdminLayout,
657
+ return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, null, /* @__PURE__ */ import_react13.default.createElement(
658
+ AdminHeader,
573
659
  {
574
660
  title: `${form.name} ${form.item ? "\uC218\uC815" : "\uCD94\uAC00"}`,
575
- actions: /* @__PURE__ */ import_react8.default.createElement("button", { type: "button", className: "button-primary", onClick: form.submit }, "\uC800\uC7A5\uD558\uAE30"),
576
- className: "max-w-3xl mx-auto"
577
- },
578
- Object.keys(form.columns).length > 0 && /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, Object.entries(
579
- form.columns
580
- ).map(([key, value]) => {
581
- const createComponent = () => {
582
- if (value.component) {
583
- return /* @__PURE__ */ import_react8.default.createElement(value.component, { store: form.store, property: key });
584
- }
585
- if (value.type === "checkbox") {
586
- return /* @__PURE__ */ import_react8.default.createElement(import_store2.SyncSwitch, { store: form.store, property: key });
587
- }
588
- if (value.type === "number") {
589
- return /* @__PURE__ */ import_react8.default.createElement(
590
- import_store2.SyncInput,
591
- {
592
- store: form.store,
593
- property: key,
594
- className: "input-form",
595
- type: "number",
596
- serializer: (value2) => {
597
- if (value2 === void 0 || value2 === null) {
598
- return "";
599
- }
600
- return String(value2);
601
- },
602
- deserializer: (value2) => {
603
- const parsed = Number(value2);
604
- if (isNaN(parsed)) {
605
- return void 0;
606
- }
607
- return parsed;
608
- }
609
- }
610
- );
611
- }
612
- if (value.type === "datetime") {
613
- return /* @__PURE__ */ import_react8.default.createElement(
614
- import_store2.SyncInput,
615
- {
616
- store: form.store,
617
- property: key,
618
- className: "input-form",
619
- type: "datetime-local",
620
- serializer: (value2) => {
621
- if (value2 instanceof Date) {
622
- return (0, import_utils3.moment)(value2).toISOString(true).slice(0, 16);
623
- }
624
- return String(value2);
625
- },
626
- deserializer: (value2) => {
627
- if (!value2) {
628
- return void 0;
629
- }
630
- return (0, import_utils3.moment)(value2).toDate();
631
- }
632
- }
633
- );
634
- }
635
- if (value.type === "textarea") {
636
- const Editor = (0, import_store2.useSyncTextEditor)(textarea);
637
- return /* @__PURE__ */ import_react8.default.createElement(
638
- Editor.Component,
639
- {
640
- store: form.store,
641
- property: key
642
- }
643
- );
644
- }
645
- if (value.options) {
646
- const Component = value.options;
647
- return /* @__PURE__ */ import_react8.default.createElement(import_store2.SyncSelect, { store: form.store, property: key }, /* @__PURE__ */ import_react8.default.createElement(Component, null));
648
- }
649
- return /* @__PURE__ */ import_react8.default.createElement(
650
- import_store2.SyncInput,
661
+ actions: /* @__PURE__ */ import_react13.default.createElement(
662
+ "button",
663
+ {
664
+ type: "button",
665
+ className: "button-primary",
666
+ onClick: form.submit
667
+ },
668
+ "\uC800\uC7A5\uD558\uAE30"
669
+ )
670
+ }
671
+ ), /* @__PURE__ */ import_react13.default.createElement("div", { className: "max-w-2xl mx-auto" }, Object.keys(form.columns).length > 0 && /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, null, Object.entries(
672
+ form.columns
673
+ ).map(([key, value]) => {
674
+ function InputComponent() {
675
+ if (value.type === "textarea") {
676
+ return /* @__PURE__ */ import_react13.default.createElement(TextEditor, { store: form.store, name: key });
677
+ }
678
+ if (value.options) {
679
+ const Component = value.options;
680
+ return /* @__PURE__ */ import_react13.default.createElement(
681
+ import_react_store_input3.Select,
651
682
  {
652
683
  store: form.store,
653
- property: key,
654
- type: value.type,
655
- className: "input-form"
656
- }
684
+ name: key,
685
+ className: "select-form"
686
+ },
687
+ /* @__PURE__ */ import_react13.default.createElement(Component, null)
657
688
  );
658
- };
659
- return /* @__PURE__ */ import_react8.default.createElement("label", { key }, value.label, createComponent());
660
- })),
661
- form.item && /* @__PURE__ */ import_react8.default.createElement(
662
- "button",
663
- {
664
- className: "button-dangerous mt-8",
665
- onClick: () => {
666
- form.delete();
689
+ }
690
+ return /* @__PURE__ */ import_react13.default.createElement(
691
+ import_react_store_input3.Input,
692
+ {
693
+ store: form.store,
694
+ name: key,
695
+ type: value.type,
696
+ className: "input-form"
667
697
  }
668
- },
669
- "\uC0AD\uC81C\uD558\uAE30"
670
- )
671
- );
698
+ );
699
+ }
700
+ const v = form.store.state[key];
701
+ if (typeof v === "boolean") {
702
+ return /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex" }, value.label, /* @__PURE__ */ import_react13.default.createElement("div", { className: "ml-auto" }, /* @__PURE__ */ import_react13.default.createElement(InputComponent, null)));
703
+ }
704
+ return /* @__PURE__ */ import_react13.default.createElement(FormRow, null, /* @__PURE__ */ import_react13.default.createElement(FormEntry, null, /* @__PURE__ */ import_react13.default.createElement(FormLabel, { key }, value.label), /* @__PURE__ */ import_react13.default.createElement(InputComponent, null)));
705
+ })), form.item && /* @__PURE__ */ import_react13.default.createElement(
706
+ "button",
707
+ {
708
+ className: "button-dangerous mt-8",
709
+ onClick: () => {
710
+ form.delete();
711
+ }
712
+ },
713
+ "\uC0AD\uC81C\uD558\uAE30"
714
+ )));
672
715
  }
673
716
 
674
717
  // src/crud/crud_page.tsx
675
- var import_react9 = __toESM(require("react"));
718
+ var import_react14 = __toESM(require("react"));
676
719
  function crudPage({
677
720
  name,
678
721
  tablePageOptions,
679
722
  formOptions,
680
- AdminLayout
723
+ AdminHeader
681
724
  }) {
682
725
  return (prefix) => {
683
726
  return function Page() {
684
- const data = (0, import_react_router5.useLoaderData)();
685
- const { pathname } = (0, import_react_router5.useLocation)();
727
+ const data = (0, import_react_router7.useLoaderData)();
728
+ const { pathname } = (0, import_react_router7.useLocation)();
686
729
  if (pathname === prefix) {
687
730
  const Component = createTablePage({
688
731
  ...tablePageOptions,
689
732
  name
690
733
  });
691
- return /* @__PURE__ */ import_react9.default.createElement(Component, { AdminLayout });
734
+ return /* @__PURE__ */ import_react14.default.createElement(Component, { AdminHeader });
692
735
  }
693
736
  if (pathname.startsWith(prefix)) {
694
- return /* @__PURE__ */ import_react9.default.createElement(
737
+ return /* @__PURE__ */ import_react14.default.createElement(
695
738
  CrudFormProvider,
696
739
  {
697
740
  item: data?.item,
@@ -699,7 +742,7 @@ function crudPage({
699
742
  name,
700
743
  columns: formOptions.columns
701
744
  },
702
- formOptions.form ? /* @__PURE__ */ import_react9.default.createElement(formOptions.form, null) : /* @__PURE__ */ import_react9.default.createElement(CrudForm, { AdminLayout })
745
+ formOptions.form ? /* @__PURE__ */ import_react14.default.createElement(formOptions.form, null) : /* @__PURE__ */ import_react14.default.createElement(CrudForm, { AdminHeader })
703
746
  );
704
747
  }
705
748
  };