@tulip-systems/core 0.6.0 → 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 (98) hide show
  1. package/dist/commands/client.d.mts +2 -1
  2. package/dist/commands/client.mjs +2 -1
  3. package/dist/components/editor/components/menu-nodes.client.mjs +2 -2
  4. package/dist/components/editor/components/menu-nodes.client.mjs.map +1 -1
  5. package/dist/components/ui/input-date-time.d.mts +4 -4
  6. package/dist/components/ui/input-date-time.d.mts.map +1 -1
  7. package/dist/components/ui/input-date-time.mjs +4 -6
  8. package/dist/components/ui/input-date-time.mjs.map +1 -1
  9. package/dist/inline-edit/client.d.mts +2 -2
  10. package/dist/lib/hooks/use-indicator.d.mts.map +1 -1
  11. package/dist/lib/hooks/use-indicator.mjs +11 -8
  12. package/dist/lib/hooks/use-indicator.mjs.map +1 -1
  13. package/dist/modules/auth/components/auth-layout.server.mjs +1 -1
  14. package/dist/modules/auth/components/auth-layout.server.mjs.map +1 -1
  15. package/dist/modules/commands/hooks/use-command-menu.client.d.mts +8 -1
  16. package/dist/modules/commands/hooks/use-command-menu.client.d.mts.map +1 -1
  17. package/dist/modules/commands/hooks/use-command-menu.client.mjs.map +1 -1
  18. package/dist/modules/commands/menus/floating-menu.client.d.mts +19 -0
  19. package/dist/modules/commands/menus/floating-menu.client.d.mts.map +1 -0
  20. package/dist/modules/commands/menus/{data-table-menu.client.mjs → floating-menu.client.mjs} +10 -10
  21. package/dist/modules/commands/menus/floating-menu.client.mjs.map +1 -0
  22. package/dist/modules/data-tables/tables/data-table/components/table.mjs +8 -2
  23. package/dist/modules/data-tables/tables/data-table/components/table.mjs.map +1 -1
  24. package/dist/modules/data-tables/tables/inline-table/components/table.mjs +8 -2
  25. package/dist/modules/data-tables/tables/inline-table/components/table.mjs.map +1 -1
  26. package/dist/modules/inline-edit/components/combobox-dropdown.client.mjs +5 -1
  27. package/dist/modules/inline-edit/components/combobox-dropdown.client.mjs.map +1 -1
  28. package/dist/modules/inline-edit/components/combobox.client.mjs +5 -1
  29. package/dist/modules/inline-edit/components/combobox.client.mjs.map +1 -1
  30. package/dist/modules/inline-edit/components/date-input.client.mjs +5 -1
  31. package/dist/modules/inline-edit/components/date-input.client.mjs.map +1 -1
  32. package/dist/modules/inline-edit/components/date-picker.client.mjs +5 -1
  33. package/dist/modules/inline-edit/components/date-picker.client.mjs.map +1 -1
  34. package/dist/modules/inline-edit/components/date-time.client.d.mts.map +1 -1
  35. package/dist/modules/inline-edit/components/date-time.client.mjs +6 -1
  36. package/dist/modules/inline-edit/components/date-time.client.mjs.map +1 -1
  37. package/dist/modules/inline-edit/components/editor.client.mjs +5 -1
  38. package/dist/modules/inline-edit/components/editor.client.mjs.map +1 -1
  39. package/dist/modules/inline-edit/components/input-recipient.client.mjs +5 -1
  40. package/dist/modules/inline-edit/components/input-recipient.client.mjs.map +1 -1
  41. package/dist/modules/inline-edit/components/input-toggle.client.mjs +5 -1
  42. package/dist/modules/inline-edit/components/input-toggle.client.mjs.map +1 -1
  43. package/dist/modules/inline-edit/components/input.client.d.mts.map +1 -1
  44. package/dist/modules/inline-edit/components/input.client.mjs +15 -3
  45. package/dist/modules/inline-edit/components/input.client.mjs.map +1 -1
  46. package/dist/modules/inline-edit/components/select.client.d.mts.map +1 -1
  47. package/dist/modules/inline-edit/components/select.client.mjs +5 -1
  48. package/dist/modules/inline-edit/components/select.client.mjs.map +1 -1
  49. package/dist/modules/inline-edit/components/switch.client.mjs +5 -1
  50. package/dist/modules/inline-edit/components/switch.client.mjs.map +1 -1
  51. package/dist/modules/inline-edit/components/toggle.client.mjs +5 -1
  52. package/dist/modules/inline-edit/components/toggle.client.mjs.map +1 -1
  53. package/dist/modules/inline-edit/hooks/use-inline.client.d.mts +20 -5
  54. package/dist/modules/inline-edit/hooks/use-inline.client.d.mts.map +1 -1
  55. package/dist/modules/inline-edit/hooks/use-inline.client.mjs +11 -8
  56. package/dist/modules/inline-edit/hooks/use-inline.client.mjs.map +1 -1
  57. package/dist/modules/inline-edit/lib/variants.d.mts +1 -1
  58. package/dist/modules/storage/components/dropzone.client.d.mts +2 -2
  59. package/dist/modules/storage/components/dropzone.client.d.mts.map +1 -1
  60. package/dist/modules/storage/components/upload-zone-context.client.d.mts +1 -0
  61. package/dist/modules/storage/components/upload-zone-context.client.d.mts.map +1 -1
  62. package/dist/modules/storage/components/upload-zone-context.client.mjs.map +1 -1
  63. package/dist/modules/storage/components/upload-zone.client.d.mts +2 -1
  64. package/dist/modules/storage/components/upload-zone.client.d.mts.map +1 -1
  65. package/dist/modules/storage/components/upload-zone.client.mjs +5 -3
  66. package/dist/modules/storage/components/upload-zone.client.mjs.map +1 -1
  67. package/dist/modules/storage/lib/router.server.d.mts +11 -11
  68. package/dist/modules/storage/lib/service.server.d.mts +9 -9
  69. package/dist/modules/storage/lib/validators.d.mts +7 -7
  70. package/package.json +1 -1
  71. package/src/components/editor/components/menu-nodes.client.tsx +2 -2
  72. package/src/components/navigation/admin-sidebar.client.tsx +1 -0
  73. package/src/components/ui/input-date-time.tsx +12 -10
  74. package/src/lib/hooks/use-indicator.tsx +17 -8
  75. package/src/modules/auth/components/auth-layout.server.tsx +1 -1
  76. package/src/modules/commands/entry.client.ts +16 -0
  77. package/src/modules/commands/hooks/use-command-menu.client.tsx +2 -0
  78. package/src/modules/commands/menus/floating-menu.client.tsx +54 -0
  79. package/src/modules/data-tables/tables/data-table/components/table.tsx +11 -2
  80. package/src/modules/data-tables/tables/inline-table/components/table.tsx +11 -2
  81. package/src/modules/inline-edit/components/combobox-dropdown.client.tsx +4 -0
  82. package/src/modules/inline-edit/components/combobox.client.tsx +4 -0
  83. package/src/modules/inline-edit/components/date-input.client.tsx +4 -0
  84. package/src/modules/inline-edit/components/date-picker.client.tsx +4 -0
  85. package/src/modules/inline-edit/components/date-time.client.tsx +15 -1
  86. package/src/modules/inline-edit/components/editor.client.tsx +4 -0
  87. package/src/modules/inline-edit/components/input-recipient.client.tsx +4 -0
  88. package/src/modules/inline-edit/components/input-toggle.client.tsx +4 -0
  89. package/src/modules/inline-edit/components/input.client.tsx +12 -0
  90. package/src/modules/inline-edit/components/select.client.tsx +4 -0
  91. package/src/modules/inline-edit/components/switch.client.tsx +4 -0
  92. package/src/modules/inline-edit/components/toggle.client.tsx +4 -0
  93. package/src/modules/inline-edit/hooks/use-inline.client.tsx +37 -13
  94. package/src/modules/inline-edit/lib/parsers.ts +9 -0
  95. package/src/modules/storage/components/upload-zone-context.client.tsx +1 -0
  96. package/src/modules/storage/components/upload-zone.client.tsx +8 -2
  97. package/dist/modules/commands/menus/data-table-menu.client.mjs.map +0 -1
  98. package/src/modules/commands/menus/data-table-menu.client.tsx +0 -46
@@ -8,8 +8,9 @@ import { CommandEmpty, CommandEmptyProps } from "../modules/commands/components/
8
8
  import { BulkCommandAction, CommandAction, CommandActionResult, CommandMutationMeta, useCommandMutation } from "../modules/commands/hooks/use-command-mutation.client.mjs";
9
9
  import { ContextCommandMenu, ContextCommandMenuContent, ContextCommandMenuTrigger } from "../modules/commands/menus/context-menu.client.mjs";
10
10
  import { DropdownCommandMenu, DropdownCommandMenuLoading } from "../modules/commands/menus/dropdown-menu.client.mjs";
11
+ import { FloatingCommandMenu } from "../modules/commands/menus/floating-menu.client.mjs";
11
12
  import { InlineCommandMenu, InlineCommandMenuLoading, InlineCommandMenuProps } from "../modules/commands/menus/inline-menu.client.mjs";
12
13
  import { ResponsiveCommandMenu, ResponsiveCommandMenuLoading } from "../modules/commands/menus/responsive-menu.client.mjs";
13
14
  import { ArchiveCommand, ArchiveCommandProps, RestoreCommand } from "../modules/commands/utils/archive-command.client.mjs";
14
15
  import { DeleteCommand, DeleteCommandProps, SingleDeleteCommand } from "../modules/commands/utils/delete-command.client.mjs";
15
- export { ArchiveCommand, ArchiveCommandProps, BulkCommandAction, CommandAction, CommandActionResult, CommandAlertDialog, CommandAlertDialogAction, CommandAlertDialogCancel, CommandAlertDialogContent, CommandAlertDialogDescription, CommandAlertDialogFooter, CommandAlertDialogHeader, CommandAlertDialogTitle, CommandAlertDialogTrigger, CommandClick, CommandClickProps, CommandDialog, CommandDialogContent, CommandDialogDescription, CommandDialogFooter, CommandDialogHeader, CommandDialogTitle, CommandDialogTrigger, CommandDropdown, CommandDropdownContent, CommandDropdownItem, CommandDropdownProps, CommandDropdownTrigger, CommandEmpty, CommandEmptyProps, CommandFormDialog, CommandFormDialogCancel, CommandFormDialogContent, CommandFormDialogContentProps, CommandFormDialogContentProvider, CommandFormDialogDescription, CommandFormDialogFields, CommandFormDialogFooter, CommandFormDialogHeader, CommandFormDialogSubmit, CommandFormDialogTitle, CommandFormDialogTrigger, CommandIcon, CommandLabel, CommandMutationMeta, CommandTrigger, CommandTriggerContext, ContextCommandMenu, ContextCommandMenuContent, ContextCommandMenuTrigger, DeleteCommand, DeleteCommandProps, DropdownCommandMenu, DropdownCommandMenuLoading, InlineCommandMenu, InlineCommandMenuLoading, InlineCommandMenuProps, ResponsiveCommandMenu, ResponsiveCommandMenuLoading, RestoreCommand, SingleDeleteCommand, useCommandMutation };
16
+ export { ArchiveCommand, ArchiveCommandProps, BulkCommandAction, CommandAction, CommandActionResult, CommandAlertDialog, CommandAlertDialogAction, CommandAlertDialogCancel, CommandAlertDialogContent, CommandAlertDialogDescription, CommandAlertDialogFooter, CommandAlertDialogHeader, CommandAlertDialogTitle, CommandAlertDialogTrigger, CommandClick, CommandClickProps, CommandDialog, CommandDialogContent, CommandDialogDescription, CommandDialogFooter, CommandDialogHeader, CommandDialogTitle, CommandDialogTrigger, CommandDropdown, CommandDropdownContent, CommandDropdownItem, CommandDropdownProps, CommandDropdownTrigger, CommandEmpty, CommandEmptyProps, CommandFormDialog, CommandFormDialogCancel, CommandFormDialogContent, CommandFormDialogContentProps, CommandFormDialogContentProvider, CommandFormDialogDescription, CommandFormDialogFields, CommandFormDialogFooter, CommandFormDialogHeader, CommandFormDialogSubmit, CommandFormDialogTitle, CommandFormDialogTrigger, CommandIcon, CommandLabel, CommandMutationMeta, CommandTrigger, CommandTriggerContext, ContextCommandMenu, ContextCommandMenuContent, ContextCommandMenuTrigger, DeleteCommand, DeleteCommandProps, DropdownCommandMenu, DropdownCommandMenuLoading, FloatingCommandMenu, InlineCommandMenu, InlineCommandMenuLoading, InlineCommandMenuProps, ResponsiveCommandMenu, ResponsiveCommandMenuLoading, RestoreCommand, SingleDeleteCommand, useCommandMutation };
@@ -7,10 +7,11 @@ import { CommandDropdown, CommandDropdownContent, CommandDropdownItem, CommandDr
7
7
  import { CommandEmpty } from "../modules/commands/components/empty-command.client.mjs";
8
8
  import { ContextCommandMenu, ContextCommandMenuContent, ContextCommandMenuTrigger } from "../modules/commands/menus/context-menu.client.mjs";
9
9
  import { DropdownCommandMenu, DropdownCommandMenuLoading } from "../modules/commands/menus/dropdown-menu.client.mjs";
10
+ import { FloatingCommandMenu } from "../modules/commands/menus/floating-menu.client.mjs";
10
11
  import { InlineCommandMenu, InlineCommandMenuLoading } from "../modules/commands/menus/inline-menu.client.mjs";
11
12
  import { ResponsiveCommandMenu, ResponsiveCommandMenuLoading } from "../modules/commands/menus/responsive-menu.client.mjs";
12
13
  import { ArchiveCommand, RestoreCommand } from "../modules/commands/utils/archive-command.client.mjs";
13
14
  import { DeleteCommand, SingleDeleteCommand } from "../modules/commands/utils/delete-command.client.mjs";
14
15
  import { CommandFormDialog, CommandFormDialogCancel, CommandFormDialogContent, CommandFormDialogContentProvider, CommandFormDialogDescription, CommandFormDialogFields, CommandFormDialogFooter, CommandFormDialogHeader, CommandFormDialogSubmit, CommandFormDialogTitle, CommandFormDialogTrigger } from "../modules/commands/components/form-dialog-command.client.mjs";
15
16
 
16
- export { ArchiveCommand, CommandAlertDialog, CommandAlertDialogAction, CommandAlertDialogCancel, CommandAlertDialogContent, CommandAlertDialogDescription, CommandAlertDialogFooter, CommandAlertDialogHeader, CommandAlertDialogTitle, CommandAlertDialogTrigger, CommandClick, CommandDialog, CommandDialogContent, CommandDialogDescription, CommandDialogFooter, CommandDialogHeader, CommandDialogTitle, CommandDialogTrigger, CommandDropdown, CommandDropdownContent, CommandDropdownItem, CommandDropdownTrigger, CommandEmpty, CommandFormDialog, CommandFormDialogCancel, CommandFormDialogContent, CommandFormDialogContentProvider, CommandFormDialogDescription, CommandFormDialogFields, CommandFormDialogFooter, CommandFormDialogHeader, CommandFormDialogSubmit, CommandFormDialogTitle, CommandFormDialogTrigger, CommandIcon, CommandLabel, CommandTrigger, CommandTriggerContext, ContextCommandMenu, ContextCommandMenuContent, ContextCommandMenuTrigger, DeleteCommand, DropdownCommandMenu, DropdownCommandMenuLoading, InlineCommandMenu, InlineCommandMenuLoading, ResponsiveCommandMenu, ResponsiveCommandMenuLoading, RestoreCommand, SingleDeleteCommand, useCommandMutation };
17
+ export { ArchiveCommand, CommandAlertDialog, CommandAlertDialogAction, CommandAlertDialogCancel, CommandAlertDialogContent, CommandAlertDialogDescription, CommandAlertDialogFooter, CommandAlertDialogHeader, CommandAlertDialogTitle, CommandAlertDialogTrigger, CommandClick, CommandDialog, CommandDialogContent, CommandDialogDescription, CommandDialogFooter, CommandDialogHeader, CommandDialogTitle, CommandDialogTrigger, CommandDropdown, CommandDropdownContent, CommandDropdownItem, CommandDropdownTrigger, CommandEmpty, CommandFormDialog, CommandFormDialogCancel, CommandFormDialogContent, CommandFormDialogContentProvider, CommandFormDialogDescription, CommandFormDialogFields, CommandFormDialogFooter, CommandFormDialogHeader, CommandFormDialogSubmit, CommandFormDialogTitle, CommandFormDialogTrigger, CommandIcon, CommandLabel, CommandTrigger, CommandTriggerContext, ContextCommandMenu, ContextCommandMenuContent, ContextCommandMenuTrigger, DeleteCommand, DropdownCommandMenu, DropdownCommandMenuLoading, FloatingCommandMenu, InlineCommandMenu, InlineCommandMenuLoading, ResponsiveCommandMenu, ResponsiveCommandMenuLoading, RestoreCommand, SingleDeleteCommand, useCommandMutation };
@@ -81,11 +81,11 @@ function EditorMenuNodes() {
81
81
  children: [Icon && /* @__PURE__ */ jsx(Icon, { className: "size-3.5" }), selectedBlock?.label ?? "Select a block"]
82
82
  }), /* @__PURE__ */ jsx(ChevronDown, { className: "size-3.5" })]
83
83
  })
84
- }), /* @__PURE__ */ jsx(DropdownMenuContent, { children: filteredBlocks.map(({ label, icon: Icon, handler }, index) => /* @__PURE__ */ jsxs(DropdownMenuItem, {
84
+ }), /* @__PURE__ */ jsx(DropdownMenuContent, { children: filteredBlocks.map(({ label, icon: Icon, handler }) => /* @__PURE__ */ jsxs(DropdownMenuItem, {
85
85
  onClick: () => handler(editor),
86
86
  className: "flex items-center gap-2",
87
87
  children: [Icon && /* @__PURE__ */ jsx(Icon, { className: "size-3.5" }), label]
88
- }, index)) })] });
88
+ }, label)) })] });
89
89
  }
90
90
 
91
91
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"menu-nodes.client.mjs","names":[],"sources":["../../../../src/components/editor/components/menu-nodes.client.tsx"],"sourcesContent":["import type { Editor } from \"@tiptap/react\";\nimport {\n ChevronDown,\n Heading1Icon,\n Heading2Icon,\n Heading3Icon,\n Heading4Icon,\n Heading5Icon,\n ListIcon,\n ListOrderedIcon,\n TextIcon,\n} from \"lucide-react\";\nimport { useContext } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport type { EditorExtensionsConfigResult } from \"../lib/extensions\";\nimport { EditorContext } from \"./editor.client\";\n\nconst blocks = [\n {\n label: \"Paragraaf\",\n icon: TextIcon,\n selected: (editor: Editor) => editor.isActive(\"paragraph\"),\n handler: (editor: Editor) => editor.commands.setParagraph(),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.paragraph,\n },\n {\n label: \"Titel 1\",\n icon: Heading1Icon,\n selected: (editor: Editor) => editor.isActive(\"heading\", { level: 1 }),\n handler: (editor: Editor) => editor.commands.setHeading({ level: 1 }),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.heading,\n },\n {\n label: \"Titel 2\",\n icon: Heading2Icon,\n selected: (editor: Editor) => editor.isActive(\"heading\", { level: 2 }),\n handler: (editor: Editor) => editor.commands.setHeading({ level: 2 }),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.heading,\n },\n {\n label: \"Titel 3\",\n icon: Heading3Icon,\n selected: (editor: Editor) => editor.isActive(\"heading\", { level: 3 }),\n handler: (editor: Editor) => editor.commands.setHeading({ level: 3 }),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.heading,\n },\n {\n label: \"Titel 4\",\n icon: Heading4Icon,\n selected: (editor: Editor) => editor.isActive(\"heading\", { level: 4 }),\n handler: (editor: Editor) => editor.commands.setHeading({ level: 4 }),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.heading,\n },\n {\n label: \"Titel 5\",\n icon: Heading5Icon,\n selected: (editor: Editor) => editor.isActive(\"heading\", { level: 5 }),\n handler: (editor: Editor) => editor.commands.setHeading({ level: 5 }),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.heading,\n },\n {\n label: \"Numbered List\",\n icon: ListOrderedIcon,\n selected: (editor: Editor) => editor.isActive(\"orderedList\"),\n handler: (editor: Editor) => editor.commands.toggleOrderedList(),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.orderedList,\n },\n {\n label: \"Bulleted List\",\n icon: ListIcon,\n selected: (editor: Editor) => editor.isActive(\"bulletList\"),\n handler: (editor: Editor) => editor.commands.toggleBulletList(),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.bulletList,\n },\n];\n\nexport function EditorMenuNodes() {\n const { editor, extensions } = useContext(EditorContext);\n\n const selectedBlock = blocks.find((block) => block.selected(editor));\n const Icon = selectedBlock?.icon;\n\n const filteredBlocks = blocks.filter((block) => !block.hidden(extensions));\n\n if (filteredBlocks.length === 0) return null;\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"flex items-center gap-8 p-2\">\n <span className=\"flex items-center gap-2\">\n {Icon && <Icon className=\"size-3.5\" />}\n {selectedBlock?.label ?? \"Select a block\"}\n </span>\n\n <ChevronDown className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent>\n {filteredBlocks.map(({ label, icon: Icon, handler }, index) => (\n <DropdownMenuItem\n key={index}\n onClick={() => handler(editor)}\n className=\"flex items-center gap-2\"\n >\n {Icon && <Icon className=\"size-3.5\" />}\n {label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":";;;;;;;;AAuBA,MAAM,SAAS;CACb;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,YAAY;EAC1D,UAAU,WAAmB,OAAO,SAAS,cAAc;EAC3D,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACtE,UAAU,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACrE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACtE,UAAU,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACrE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACtE,UAAU,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACrE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACtE,UAAU,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACrE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACtE,UAAU,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACrE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,cAAc;EAC5D,UAAU,WAAmB,OAAO,SAAS,mBAAmB;EAChE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,aAAa;EAC3D,UAAU,WAAmB,OAAO,SAAS,kBAAkB;EAC/D,SAAS,eAA6C,CAAC,WAAW;EACnE;CACF;AAED,SAAgB,kBAAkB;CAChC,MAAM,EAAE,QAAQ,eAAe,WAAW,cAAc;CAExD,MAAM,gBAAgB,OAAO,MAAM,UAAU,MAAM,SAAS,OAAO,CAAC;CACpE,MAAM,OAAO,eAAe;CAE5B,MAAM,iBAAiB,OAAO,QAAQ,UAAU,CAAC,MAAM,OAAO,WAAW,CAAC;AAE1E,KAAI,eAAe,WAAW,EAAG,QAAO;AAExC,QACE,qBAAC,2BACC,oBAAC;EAAoB;YACnB,qBAAC;GAAO,SAAQ;GAAU,MAAK;GAAK,WAAU;cAC5C,qBAAC;IAAK,WAAU;eACb,QAAQ,oBAAC,QAAK,WAAU,aAAa,EACrC,eAAe,SAAS;KACpB,EAEP,oBAAC,eAAY,WAAU,aAAa;IAC7B;GACW,EAEtB,oBAAC,iCACE,eAAe,KAAK,EAAE,OAAO,MAAM,MAAM,WAAW,UACnD,qBAAC;EAEC,eAAe,QAAQ,OAAO;EAC9B,WAAU;aAET,QAAQ,oBAAC,QAAK,WAAU,aAAa,EACrC;IALI,MAMY,CACnB,GACkB,IACT"}
1
+ {"version":3,"file":"menu-nodes.client.mjs","names":[],"sources":["../../../../src/components/editor/components/menu-nodes.client.tsx"],"sourcesContent":["import type { Editor } from \"@tiptap/react\";\nimport {\n ChevronDown,\n Heading1Icon,\n Heading2Icon,\n Heading3Icon,\n Heading4Icon,\n Heading5Icon,\n ListIcon,\n ListOrderedIcon,\n TextIcon,\n} from \"lucide-react\";\nimport { useContext } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport type { EditorExtensionsConfigResult } from \"../lib/extensions\";\nimport { EditorContext } from \"./editor.client\";\n\nconst blocks = [\n {\n label: \"Paragraaf\",\n icon: TextIcon,\n selected: (editor: Editor) => editor.isActive(\"paragraph\"),\n handler: (editor: Editor) => editor.commands.setParagraph(),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.paragraph,\n },\n {\n label: \"Titel 1\",\n icon: Heading1Icon,\n selected: (editor: Editor) => editor.isActive(\"heading\", { level: 1 }),\n handler: (editor: Editor) => editor.commands.setHeading({ level: 1 }),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.heading,\n },\n {\n label: \"Titel 2\",\n icon: Heading2Icon,\n selected: (editor: Editor) => editor.isActive(\"heading\", { level: 2 }),\n handler: (editor: Editor) => editor.commands.setHeading({ level: 2 }),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.heading,\n },\n {\n label: \"Titel 3\",\n icon: Heading3Icon,\n selected: (editor: Editor) => editor.isActive(\"heading\", { level: 3 }),\n handler: (editor: Editor) => editor.commands.setHeading({ level: 3 }),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.heading,\n },\n {\n label: \"Titel 4\",\n icon: Heading4Icon,\n selected: (editor: Editor) => editor.isActive(\"heading\", { level: 4 }),\n handler: (editor: Editor) => editor.commands.setHeading({ level: 4 }),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.heading,\n },\n {\n label: \"Titel 5\",\n icon: Heading5Icon,\n selected: (editor: Editor) => editor.isActive(\"heading\", { level: 5 }),\n handler: (editor: Editor) => editor.commands.setHeading({ level: 5 }),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.heading,\n },\n {\n label: \"Numbered List\",\n icon: ListOrderedIcon,\n selected: (editor: Editor) => editor.isActive(\"orderedList\"),\n handler: (editor: Editor) => editor.commands.toggleOrderedList(),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.orderedList,\n },\n {\n label: \"Bulleted List\",\n icon: ListIcon,\n selected: (editor: Editor) => editor.isActive(\"bulletList\"),\n handler: (editor: Editor) => editor.commands.toggleBulletList(),\n hidden: (extensions: EditorExtensionsConfigResult) => !extensions.bulletList,\n },\n];\n\nexport function EditorMenuNodes() {\n const { editor, extensions } = useContext(EditorContext);\n\n const selectedBlock = blocks.find((block) => block.selected(editor));\n const Icon = selectedBlock?.icon;\n\n const filteredBlocks = blocks.filter((block) => !block.hidden(extensions));\n\n if (filteredBlocks.length === 0) return null;\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"flex items-center gap-8 p-2\">\n <span className=\"flex items-center gap-2\">\n {Icon && <Icon className=\"size-3.5\" />}\n {selectedBlock?.label ?? \"Select a block\"}\n </span>\n\n <ChevronDown className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent>\n {filteredBlocks.map(({ label, icon: Icon, handler }) => (\n <DropdownMenuItem\n key={label}\n onClick={() => handler(editor)}\n className=\"flex items-center gap-2\"\n >\n {Icon && <Icon className=\"size-3.5\" />}\n {label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":";;;;;;;;AAuBA,MAAM,SAAS;CACb;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,YAAY;EAC1D,UAAU,WAAmB,OAAO,SAAS,cAAc;EAC3D,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACtE,UAAU,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACrE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACtE,UAAU,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACrE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACtE,UAAU,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACrE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACtE,UAAU,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACrE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACtE,UAAU,WAAmB,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EACrE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,cAAc;EAC5D,UAAU,WAAmB,OAAO,SAAS,mBAAmB;EAChE,SAAS,eAA6C,CAAC,WAAW;EACnE;CACD;EACE,OAAO;EACP,MAAM;EACN,WAAW,WAAmB,OAAO,SAAS,aAAa;EAC3D,UAAU,WAAmB,OAAO,SAAS,kBAAkB;EAC/D,SAAS,eAA6C,CAAC,WAAW;EACnE;CACF;AAED,SAAgB,kBAAkB;CAChC,MAAM,EAAE,QAAQ,eAAe,WAAW,cAAc;CAExD,MAAM,gBAAgB,OAAO,MAAM,UAAU,MAAM,SAAS,OAAO,CAAC;CACpE,MAAM,OAAO,eAAe;CAE5B,MAAM,iBAAiB,OAAO,QAAQ,UAAU,CAAC,MAAM,OAAO,WAAW,CAAC;AAE1E,KAAI,eAAe,WAAW,EAAG,QAAO;AAExC,QACE,qBAAC,2BACC,oBAAC;EAAoB;YACnB,qBAAC;GAAO,SAAQ;GAAU,MAAK;GAAK,WAAU;cAC5C,qBAAC;IAAK,WAAU;eACb,QAAQ,oBAAC,QAAK,WAAU,aAAa,EACrC,eAAe,SAAS;KACpB,EAEP,oBAAC,eAAY,WAAU,aAAa;IAC7B;GACW,EAEtB,oBAAC,iCACE,eAAe,KAAK,EAAE,OAAO,MAAM,MAAM,cACxC,qBAAC;EAEC,eAAe,QAAQ,OAAO;EAC9B,WAAU;aAET,QAAQ,oBAAC,QAAK,WAAU,aAAa,EACrC;IALI,MAMY,CACnB,GACkB,IACT"}
@@ -5,10 +5,10 @@ import * as react_jsx_runtime0 from "react/jsx-runtime";
5
5
  * DateTimeInput
6
6
  */
7
7
  type DateTimeInputProps = Omit<React.ComponentProps<"input">, "type" | "value" | "defaultValue"> & {
8
- defaultValue?: Date;
9
- value?: Date;
10
- onValueChange?: (date: Date | undefined) => void;
11
- onValueBlur?: (date: Date | undefined) => void;
8
+ defaultValue?: Date | string;
9
+ value?: Date | string;
10
+ onValueChange?: (date: string | undefined) => void;
11
+ onValueBlur?: (date: string | undefined) => void;
12
12
  };
13
13
  declare function DateTimeInput({
14
14
  className,
@@ -1 +1 @@
1
- {"version":3,"file":"input-date-time.d.mts","names":[],"sources":["../../../src/components/ui/input-date-time.tsx"],"mappings":";;;;;;KAOK,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,cAAA;EACnC,YAAA,GAAe,IAAA;EACf,KAAA,GAAQ,IAAA;EACR,aAAA,IAAiB,IAAA,EAAM,IAAA;EACvB,WAAA,IAAe,IAAA,EAAM,IAAA;AAAA;AAAA,iBAGP,aAAA,CAAA;EACd,SAAA;EACA,aAAA;EACA,QAAA;EACA,WAAA;EACA,MAAA;EAAA,GACG;AAAA,GACF,kBAAA,GAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"input-date-time.d.mts","names":[],"sources":["../../../src/components/ui/input-date-time.tsx"],"mappings":";;;;;;KAOK,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,cAAA;EACnC,YAAA,GAAe,IAAA;EACf,KAAA,GAAQ,IAAA;EACR,aAAA,IAAiB,IAAA;EACjB,WAAA,IAAe,IAAA;AAAA;AAAA,iBAGD,aAAA,CAAA;EACd,SAAA;EACA,aAAA;EACA,QAAA;EACA,WAAA;EACA,MAAA;EAAA,GACG;AAAA,GACF,kBAAA,GAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -8,21 +8,19 @@ function DateTimeInput({ className, onValueChange, onChange, onValueBlur, onBlur
8
8
  /**
9
9
  * Transform Date to string in the format "yyyy-MM-ddTHH:mm" for the input value. If the value is not a Date, use undefined.
10
10
  */
11
- const defaultValue = props.defaultValue instanceof Date ? format(props.defaultValue, "yyyy-MM-dd'T'HH:mm") : void 0;
12
- const value = props.value && props.value instanceof Date ? format(props.value, "yyyy-MM-dd'T'HH:mm") : void 0;
11
+ const defaultValue = props.defaultValue instanceof Date ? format(props.defaultValue, "yyyy-MM-dd'T'HH:mm") : typeof props.defaultValue === "string" ? props.defaultValue : void 0;
12
+ const value = props.value && props.value instanceof Date ? format(props.value, "yyyy-MM-dd'T'HH:mm") : typeof props.value === "string" ? props.value : void 0;
13
13
  return /* @__PURE__ */ jsx(Input, {
14
14
  ...props,
15
15
  type: "datetime-local",
16
16
  defaultValue,
17
17
  value,
18
18
  onChange: (e) => {
19
- const date = new Date(e.target.value);
20
- onValueChange?.(date ?? void 0);
19
+ onValueChange?.(e.target.value ?? void 0);
21
20
  onChange?.(e);
22
21
  },
23
22
  onBlur: (e) => {
24
- const date = new Date(e.target.value);
25
- onValueBlur?.(date ?? void 0);
23
+ onValueBlur?.(e.target.value ?? void 0);
26
24
  onBlur?.(e);
27
25
  },
28
26
  className: cn("appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none", className)
@@ -1 +1 @@
1
- {"version":3,"file":"input-date-time.mjs","names":[],"sources":["../../../src/components/ui/input-date-time.tsx"],"sourcesContent":["import { format } from \"date-fns\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Input } from \"./input\";\n\n/**\n * DateTimeInput\n */\ntype DateTimeInputProps = Omit<React.ComponentProps<\"input\">, \"type\" | \"value\" | \"defaultValue\"> & {\n defaultValue?: Date;\n value?: Date;\n onValueChange?: (date: Date | undefined) => void;\n onValueBlur?: (date: Date | undefined) => void;\n};\n\nexport function DateTimeInput({\n className,\n onValueChange,\n onChange,\n onValueBlur,\n onBlur,\n ...props\n}: DateTimeInputProps) {\n /**\n * Transform Date to string in the format \"yyyy-MM-ddTHH:mm\" for the input value. If the value is not a Date, use undefined.\n */\n const defaultValue =\n props.defaultValue instanceof Date\n ? format(props.defaultValue, \"yyyy-MM-dd'T'HH:mm\")\n : undefined;\n\n const value =\n props.value && props.value instanceof Date\n ? format(props.value, \"yyyy-MM-dd'T'HH:mm\")\n : undefined;\n\n return (\n <Input\n {...props}\n type=\"datetime-local\"\n defaultValue={defaultValue}\n value={value}\n onChange={(e) => {\n const date = new Date(e.target.value);\n onValueChange?.(date ?? undefined);\n onChange?.(e);\n }}\n onBlur={(e) => {\n const date = new Date(e.target.value);\n onValueBlur?.(date ?? undefined);\n onBlur?.(e);\n }}\n className={cn(\n \"appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\",\n className,\n )}\n />\n );\n}\n"],"mappings":";;;;;;AAcA,SAAgB,cAAc,EAC5B,WACA,eACA,UACA,aACA,QACA,GAAG,SACkB;;;;CAIrB,MAAM,eACJ,MAAM,wBAAwB,OAC1B,OAAO,MAAM,cAAc,qBAAqB,GAChD;CAEN,MAAM,QACJ,MAAM,SAAS,MAAM,iBAAiB,OAClC,OAAO,MAAM,OAAO,qBAAqB,GACzC;AAEN,QACE,oBAAC;EACC,GAAI;EACJ,MAAK;EACS;EACP;EACP,WAAW,MAAM;GACf,MAAM,OAAO,IAAI,KAAK,EAAE,OAAO,MAAM;AACrC,mBAAgB,QAAQ,OAAU;AAClC,cAAW,EAAE;;EAEf,SAAS,MAAM;GACb,MAAM,OAAO,IAAI,KAAK,EAAE,OAAO,MAAM;AACrC,iBAAc,QAAQ,OAAU;AAChC,YAAS,EAAE;;EAEb,WAAW,GACT,wHACA,UACD;GACD"}
1
+ {"version":3,"file":"input-date-time.mjs","names":[],"sources":["../../../src/components/ui/input-date-time.tsx"],"sourcesContent":["import { format } from \"date-fns\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Input } from \"./input\";\n\n/**\n * DateTimeInput\n */\ntype DateTimeInputProps = Omit<React.ComponentProps<\"input\">, \"type\" | \"value\" | \"defaultValue\"> & {\n defaultValue?: Date | string;\n value?: Date | string;\n onValueChange?: (date: string | undefined) => void;\n onValueBlur?: (date: string | undefined) => void;\n};\n\nexport function DateTimeInput({\n className,\n onValueChange,\n onChange,\n onValueBlur,\n onBlur,\n ...props\n}: DateTimeInputProps) {\n /**\n * Transform Date to string in the format \"yyyy-MM-ddTHH:mm\" for the input value. If the value is not a Date, use undefined.\n */\n const defaultValue =\n props.defaultValue instanceof Date\n ? format(props.defaultValue, \"yyyy-MM-dd'T'HH:mm\")\n : typeof props.defaultValue === \"string\"\n ? props.defaultValue\n : undefined;\n\n const value =\n props.value && props.value instanceof Date\n ? format(props.value, \"yyyy-MM-dd'T'HH:mm\")\n : typeof props.value === \"string\"\n ? props.value\n : undefined;\n\n return (\n <Input\n {...props}\n type=\"datetime-local\"\n defaultValue={defaultValue}\n value={value}\n onChange={(e) => {\n onValueChange?.(e.target.value ?? undefined);\n onChange?.(e);\n }}\n onBlur={(e) => {\n onValueBlur?.(e.target.value ?? undefined);\n onBlur?.(e);\n }}\n className={cn(\n \"appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\",\n className,\n )}\n />\n );\n}\n"],"mappings":";;;;;;AAcA,SAAgB,cAAc,EAC5B,WACA,eACA,UACA,aACA,QACA,GAAG,SACkB;;;;CAIrB,MAAM,eACJ,MAAM,wBAAwB,OAC1B,OAAO,MAAM,cAAc,qBAAqB,GAChD,OAAO,MAAM,iBAAiB,WAC5B,MAAM,eACN;CAER,MAAM,QACJ,MAAM,SAAS,MAAM,iBAAiB,OAClC,OAAO,MAAM,OAAO,qBAAqB,GACzC,OAAO,MAAM,UAAU,WACrB,MAAM,QACN;AAER,QACE,oBAAC;EACC,GAAI;EACJ,MAAK;EACS;EACP;EACP,WAAW,MAAM;AACf,mBAAgB,EAAE,OAAO,SAAS,OAAU;AAC5C,cAAW,EAAE;;EAEf,SAAS,MAAM;AACb,iBAAc,EAAE,OAAO,SAAS,OAAU;AAC1C,YAAS,EAAE;;EAEb,WAAW,GACT,wHACA,UACD;GACD"}
@@ -1,4 +1,4 @@
1
- import { useInlineEdit, useInlineEditOptions } from "../modules/inline-edit/hooks/use-inline.client.mjs";
1
+ import { UseInlineEditProps, useInlineEdit, useInlineEditOptions } from "../modules/inline-edit/hooks/use-inline.client.mjs";
2
2
  import { InlineCombobox, InlineComboboxProps } from "../modules/inline-edit/components/combobox.client.mjs";
3
3
  import { InlineComboboxDropdown, InlineEditComboboxDropdownProps } from "../modules/inline-edit/components/combobox-dropdown.client.mjs";
4
4
  import { InlineDateInput } from "../modules/inline-edit/components/date-input.client.mjs";
@@ -12,4 +12,4 @@ import { InlineSelect, InlineSelectContent, InlineSelectContentProps, InlineSele
12
12
  import { InlineSwitch } from "../modules/inline-edit/components/switch.client.mjs";
13
13
  import { InlineEditToggleProps, InlineToggle } from "../modules/inline-edit/components/toggle.client.mjs";
14
14
  import { InlineEditContextParams, InlineEditProvider, useInlineEditContext } from "../modules/inline-edit/hooks/context.client.mjs";
15
- export { InlineCombobox, InlineComboboxDropdown, InlineComboboxProps, InlineDateInput, InlineDatePicker, InlineDateTimeInput, InlineDecimalInput, InlineEditComboboxDropdownProps, InlineEditContextParams, InlineEditProvider, InlineEditToggleProps, InlineEditor, InlineEditorProps, InlineNumberInput, InlineRecipientInput, InlineSelect, InlineSelectContent, InlineSelectContentProps, InlineSelectItem, InlineSelectItenProps, InlineSelectTrigger, InlineSelectTriggerProps, InlineSelectValue, InlineSelectValueProps, InlineStringInput, InlineStringInputToggle, InlineSwitch, InlineToggle, useInlineEdit, useInlineEditContext, useInlineEditOptions };
15
+ export { InlineCombobox, InlineComboboxDropdown, InlineComboboxProps, InlineDateInput, InlineDatePicker, InlineDateTimeInput, InlineDecimalInput, InlineEditComboboxDropdownProps, InlineEditContextParams, InlineEditProvider, InlineEditToggleProps, InlineEditor, InlineEditorProps, InlineNumberInput, InlineRecipientInput, InlineSelect, InlineSelectContent, InlineSelectContentProps, InlineSelectItem, InlineSelectItenProps, InlineSelectTrigger, InlineSelectTriggerProps, InlineSelectValue, InlineSelectValueProps, InlineStringInput, InlineStringInputToggle, InlineSwitch, InlineToggle, UseInlineEditProps, useInlineEdit, useInlineEditContext, useInlineEditOptions };
@@ -1 +1 @@
1
- {"version":3,"file":"use-indicator.d.mts","names":[],"sources":["../../../src/lib/hooks/use-indicator.tsx"],"mappings":";;;;;;;KAQY,eAAA;;;;iBAKI,iBAAA,CAAA;;;;;;;;KAiCX,oBAAA;EACH,MAAA,EAAQ,eAAA;EACR,SAAA,EAAW,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,cAAA,CAAe,eAAA;EAC/C,eAAA,EAAiB,KAAA,CAAM,uBAAA;AAAA;AAAA,cAGZ,gBAAA,EAAgB,KAAA,CAAA,OAAA,CAAA,oBAAA;;;;cAKhB,YAAA,QAAY,oBAAA;;;;iBAKT,wBAAA,CAAA;EAA2B;AAAA;EAAc,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"use-indicator.d.mts","names":[],"sources":["../../../src/lib/hooks/use-indicator.tsx"],"mappings":";;;;;;;KAQY,eAAA;;;;iBAKI,iBAAA,CAAA;;;;;;;;KA0CX,oBAAA;EACH,MAAA,EAAQ,eAAA;EACR,SAAA,EAAW,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,cAAA,CAAe,eAAA;EAC/C,eAAA,EAAiB,KAAA,CAAM,uBAAA;AAAA;AAAA,cAGZ,gBAAA,EAAgB,KAAA,CAAA,OAAA,CAAA,oBAAA;;;;cAKhB,YAAA,QAAY,oBAAA;;;;iBAKT,wBAAA,CAAA;EAA2B;AAAA;EAAc,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { jsx } from "react/jsx-runtime";
4
- import { createContext, useContext, useEffect, useState, useTransition } from "react";
4
+ import { createContext, useCallback, useContext, useEffect, useState, useTransition } from "react";
5
5
 
6
6
  //#region src/lib/hooks/use-indicator.tsx
7
7
  /**
@@ -11,7 +11,7 @@ function useLocalIndicator() {
11
11
  /**
12
12
  * Start transition
13
13
  */
14
- const [isPending, startTransition] = useTransition();
14
+ const [, startTransitionBase] = useTransition();
15
15
  /**
16
16
  * Status of the inline edit indicator
17
17
  */
@@ -19,17 +19,20 @@ function useLocalIndicator() {
19
19
  /**
20
20
  * Set status to pending when isPending is true
21
21
  */
22
- useEffect(() => {
23
- if (isPending) setStatus("pending");
24
- }, [isPending]);
22
+ const startTransition = useCallback((callback) => {
23
+ setStatus("pending");
24
+ startTransitionBase(callback);
25
+ }, []);
25
26
  /**
26
27
  * Set status back to idle after 1.5 seconds when status is succes
27
28
  * Set status back to idle after 3 seconds when status is error
28
29
  */
29
- useEffect(() => {
30
- if (status === "success") setTimeout(() => setStatus("idle"), 1e3);
31
- if (status === "error") setTimeout(() => setStatus("idle"), 2e3);
30
+ const resetAfterDelay = useCallback(() => {
31
+ if (status !== "success" && status !== "error") return void 0;
32
+ const timeout = setTimeout(() => setStatus("idle"), status === "success" ? 1e3 : 2e3);
33
+ return () => clearTimeout(timeout);
32
34
  }, [status]);
35
+ useEffect(() => resetAfterDelay(), [resetAfterDelay]);
33
36
  return {
34
37
  status,
35
38
  setStatus,
@@ -1 +1 @@
1
- {"version":3,"file":"use-indicator.mjs","names":[],"sources":["../../../src/lib/hooks/use-indicator.tsx"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport { createContext, useContext, useEffect, useState, useTransition } from \"react\";\n\n/**\n * Indicator status\n */\nexport type IndicatorStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\n/**\n * Use local indicator\n */\nexport function useLocalIndicator() {\n /**\n * Start transition\n */\n const [isPending, startTransition] = useTransition();\n\n /**\n * Status of the inline edit indicator\n */\n const [status, setStatus] = useState<IndicatorStatus>(\"idle\");\n\n /**\n * Set status to pending when isPending is true\n */\n useEffect(() => {\n if (isPending) setStatus(\"pending\");\n }, [isPending]);\n\n /**\n * Set status back to idle after 1.5 seconds when status is succes\n * Set status back to idle after 3 seconds when status is error\n */\n useEffect(() => {\n if (status === \"success\") setTimeout(() => setStatus(\"idle\"), 1000);\n if (status === \"error\") setTimeout(() => setStatus(\"idle\"), 2000);\n }, [status]);\n\n return { status, setStatus, startTransition };\n}\n\n/**\n * Indicator context\n */\ntype IndicatorContextType = {\n status: IndicatorStatus;\n setStatus: React.Dispatch<React.SetStateAction<IndicatorStatus>>;\n startTransition: React.TransitionStartFunction;\n};\n\nexport const IndicatorContext = createContext<IndicatorContextType>({} as IndicatorContextType);\n\n/**\n * Inline edit indicator context\n */\nexport const useIndicator = () => useContext(IndicatorContext);\n\n/**\n * Indicator context provider\n */\nexport function IndicatorContextProvider({ children }: { children: React.ReactNode }) {\n const { status, setStatus, startTransition } = useLocalIndicator();\n\n return (\n <IndicatorContext.Provider value={{ status, setStatus, startTransition }}>\n {children}\n </IndicatorContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;;AAaA,SAAgB,oBAAoB;;;;CAIlC,MAAM,CAAC,WAAW,mBAAmB,eAAe;;;;CAKpD,MAAM,CAAC,QAAQ,aAAa,SAA0B,OAAO;;;;AAK7D,iBAAgB;AACd,MAAI,UAAW,WAAU,UAAU;IAClC,CAAC,UAAU,CAAC;;;;;AAMf,iBAAgB;AACd,MAAI,WAAW,UAAW,kBAAiB,UAAU,OAAO,EAAE,IAAK;AACnE,MAAI,WAAW,QAAS,kBAAiB,UAAU,OAAO,EAAE,IAAK;IAChE,CAAC,OAAO,CAAC;AAEZ,QAAO;EAAE;EAAQ;EAAW;EAAiB;;AAY/C,MAAa,mBAAmB,cAAoC,EAAE,CAAyB;;;;AAK/F,MAAa,qBAAqB,WAAW,iBAAiB;;;;AAK9D,SAAgB,yBAAyB,EAAE,YAA2C;CACpF,MAAM,EAAE,QAAQ,WAAW,oBAAoB,mBAAmB;AAElE,QACE,oBAAC,iBAAiB;EAAS,OAAO;GAAE;GAAQ;GAAW;GAAiB;EACrE;GACyB"}
1
+ {"version":3,"file":"use-indicator.mjs","names":[],"sources":["../../../src/lib/hooks/use-indicator.tsx"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useState, useTransition } from \"react\";\n\n/**\n * Indicator status\n */\nexport type IndicatorStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\n/**\n * Use local indicator\n */\nexport function useLocalIndicator() {\n /**\n * Start transition\n */\n const [, startTransitionBase] = useTransition();\n\n /**\n * Status of the inline edit indicator\n */\n const [status, setStatus] = useState<IndicatorStatus>(\"idle\");\n\n /**\n * Set status to pending when isPending is true\n */\n const startTransition = useCallback<React.TransitionStartFunction>(\n (callback) => {\n setStatus(\"pending\");\n startTransitionBase(callback);\n },\n [],\n );\n\n /**\n * Set status back to idle after 1.5 seconds when status is succes\n * Set status back to idle after 3 seconds when status is error\n */\n const resetAfterDelay = useCallback(() => {\n if (status !== \"success\" && status !== \"error\") return undefined;\n\n const timeout = setTimeout(() => setStatus(\"idle\"), status === \"success\" ? 1000 : 2000);\n\n return () => clearTimeout(timeout);\n }, [status]);\n\n useEffect(() => resetAfterDelay(), [resetAfterDelay]);\n\n return { status, setStatus, startTransition };\n}\n\n/**\n * Indicator context\n */\ntype IndicatorContextType = {\n status: IndicatorStatus;\n setStatus: React.Dispatch<React.SetStateAction<IndicatorStatus>>;\n startTransition: React.TransitionStartFunction;\n};\n\nexport const IndicatorContext = createContext<IndicatorContextType>({} as IndicatorContextType);\n\n/**\n * Inline edit indicator context\n */\nexport const useIndicator = () => useContext(IndicatorContext);\n\n/**\n * Indicator context provider\n */\nexport function IndicatorContextProvider({ children }: { children: React.ReactNode }) {\n const { status, setStatus, startTransition } = useLocalIndicator();\n\n return (\n <IndicatorContext.Provider value={{ status, setStatus, startTransition }}>\n {children}\n </IndicatorContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;;AAaA,SAAgB,oBAAoB;;;;CAIlC,MAAM,GAAG,uBAAuB,eAAe;;;;CAK/C,MAAM,CAAC,QAAQ,aAAa,SAA0B,OAAO;;;;CAK7D,MAAM,kBAAkB,aACrB,aAAa;AACZ,YAAU,UAAU;AACpB,sBAAoB,SAAS;IAE/B,EAAE,CACH;;;;;CAMD,MAAM,kBAAkB,kBAAkB;AACxC,MAAI,WAAW,aAAa,WAAW,QAAS,QAAO;EAEvD,MAAM,UAAU,iBAAiB,UAAU,OAAO,EAAE,WAAW,YAAY,MAAO,IAAK;AAEvF,eAAa,aAAa,QAAQ;IACjC,CAAC,OAAO,CAAC;AAEZ,iBAAgB,iBAAiB,EAAE,CAAC,gBAAgB,CAAC;AAErD,QAAO;EAAE;EAAQ;EAAW;EAAiB;;AAY/C,MAAa,mBAAmB,cAAoC,EAAE,CAAyB;;;;AAK/F,MAAa,qBAAqB,WAAW,iBAAiB;;;;AAK9D,SAAgB,yBAAyB,EAAE,YAA2C;CACpF,MAAM,EAAE,QAAQ,WAAW,oBAAoB,mBAAmB;AAElE,QACE,oBAAC,iBAAiB;EAAS,OAAO;GAAE;GAAQ;GAAW;GAAiB;EACrE;GACyB"}
@@ -5,7 +5,7 @@ import Image from "next/image";
5
5
  //#region src/modules/auth/components/auth-layout.server.tsx
6
6
  async function AuthLayout(props) {
7
7
  return /* @__PURE__ */ jsxs("div", {
8
- className: "container relative mx-auto grid h-[100dvh] flex-col items-center justify-center lg:max-w-none lg:grid-cols-2 lg:px-0",
8
+ className: "container relative mx-auto grid h-dvh flex-col items-center justify-center lg:max-w-none lg:grid-cols-2 lg:px-0",
9
9
  children: [/* @__PURE__ */ jsxs("div", {
10
10
  className: "bg-muted relative hidden h-full flex-col p-10 text-white lg:flex dark:border-r",
11
11
  children: [
@@ -1 +1 @@
1
- {"version":3,"file":"auth-layout.server.mjs","names":[],"sources":["../../../../src/modules/auth/components/auth-layout.server.tsx"],"sourcesContent":["import Image from \"next/image\";\nimport Link from \"next/link\";\nimport type { PropsWithChildren } from \"react\";\n\nexport async function AuthLayout(props: PropsWithChildren<{ name: string }>) {\n return (\n <div className=\"container relative mx-auto grid h-[100dvh] flex-col items-center justify-center lg:max-w-none lg:grid-cols-2 lg:px-0\">\n <div className=\"bg-muted relative hidden h-full flex-col p-10 text-white lg:flex dark:border-r\">\n <Image src=\"/images/auth-background.jpeg\" alt=\"Background\" className=\"object-cover\" fill />\n\n <Link href=\"/\" className=\"relative z-20 flex items-center text-lg font-bold\">\n {props.name}\n </Link>\n\n <div className=\"relative z-20 mt-auto\">\n <blockquote className=\"space-y-2 text-sm\">Developed by NewCode</blockquote>\n </div>\n </div>\n\n {props.children}\n </div>\n );\n}\n"],"mappings":";;;;;AAIA,eAAsB,WAAW,OAA4C;AAC3E,QACE,qBAAC;EAAI,WAAU;aACb,qBAAC;GAAI,WAAU;;IACb,oBAAC;KAAM,KAAI;KAA+B,KAAI;KAAa,WAAU;KAAe;MAAO;IAE3F,oBAAC;KAAK,MAAK;KAAI,WAAU;eACtB,MAAM;MACF;IAEP,oBAAC;KAAI,WAAU;eACb,oBAAC;MAAW,WAAU;gBAAoB;OAAiC;MACvE;;IACF,EAEL,MAAM;GACH"}
1
+ {"version":3,"file":"auth-layout.server.mjs","names":[],"sources":["../../../../src/modules/auth/components/auth-layout.server.tsx"],"sourcesContent":["import Image from \"next/image\";\nimport Link from \"next/link\";\nimport type { PropsWithChildren } from \"react\";\n\nexport async function AuthLayout(props: PropsWithChildren<{ name: string }>) {\n return (\n <div className=\"container relative mx-auto grid h-dvh flex-col items-center justify-center lg:max-w-none lg:grid-cols-2 lg:px-0\">\n <div className=\"bg-muted relative hidden h-full flex-col p-10 text-white lg:flex dark:border-r\">\n <Image src=\"/images/auth-background.jpeg\" alt=\"Background\" className=\"object-cover\" fill />\n\n <Link href=\"/\" className=\"relative z-20 flex items-center text-lg font-bold\">\n {props.name}\n </Link>\n\n <div className=\"relative z-20 mt-auto\">\n <blockquote className=\"space-y-2 text-sm\">Developed by NewCode</blockquote>\n </div>\n </div>\n\n {props.children}\n </div>\n );\n}\n"],"mappings":";;;;;AAIA,eAAsB,WAAW,OAA4C;AAC3E,QACE,qBAAC;EAAI,WAAU;aACb,qBAAC;GAAI,WAAU;;IACb,oBAAC;KAAM,KAAI;KAA+B,KAAI;KAAa,WAAU;KAAe;MAAO;IAE3F,oBAAC;KAAK,MAAK;KAAI,WAAU;eACtB,MAAM;MACF;IAEP,oBAAC;KAAI,WAAU;eACb,oBAAC;MAAW,WAAU;gBAAoB;OAAiC;MACvE;;IACF,EAEL,MAAM;GACH"}
@@ -11,7 +11,14 @@ type SingleCommandMenuProps<TData, TMeta> = {
11
11
  data: TData;
12
12
  commands: CommandDef<TData, TMeta>[];
13
13
  meta?: TMeta;
14
+ onSuccess?: () => void;
15
+ };
16
+ type BulkCommandMenuProps<TData, TMeta> = {
17
+ data: TData[];
18
+ commands: CommandDef<TData, TMeta>[];
19
+ meta?: TMeta;
20
+ onSuccess?: () => void;
14
21
  };
15
22
  //#endregion
16
- export { SingleCommandMenuProps };
23
+ export { BulkCommandMenuProps, SingleCommandMenuProps };
17
24
  //# sourceMappingURL=use-command-menu.client.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-command-menu.client.d.mts","names":[],"sources":["../../../../src/modules/commands/hooks/use-command-menu.client.tsx"],"mappings":";;;;;;;;;KAWY,sBAAA;EACV,IAAA,EAAM,KAAA;EACN,QAAA,EAAU,UAAA,CAAW,KAAA,EAAO,KAAA;EAC5B,IAAA,GAAO,KAAA;AAAA"}
1
+ {"version":3,"file":"use-command-menu.client.d.mts","names":[],"sources":["../../../../src/modules/commands/hooks/use-command-menu.client.tsx"],"mappings":";;;;;;;;;KAWY,sBAAA;EACV,IAAA,EAAM,KAAA;EACN,QAAA,EAAU,UAAA,CAAW,KAAA,EAAO,KAAA;EAC5B,IAAA,GAAO,KAAA;EACP,SAAA;AAAA;AAAA,KAGU,oBAAA;EACV,IAAA,EAAM,KAAA;EACN,QAAA,EAAU,UAAA,CAAW,KAAA,EAAO,KAAA;EAC5B,IAAA,GAAO,KAAA;EACP,SAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-command-menu.client.mjs","names":[],"sources":["../../../../src/modules/commands/hooks/use-command-menu.client.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n BulkCommandDefRenderParams,\n CommandDef,\n SingleCommandDefRenderParams,\n} from \"../lib/definitions\";\n\n/**\n * Command menu props\n */\nexport type SingleCommandMenuProps<TData, TMeta> = {\n data: TData;\n commands: CommandDef<TData, TMeta>[];\n meta?: TMeta;\n};\n\nexport type BulkCommandMenuProps<TData, TMeta> = {\n data: TData[];\n commands: CommandDef<TData, TMeta>[];\n meta?: TMeta;\n};\n\n/**\n * Check if a command has an id field in the data\n */\nfunction dataHasId<TData>(data: TData) {\n return data && typeof data === \"object\" && \"id\" in data && typeof data.id === \"string\";\n}\n\n/**\n * Single command validation\n */\ntype ValidateSingleCommandParams<TData, TMeta> = {\n data: TData;\n command: CommandDef<TData, TMeta> & { mode: \"single\" };\n};\n\nfunction validateSingleCommand<TData, TMeta>({\n data,\n command,\n}: ValidateSingleCommandParams<TData, TMeta>) {\n const valid = command.conditions?.({ data });\n return Array.isArray(valid) ? valid.every(Boolean) : (valid ?? true);\n}\n\n/**\n * Single command rendering\n */\ntype RenderSingleCommandParams<TData, TMeta> = {\n data: TData;\n meta?: TMeta;\n command: CommandDef<TData, TMeta> & { mode: \"single\" };\n};\n\nfunction renderSingleCommand<TData, TMeta>({\n data,\n command,\n meta,\n}: RenderSingleCommandParams<TData, TMeta>) {\n return command.render({\n data,\n meta: meta ?? ({} as TMeta),\n ...(dataHasId(data) ? { id: (data as TData & { id: string }).id } : {}),\n } as SingleCommandDefRenderParams<TData, TMeta>);\n}\n\n/**\n * Bulk command validation\n */\ntype ValidateBulkCommandParams<TData, TMeta> = {\n data: TData[];\n command: CommandDef<TData, TMeta> & { mode: \"bulk\" };\n};\n\nfunction validateBulkCommand<TData, TMeta>({\n data,\n command,\n}: ValidateBulkCommandParams<TData, TMeta>) {\n const valid = command.conditions?.({ data });\n return Array.isArray(valid) ? valid.every(Boolean) : (valid ?? true);\n}\n\n/**\n * Bulk command rendering\n */\ntype RenderBulkCommandParams<TData, TMeta> = {\n data: TData[];\n command: CommandDef<TData, TMeta> & { mode: \"bulk\" };\n meta?: TMeta;\n};\n\nfunction renderBulkCommand<TData, TMeta>({\n data,\n command,\n meta,\n}: RenderBulkCommandParams<TData, TMeta>) {\n const ids = data.filter(dataHasId).map((data) => (data as TData & { id: string }).id);\n\n return command.render({\n data,\n meta: meta ?? ({} as TMeta),\n ...(ids.length > 0 ? { ids } : {}),\n } as BulkCommandDefRenderParams<TData, TMeta>);\n}\n\n/**\n * useSingleCommandMenu\n */\nexport function useSingleCommandMenu<TData, TMeta>({\n data,\n commands,\n meta,\n}: SingleCommandMenuProps<TData, TMeta> & { data: TData }) {\n // filter out commands that don't have valid conditions\n const validCommands = commands.filter((command) =>\n command.mode === \"single\"\n ? validateSingleCommand({ data, command })\n : validateBulkCommand({ data: [data], command }),\n );\n\n function renderCommand(command: (typeof validCommands)[number]) {\n return command.mode === \"single\"\n ? renderSingleCommand({ command, data, meta })\n : renderBulkCommand({ command, data: [data], meta });\n }\n\n return [validCommands, renderCommand] as const;\n}\n\n/**\n * useBulkCommandMenu\n */\nexport function useBulkCommandMenu<TData, TMeta>({\n data,\n commands,\n meta,\n}: BulkCommandMenuProps<TData, TMeta>) {\n /**\n * Filter out commands that don't have valid conditions\n */\n const validCommands = commands\n // filter out commands that have mode \"bulk\"\n .filter((command) => command.mode === \"bulk\")\n // filter out commands that don't have valid conditions\n .filter((command) => command.mode === \"bulk\" && validateBulkCommand({ data, command }));\n\n /**\n * Render command\n */\n function renderCommand(command: (typeof commands)[number]) {\n if (command.mode === \"single\") return null;\n\n return renderBulkCommand({ command, data, meta });\n }\n\n return [validCommands, renderCommand] as const;\n}\n\n// export function useBulkCommandMenu<TData, TMeta>({\n// data,\n// commands,\n// meta,\n// }: BulkCommandMenuProps<TData, TMeta>) {\n// /**\n// * Filter out commands that don't have valid conditions\n// */\n// const validCommands = useSuspenseQueries({\n// queries: commands.flatMap((command) => ({\n// queryKey: [\"command\", command],\n// queryFn: async () => {\n// const { mode, permission } = command;\n\n// // filter out commands that have mode \"bulk\"\n// if (mode !== \"bulk\") return null;\n\n// // filter out commands that don't have valid conditions\n// if (!validateBulkCommand({ data, command })) return null;\n\n// // filter out commands that don't have a permissions defined\n// if (!permission) return command;\n\n// // filter out commands that don't have valid permissions\n// const session = await authClient.getSession();\n// const userId = session.data?.user.id;\n// const hasPermission = await authClient.admin.hasPermission({ permission, userId });\n// if (!hasPermission.data?.success) return null;\n\n// return command;\n// },\n// })),\n// combine: (items) =>\n// items.filter(({ data }) => data).map(({ data }) => data as NonNullable<typeof data>),\n// });\n\n// /**\n// * Render command\n// */\n// const renderCommand = (command: (typeof validCommands)[number]) =>\n// renderBulkCommand({ command, data, meta });\n\n// return [validCommands, renderCommand] as const;\n// }\n\n// */\n// export function useSingleCommandMenu<TData, TMeta>({\n// data,\n// commands,\n// meta,\n// }: SingleCommandMenuProps<TData, TMeta> & { data: TData }) {\n// /**\n// * Filter out commands that don't have valid conditions\n// */\n// const validCommands = useSuspenseQueries({\n// queries: commands.flatMap((command) => ({\n// queryKey: [\"command\", command],\n// queryFn: async () => {\n// const { mode, permission } = command;\n\n// // filter out commands that don't have valid conditions\n// if (mode === \"single\" && !validateSingleCommand({ data, command })) return null;\n// if (mode === \"bulk\" && !validateBulkCommand({ data: [data], command })) return null;\n\n// // filter out commands that don't have a permissions defined\n// if (!permission) return command;\n\n// // filter out commands that don't have valid permissions\n// const session = await authClient.getSession();\n// const userId = session.data?.user.id;\n// const hasPermission = await authClient.admin.hasPermission({ permission, userId });\n// if (!hasPermission.data?.success) return null;\n\n// return command;\n// },\n// })),\n// combine: (items) =>\n// items.filter(({ data }) => data).map(({ data }) => data as NonNullable<typeof data>),\n// });\n\n// /**\n// * Render command\n// */\n// function renderCommand(command: (typeof validCommands)[number]) {\n// return command.mode === \"single\"\n// ? renderSingleCommand({ command, data, meta })\n// : renderBulkCommand({ command, data: [data], meta });\n// }\n\n// return [validCommands, renderCommand] as const;\n// }\n"],"mappings":";;;;;;AA0BA,SAAS,UAAiB,MAAa;AACrC,QAAO,QAAQ,OAAO,SAAS,YAAY,QAAQ,QAAQ,OAAO,KAAK,OAAO;;AAWhF,SAAS,sBAAoC,EAC3C,MACA,WAC4C;CAC5C,MAAM,QAAQ,QAAQ,aAAa,EAAE,MAAM,CAAC;AAC5C,QAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,MAAM,QAAQ,GAAI,SAAS;;AAYjE,SAAS,oBAAkC,EACzC,MACA,SACA,QAC0C;AAC1C,QAAO,QAAQ,OAAO;EACpB;EACA,MAAM,QAAS,EAAE;EACjB,GAAI,UAAU,KAAK,GAAG,EAAE,IAAK,KAAgC,IAAI,GAAG,EAAE;EACvE,CAA+C;;AAWlD,SAAS,oBAAkC,EACzC,MACA,WAC0C;CAC1C,MAAM,QAAQ,QAAQ,aAAa,EAAE,MAAM,CAAC;AAC5C,QAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,MAAM,QAAQ,GAAI,SAAS;;AAYjE,SAAS,kBAAgC,EACvC,MACA,SACA,QACwC;CACxC,MAAM,MAAM,KAAK,OAAO,UAAU,CAAC,KAAK,SAAU,KAAgC,GAAG;AAErF,QAAO,QAAQ,OAAO;EACpB;EACA,MAAM,QAAS,EAAE;EACjB,GAAI,IAAI,SAAS,IAAI,EAAE,KAAK,GAAG,EAAE;EAClC,CAA6C;;;;;AAMhD,SAAgB,qBAAmC,EACjD,MACA,UACA,QACyD;CAEzD,MAAM,gBAAgB,SAAS,QAAQ,YACrC,QAAQ,SAAS,WACb,sBAAsB;EAAE;EAAM;EAAS,CAAC,GACxC,oBAAoB;EAAE,MAAM,CAAC,KAAK;EAAE;EAAS,CAAC,CACnD;CAED,SAAS,cAAc,SAAyC;AAC9D,SAAO,QAAQ,SAAS,WACpB,oBAAoB;GAAE;GAAS;GAAM;GAAM,CAAC,GAC5C,kBAAkB;GAAE;GAAS,MAAM,CAAC,KAAK;GAAE;GAAM,CAAC;;AAGxD,QAAO,CAAC,eAAe,cAAc;;;;;AAMvC,SAAgB,mBAAiC,EAC/C,MACA,UACA,QACqC;;;;CAIrC,MAAM,gBAAgB,SAEnB,QAAQ,YAAY,QAAQ,SAAS,OAAO,CAE5C,QAAQ,YAAY,QAAQ,SAAS,UAAU,oBAAoB;EAAE;EAAM;EAAS,CAAC,CAAC;;;;CAKzF,SAAS,cAAc,SAAoC;AACzD,MAAI,QAAQ,SAAS,SAAU,QAAO;AAEtC,SAAO,kBAAkB;GAAE;GAAS;GAAM;GAAM,CAAC;;AAGnD,QAAO,CAAC,eAAe,cAAc"}
1
+ {"version":3,"file":"use-command-menu.client.mjs","names":[],"sources":["../../../../src/modules/commands/hooks/use-command-menu.client.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n BulkCommandDefRenderParams,\n CommandDef,\n SingleCommandDefRenderParams,\n} from \"../lib/definitions\";\n\n/**\n * Command menu props\n */\nexport type SingleCommandMenuProps<TData, TMeta> = {\n data: TData;\n commands: CommandDef<TData, TMeta>[];\n meta?: TMeta;\n onSuccess?: () => void;\n};\n\nexport type BulkCommandMenuProps<TData, TMeta> = {\n data: TData[];\n commands: CommandDef<TData, TMeta>[];\n meta?: TMeta;\n onSuccess?: () => void;\n};\n\n/**\n * Check if a command has an id field in the data\n */\nfunction dataHasId<TData>(data: TData) {\n return data && typeof data === \"object\" && \"id\" in data && typeof data.id === \"string\";\n}\n\n/**\n * Single command validation\n */\ntype ValidateSingleCommandParams<TData, TMeta> = {\n data: TData;\n command: CommandDef<TData, TMeta> & { mode: \"single\" };\n};\n\nfunction validateSingleCommand<TData, TMeta>({\n data,\n command,\n}: ValidateSingleCommandParams<TData, TMeta>) {\n const valid = command.conditions?.({ data });\n return Array.isArray(valid) ? valid.every(Boolean) : (valid ?? true);\n}\n\n/**\n * Single command rendering\n */\ntype RenderSingleCommandParams<TData, TMeta> = {\n data: TData;\n meta?: TMeta;\n command: CommandDef<TData, TMeta> & { mode: \"single\" };\n};\n\nfunction renderSingleCommand<TData, TMeta>({\n data,\n command,\n meta,\n}: RenderSingleCommandParams<TData, TMeta>) {\n return command.render({\n data,\n meta: meta ?? ({} as TMeta),\n ...(dataHasId(data) ? { id: (data as TData & { id: string }).id } : {}),\n } as SingleCommandDefRenderParams<TData, TMeta>);\n}\n\n/**\n * Bulk command validation\n */\ntype ValidateBulkCommandParams<TData, TMeta> = {\n data: TData[];\n command: CommandDef<TData, TMeta> & { mode: \"bulk\" };\n};\n\nfunction validateBulkCommand<TData, TMeta>({\n data,\n command,\n}: ValidateBulkCommandParams<TData, TMeta>) {\n const valid = command.conditions?.({ data });\n return Array.isArray(valid) ? valid.every(Boolean) : (valid ?? true);\n}\n\n/**\n * Bulk command rendering\n */\ntype RenderBulkCommandParams<TData, TMeta> = {\n data: TData[];\n command: CommandDef<TData, TMeta> & { mode: \"bulk\" };\n meta?: TMeta;\n};\n\nfunction renderBulkCommand<TData, TMeta>({\n data,\n command,\n meta,\n}: RenderBulkCommandParams<TData, TMeta>) {\n const ids = data.filter(dataHasId).map((data) => (data as TData & { id: string }).id);\n\n return command.render({\n data,\n meta: meta ?? ({} as TMeta),\n ...(ids.length > 0 ? { ids } : {}),\n } as BulkCommandDefRenderParams<TData, TMeta>);\n}\n\n/**\n * useSingleCommandMenu\n */\nexport function useSingleCommandMenu<TData, TMeta>({\n data,\n commands,\n meta,\n}: SingleCommandMenuProps<TData, TMeta> & { data: TData }) {\n // filter out commands that don't have valid conditions\n const validCommands = commands.filter((command) =>\n command.mode === \"single\"\n ? validateSingleCommand({ data, command })\n : validateBulkCommand({ data: [data], command }),\n );\n\n function renderCommand(command: (typeof validCommands)[number]) {\n return command.mode === \"single\"\n ? renderSingleCommand({ command, data, meta })\n : renderBulkCommand({ command, data: [data], meta });\n }\n\n return [validCommands, renderCommand] as const;\n}\n\n/**\n * useBulkCommandMenu\n */\nexport function useBulkCommandMenu<TData, TMeta>({\n data,\n commands,\n meta,\n}: BulkCommandMenuProps<TData, TMeta>) {\n /**\n * Filter out commands that don't have valid conditions\n */\n const validCommands = commands\n // filter out commands that have mode \"bulk\"\n .filter((command) => command.mode === \"bulk\")\n // filter out commands that don't have valid conditions\n .filter((command) => command.mode === \"bulk\" && validateBulkCommand({ data, command }));\n\n /**\n * Render command\n */\n function renderCommand(command: (typeof commands)[number]) {\n if (command.mode === \"single\") return null;\n\n return renderBulkCommand({ command, data, meta });\n }\n\n return [validCommands, renderCommand] as const;\n}\n\n// export function useBulkCommandMenu<TData, TMeta>({\n// data,\n// commands,\n// meta,\n// }: BulkCommandMenuProps<TData, TMeta>) {\n// /**\n// * Filter out commands that don't have valid conditions\n// */\n// const validCommands = useSuspenseQueries({\n// queries: commands.flatMap((command) => ({\n// queryKey: [\"command\", command],\n// queryFn: async () => {\n// const { mode, permission } = command;\n\n// // filter out commands that have mode \"bulk\"\n// if (mode !== \"bulk\") return null;\n\n// // filter out commands that don't have valid conditions\n// if (!validateBulkCommand({ data, command })) return null;\n\n// // filter out commands that don't have a permissions defined\n// if (!permission) return command;\n\n// // filter out commands that don't have valid permissions\n// const session = await authClient.getSession();\n// const userId = session.data?.user.id;\n// const hasPermission = await authClient.admin.hasPermission({ permission, userId });\n// if (!hasPermission.data?.success) return null;\n\n// return command;\n// },\n// })),\n// combine: (items) =>\n// items.filter(({ data }) => data).map(({ data }) => data as NonNullable<typeof data>),\n// });\n\n// /**\n// * Render command\n// */\n// const renderCommand = (command: (typeof validCommands)[number]) =>\n// renderBulkCommand({ command, data, meta });\n\n// return [validCommands, renderCommand] as const;\n// }\n\n// */\n// export function useSingleCommandMenu<TData, TMeta>({\n// data,\n// commands,\n// meta,\n// }: SingleCommandMenuProps<TData, TMeta> & { data: TData }) {\n// /**\n// * Filter out commands that don't have valid conditions\n// */\n// const validCommands = useSuspenseQueries({\n// queries: commands.flatMap((command) => ({\n// queryKey: [\"command\", command],\n// queryFn: async () => {\n// const { mode, permission } = command;\n\n// // filter out commands that don't have valid conditions\n// if (mode === \"single\" && !validateSingleCommand({ data, command })) return null;\n// if (mode === \"bulk\" && !validateBulkCommand({ data: [data], command })) return null;\n\n// // filter out commands that don't have a permissions defined\n// if (!permission) return command;\n\n// // filter out commands that don't have valid permissions\n// const session = await authClient.getSession();\n// const userId = session.data?.user.id;\n// const hasPermission = await authClient.admin.hasPermission({ permission, userId });\n// if (!hasPermission.data?.success) return null;\n\n// return command;\n// },\n// })),\n// combine: (items) =>\n// items.filter(({ data }) => data).map(({ data }) => data as NonNullable<typeof data>),\n// });\n\n// /**\n// * Render command\n// */\n// function renderCommand(command: (typeof validCommands)[number]) {\n// return command.mode === \"single\"\n// ? renderSingleCommand({ command, data, meta })\n// : renderBulkCommand({ command, data: [data], meta });\n// }\n\n// return [validCommands, renderCommand] as const;\n// }\n"],"mappings":";;;;;;AA4BA,SAAS,UAAiB,MAAa;AACrC,QAAO,QAAQ,OAAO,SAAS,YAAY,QAAQ,QAAQ,OAAO,KAAK,OAAO;;AAWhF,SAAS,sBAAoC,EAC3C,MACA,WAC4C;CAC5C,MAAM,QAAQ,QAAQ,aAAa,EAAE,MAAM,CAAC;AAC5C,QAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,MAAM,QAAQ,GAAI,SAAS;;AAYjE,SAAS,oBAAkC,EACzC,MACA,SACA,QAC0C;AAC1C,QAAO,QAAQ,OAAO;EACpB;EACA,MAAM,QAAS,EAAE;EACjB,GAAI,UAAU,KAAK,GAAG,EAAE,IAAK,KAAgC,IAAI,GAAG,EAAE;EACvE,CAA+C;;AAWlD,SAAS,oBAAkC,EACzC,MACA,WAC0C;CAC1C,MAAM,QAAQ,QAAQ,aAAa,EAAE,MAAM,CAAC;AAC5C,QAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,MAAM,QAAQ,GAAI,SAAS;;AAYjE,SAAS,kBAAgC,EACvC,MACA,SACA,QACwC;CACxC,MAAM,MAAM,KAAK,OAAO,UAAU,CAAC,KAAK,SAAU,KAAgC,GAAG;AAErF,QAAO,QAAQ,OAAO;EACpB;EACA,MAAM,QAAS,EAAE;EACjB,GAAI,IAAI,SAAS,IAAI,EAAE,KAAK,GAAG,EAAE;EAClC,CAA6C;;;;;AAMhD,SAAgB,qBAAmC,EACjD,MACA,UACA,QACyD;CAEzD,MAAM,gBAAgB,SAAS,QAAQ,YACrC,QAAQ,SAAS,WACb,sBAAsB;EAAE;EAAM;EAAS,CAAC,GACxC,oBAAoB;EAAE,MAAM,CAAC,KAAK;EAAE;EAAS,CAAC,CACnD;CAED,SAAS,cAAc,SAAyC;AAC9D,SAAO,QAAQ,SAAS,WACpB,oBAAoB;GAAE;GAAS;GAAM;GAAM,CAAC,GAC5C,kBAAkB;GAAE;GAAS,MAAM,CAAC,KAAK;GAAE;GAAM,CAAC;;AAGxD,QAAO,CAAC,eAAe,cAAc;;;;;AAMvC,SAAgB,mBAAiC,EAC/C,MACA,UACA,QACqC;;;;CAIrC,MAAM,gBAAgB,SAEnB,QAAQ,YAAY,QAAQ,SAAS,OAAO,CAE5C,QAAQ,YAAY,QAAQ,SAAS,UAAU,oBAAoB;EAAE;EAAM;EAAS,CAAC,CAAC;;;;CAKzF,SAAS,cAAc,SAAoC;AACzD,MAAI,QAAQ,SAAS,SAAU,QAAO;AAEtC,SAAO,kBAAkB;GAAE;GAAS;GAAM;GAAM,CAAC;;AAGnD,QAAO,CAAC,eAAe,cAAc"}
@@ -0,0 +1,19 @@
1
+ import { BulkCommandMenuProps } from "../hooks/use-command-menu.client.mjs";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+
4
+ //#region src/modules/commands/menus/floating-menu.client.d.ts
5
+ type FloatingCommandMenuProps<TData, TMeta> = BulkCommandMenuProps<TData, TMeta> & React.HTMLAttributes<HTMLElement> & {
6
+ state: "open" | "closed";
7
+ };
8
+ declare function FloatingCommandMenu<TData, TMeta>({
9
+ data,
10
+ commands,
11
+ meta,
12
+ state,
13
+ onSuccess,
14
+ className,
15
+ ...props
16
+ }: FloatingCommandMenuProps<TData, TMeta>): react_jsx_runtime0.JSX.Element;
17
+ //#endregion
18
+ export { FloatingCommandMenu };
19
+ //# sourceMappingURL=floating-menu.client.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floating-menu.client.d.mts","names":[],"sources":["../../../../src/modules/commands/menus/floating-menu.client.tsx"],"mappings":";;;;KAQK,wBAAA,iBAAyC,oBAAA,CAAqB,KAAA,EAAO,KAAA,IACxE,KAAA,CAAM,cAAA,CAAe,WAAA;EACnB,KAAA;AAAA;AAAA,iBAGY,mBAAA,cAAA,CAAA;EACd,IAAA;EACA,QAAA;EACA,IAAA;EACA,KAAA;EACA,SAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,wBAAA,CAAyB,KAAA,EAAO,KAAA,IAAM,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,24 +1,24 @@
1
1
  "use client";
2
2
 
3
+ import { cn } from "../../../lib/utils/cn.mjs";
3
4
  import { CommandContextProvider } from "../hooks/context.client.mjs";
4
5
  import { RenderCommand } from "../components/render-command.mjs";
5
6
  import { useBulkCommandMenu } from "../hooks/use-command-menu.client.mjs";
6
7
  import { jsx, jsxs } from "react/jsx-runtime";
7
8
  import { useRef } from "react";
8
9
 
9
- //#region src/modules/commands/menus/data-table-menu.client.tsx
10
- function TableCommandMenu({ table }) {
11
- const meta = table.options.meta;
10
+ //#region src/modules/commands/menus/floating-menu.client.tsx
11
+ function FloatingCommandMenu({ data, commands, meta, state, onSuccess, className, ...props }) {
12
12
  const hasCommands = useRef(true);
13
- const onSuccess = () => table.resetRowSelection();
14
13
  const [validCommands, renderCommand] = useBulkCommandMenu({
15
- data: meta.selectedData ?? [],
16
- commands: meta.commands ?? [],
14
+ data,
15
+ commands,
17
16
  meta
18
17
  });
19
18
  return /* @__PURE__ */ jsx("div", {
20
- "data-state": meta.selectedData?.length ? "open" : "closed",
21
- className: "bg-muted/80 fixed bottom-12 left-0 right-0 z-50 mx-auto flex w-fit items-center rounded-xl border px-3 py-2 shadow-xl backdrop-blur-2xl data-[state=open]:flex data-[state=closed]:hidden",
19
+ ...props,
20
+ "data-state": state,
21
+ className: cn("bg-muted/80 fixed bottom-12 left-0 right-0 z-50 mx-auto flex w-fit items-center rounded-xl border px-3 py-2 shadow-xl backdrop-blur-2xl data-[state=open]:flex data-[state=closed]:hidden", className),
22
22
  children: /* @__PURE__ */ jsxs(CommandContextProvider, {
23
23
  value: {
24
24
  menu: "table",
@@ -42,5 +42,5 @@ function TableCommandMenu({ table }) {
42
42
  }
43
43
 
44
44
  //#endregion
45
- export { TableCommandMenu };
46
- //# sourceMappingURL=data-table-menu.client.mjs.map
45
+ export { FloatingCommandMenu };
46
+ //# sourceMappingURL=floating-menu.client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floating-menu.client.mjs","names":[],"sources":["../../../../src/modules/commands/menus/floating-menu.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useRef } from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { RenderCommand } from \"../components/render-command\";\nimport { CommandContextProvider } from \"../hooks/context.client\";\nimport { type BulkCommandMenuProps, useBulkCommandMenu } from \"../hooks/use-command-menu.client\";\n\ntype FloatingCommandMenuProps<TData, TMeta> = BulkCommandMenuProps<TData, TMeta> &\n React.HTMLAttributes<HTMLElement> & {\n state: \"open\" | \"closed\";\n };\n\nexport function FloatingCommandMenu<TData, TMeta>({\n data,\n commands,\n meta,\n state,\n onSuccess,\n className,\n ...props\n}: FloatingCommandMenuProps<TData, TMeta>) {\n const hasCommands = useRef(true);\n\n const [validCommands, renderCommand] = useBulkCommandMenu({ data, commands, meta });\n\n return (\n <div\n {...props}\n data-state={state}\n className={cn(\n \"bg-muted/80 fixed bottom-12 left-0 right-0 z-50 mx-auto flex w-fit items-center rounded-xl border px-3 py-2 shadow-xl backdrop-blur-2xl data-[state=open]:flex data-[state=closed]:hidden\",\n className,\n )}\n >\n <CommandContextProvider value={{ menu: \"table\", onSuccess }}>\n <div\n className=\"flex gap-2\"\n ref={(ref) => {\n if (ref?.childNodes.length === 0) hasCommands.current = false;\n }}\n >\n {validCommands.map((command) => (\n <RenderCommand key={command.name} command={command} render={renderCommand} />\n ))}\n </div>\n\n {!hasCommands.current && (\n <span className=\"text-sm font-medium\">Geen acties beschikbaar</span>\n )}\n </CommandContextProvider>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,oBAAkC,EAChD,MACA,UACA,MACA,OACA,WACA,WACA,GAAG,SACsC;CACzC,MAAM,cAAc,OAAO,KAAK;CAEhC,MAAM,CAAC,eAAe,iBAAiB,mBAAmB;EAAE;EAAM;EAAU;EAAM,CAAC;AAEnF,QACE,oBAAC;EACC,GAAI;EACJ,cAAY;EACZ,WAAW,GACT,6LACA,UACD;YAED,qBAAC;GAAuB,OAAO;IAAE,MAAM;IAAS;IAAW;cACzD,oBAAC;IACC,WAAU;IACV,MAAM,QAAQ;AACZ,SAAI,KAAK,WAAW,WAAW,EAAG,aAAY,UAAU;;cAGzD,cAAc,KAAK,YAClB,oBAAC;KAA0C;KAAS,QAAQ;OAAxC,QAAQ,KAAiD,CAC7E;KACE,EAEL,CAAC,YAAY,WACZ,oBAAC;IAAK,WAAU;cAAsB;KAA8B;IAE/C;GACrB"}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
 
3
+ import { FloatingCommandMenu } from "../../../../commands/menus/floating-menu.client.mjs";
3
4
  import { Table } from "../../../components/table.mjs";
4
5
  import { useTable } from "../../../hooks/use-table.client.mjs";
5
- import { TableCommandMenu } from "../../../../commands/menus/data-table-menu.client.mjs";
6
6
  import { TableBottombar, TableFooter } from "../../../components/footer.mjs";
7
7
  import { DataTableBody } from "./body.mjs";
8
8
  import { DataTableHeader } from "./header.mjs";
@@ -27,7 +27,13 @@ function DataTable(props) {
27
27
  })
28
28
  }),
29
29
  /* @__PURE__ */ jsx(TableBottombar, { table }),
30
- meta.commands && /* @__PURE__ */ jsx(TableCommandMenu, { table })
30
+ meta.commands && /* @__PURE__ */ jsx(FloatingCommandMenu, {
31
+ data: meta.selectedData,
32
+ commands: meta.commands,
33
+ meta,
34
+ state: meta.selectedData?.length ? "open" : "closed",
35
+ onSuccess: () => table.resetRowSelection()
36
+ })
31
37
  ]
32
38
  });
33
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"table.mjs","names":[],"sources":["../../../../../../src/modules/data-tables/tables/data-table/components/table.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { TableCommandMenu } from \"@/modules/commands/menus/data-table-menu.client\";\nimport { TableBottombar, TableFooter } from \"@/modules/data-tables/components/footer\";\nimport { Table } from \"@/modules/data-tables/components/table\";\nimport type { TableMeta } from \"@/modules/data-tables/entry\";\nimport { useTable } from \"@/modules/data-tables/hooks/use-table.client\";\nimport { DataTableBody } from \"./body\";\nimport { DataTableHeader } from \"./header\";\n\nexport function DataTable<TData extends { id: string }>(props: ComponentProps<typeof Table>) {\n const table = useTable<TData>();\n const meta = table.options.meta as TableMeta<TData>;\n\n return (\n <div className=\"space-y-4\">\n <div className=\"rounded-md border\">\n <Table {...props}>\n <DataTableHeader table={table} />\n <DataTableBody table={table} />\n <TableFooter table={table} />\n </Table>\n </div>\n\n <TableBottombar table={table} />\n {meta.commands && <TableCommandMenu table={table} />}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,UAAwC,OAAqC;CAC3F,MAAM,QAAQ,UAAiB;CAC/B,MAAM,OAAO,MAAM,QAAQ;AAE3B,QACE,qBAAC;EAAI,WAAU;;GACb,oBAAC;IAAI,WAAU;cACb,qBAAC;KAAM,GAAI;;MACT,oBAAC,mBAAuB,QAAS;MACjC,oBAAC,iBAAqB,QAAS;MAC/B,oBAAC,eAAmB,QAAS;;MACvB;KACJ;GAEN,oBAAC,kBAAsB,QAAS;GAC/B,KAAK,YAAY,oBAAC,oBAAwB,QAAS;;GAChD"}
1
+ {"version":3,"file":"table.mjs","names":[],"sources":["../../../../../../src/modules/data-tables/tables/data-table/components/table.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { FloatingCommandMenu } from \"@/modules/commands/menus/floating-menu.client\";\nimport { TableBottombar, TableFooter } from \"@/modules/data-tables/components/footer\";\nimport { Table } from \"@/modules/data-tables/components/table\";\nimport type { TableMeta } from \"@/modules/data-tables/entry\";\nimport { useTable } from \"@/modules/data-tables/hooks/use-table.client\";\nimport { DataTableBody } from \"./body\";\nimport { DataTableHeader } from \"./header\";\n\nexport function DataTable<TData extends { id: string }>(props: ComponentProps<typeof Table>) {\n const table = useTable<TData>();\n const meta = table.options.meta as TableMeta<TData>;\n\n return (\n <div className=\"space-y-4\">\n <div className=\"rounded-md border\">\n <Table {...props}>\n <DataTableHeader table={table} />\n <DataTableBody table={table} />\n <TableFooter table={table} />\n </Table>\n </div>\n\n <TableBottombar table={table} />\n\n {meta.commands && (\n <FloatingCommandMenu\n data={meta.selectedData}\n commands={meta.commands}\n meta={meta}\n state={meta.selectedData?.length ? \"open\" : \"closed\"}\n onSuccess={() => table.resetRowSelection()}\n />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,UAAwC,OAAqC;CAC3F,MAAM,QAAQ,UAAiB;CAC/B,MAAM,OAAO,MAAM,QAAQ;AAE3B,QACE,qBAAC;EAAI,WAAU;;GACb,oBAAC;IAAI,WAAU;cACb,qBAAC;KAAM,GAAI;;MACT,oBAAC,mBAAuB,QAAS;MACjC,oBAAC,iBAAqB,QAAS;MAC/B,oBAAC,eAAmB,QAAS;;MACvB;KACJ;GAEN,oBAAC,kBAAsB,QAAS;GAE/B,KAAK,YACJ,oBAAC;IACC,MAAM,KAAK;IACX,UAAU,KAAK;IACT;IACN,OAAO,KAAK,cAAc,SAAS,SAAS;IAC5C,iBAAiB,MAAM,mBAAmB;KAC1C;;GAEA"}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
 
3
+ import { FloatingCommandMenu } from "../../../../commands/menus/floating-menu.client.mjs";
3
4
  import { Table } from "../../../components/table.mjs";
4
5
  import { useTable } from "../../../hooks/use-table.client.mjs";
5
- import { TableCommandMenu } from "../../../../commands/menus/data-table-menu.client.mjs";
6
6
  import { TableBottombar, TableFooter } from "../../../components/footer.mjs";
7
7
  import { InlineTableProvider } from "../hooks/context.client.mjs";
8
8
  import { InlineTableBody } from "./body.mjs";
@@ -35,7 +35,13 @@ function InlineTable({ disabledColumns, moveRowAction, ...props }) {
35
35
  })
36
36
  }),
37
37
  /* @__PURE__ */ jsx(TableBottombar, { table }),
38
- meta.commands && /* @__PURE__ */ jsx(TableCommandMenu, { table })
38
+ meta.commands && /* @__PURE__ */ jsx(FloatingCommandMenu, {
39
+ data: meta.selectedData,
40
+ commands: meta.commands,
41
+ meta,
42
+ state: meta.selectedData?.length ? "open" : "closed",
43
+ onSuccess: () => table.resetRowSelection()
44
+ })
39
45
  ]
40
46
  })
41
47
  });
@@ -1 +1 @@
1
- {"version":3,"file":"table.mjs","names":[],"sources":["../../../../../../src/modules/data-tables/tables/inline-table/components/table.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { HotkeysProvider } from \"react-hotkeys-hook\";\nimport { TableCommandMenu } from \"@/modules/commands/menus/data-table-menu.client\";\nimport { TableBottombar, TableFooter } from \"@/modules/data-tables/components/footer\";\nimport { Table } from \"@/modules/data-tables/components/table\";\nimport type { TableMeta } from \"@/modules/data-tables/entry\";\nimport { useTable } from \"@/modules/data-tables/hooks/use-table.client\";\nimport { InlineTableProvider } from \"../hooks/context.client\";\nimport { InlineTableBody } from \"./body\";\nimport { InlineTableHeader } from \"./header\";\n\nexport function InlineTable<TData extends { id: string }>({\n disabledColumns,\n moveRowAction,\n ...props\n}: ComponentProps<typeof Table> & ComponentProps<typeof InlineTableProvider>) {\n const table = useTable<TData>();\n const meta = table.options.meta as TableMeta<TData>;\n\n return (\n <InlineTableProvider disabledColumns={disabledColumns} moveRowAction={moveRowAction}>\n <div className=\"space-y-4\">\n <div className=\"rounded-md border\">\n <Table {...props}>\n <InlineTableHeader table={table} />\n\n <HotkeysProvider initiallyActiveScopes={[\"inline-data-table\"]}>\n <InlineTableBody table={table} />\n </HotkeysProvider>\n\n <TableFooter table={table} />\n </Table>\n </div>\n\n <TableBottombar table={table} />\n {meta.commands && <TableCommandMenu table={table} />}\n </div>\n </InlineTableProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAgB,YAA0C,EACxD,iBACA,eACA,GAAG,SACyE;CAC5E,MAAM,QAAQ,UAAiB;CAC/B,MAAM,OAAO,MAAM,QAAQ;AAE3B,QACE,oBAAC;EAAqC;EAAgC;YACpE,qBAAC;GAAI,WAAU;;IACb,oBAAC;KAAI,WAAU;eACb,qBAAC;MAAM,GAAI;;OACT,oBAAC,qBAAyB,QAAS;OAEnC,oBAAC;QAAgB,uBAAuB,CAAC,oBAAoB;kBAC3D,oBAAC,mBAAuB,QAAS;SACjB;OAElB,oBAAC,eAAmB,QAAS;;OACvB;MACJ;IAEN,oBAAC,kBAAsB,QAAS;IAC/B,KAAK,YAAY,oBAAC,oBAAwB,QAAS;;IAChD;GACc"}
1
+ {"version":3,"file":"table.mjs","names":[],"sources":["../../../../../../src/modules/data-tables/tables/inline-table/components/table.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { HotkeysProvider } from \"react-hotkeys-hook\";\nimport { FloatingCommandMenu } from \"@/modules/commands/menus/floating-menu.client\";\nimport { TableBottombar, TableFooter } from \"@/modules/data-tables/components/footer\";\nimport { Table } from \"@/modules/data-tables/components/table\";\nimport type { TableMeta } from \"@/modules/data-tables/entry\";\nimport { useTable } from \"@/modules/data-tables/hooks/use-table.client\";\nimport { InlineTableProvider } from \"../hooks/context.client\";\nimport { InlineTableBody } from \"./body\";\nimport { InlineTableHeader } from \"./header\";\n\nexport function InlineTable<TData extends { id: string }>({\n disabledColumns,\n moveRowAction,\n ...props\n}: ComponentProps<typeof Table> & ComponentProps<typeof InlineTableProvider>) {\n const table = useTable<TData>();\n const meta = table.options.meta as TableMeta<TData>;\n\n return (\n <InlineTableProvider disabledColumns={disabledColumns} moveRowAction={moveRowAction}>\n <div className=\"space-y-4\">\n <div className=\"rounded-md border\">\n <Table {...props}>\n <InlineTableHeader table={table} />\n\n <HotkeysProvider initiallyActiveScopes={[\"inline-data-table\"]}>\n <InlineTableBody table={table} />\n </HotkeysProvider>\n\n <TableFooter table={table} />\n </Table>\n </div>\n\n <TableBottombar table={table} />\n\n {meta.commands && (\n <FloatingCommandMenu\n data={meta.selectedData}\n commands={meta.commands}\n meta={meta}\n state={meta.selectedData?.length ? \"open\" : \"closed\"}\n onSuccess={() => table.resetRowSelection()}\n />\n )}\n </div>\n </InlineTableProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAgB,YAA0C,EACxD,iBACA,eACA,GAAG,SACyE;CAC5E,MAAM,QAAQ,UAAiB;CAC/B,MAAM,OAAO,MAAM,QAAQ;AAE3B,QACE,oBAAC;EAAqC;EAAgC;YACpE,qBAAC;GAAI,WAAU;;IACb,oBAAC;KAAI,WAAU;eACb,qBAAC;MAAM,GAAI;;OACT,oBAAC,qBAAyB,QAAS;OAEnC,oBAAC;QAAgB,uBAAuB,CAAC,oBAAoB;kBAC3D,oBAAC,mBAAuB,QAAS;SACjB;OAElB,oBAAC,eAAmB,QAAS;;OACvB;MACJ;IAEN,oBAAC,kBAAsB,QAAS;IAE/B,KAAK,YACJ,oBAAC;KACC,MAAM,KAAK;KACX,UAAU,KAAK;KACT;KACN,OAAO,KAAK,cAAc,SAAS,SAAS;KAC5C,iBAAiB,MAAM,mBAAmB;MAC1C;;IAEA;GACc"}
@@ -13,7 +13,11 @@ function InlineComboboxDropdown({ selectedItem, variant, className, onSelect, in
13
13
  action,
14
14
  permission,
15
15
  updateStrategy,
16
- isRequired
16
+ isRequired,
17
+ parser: {
18
+ decode: (value) => value,
19
+ encode: (value) => value
20
+ }
17
21
  });
18
22
  const initialSelectedItem = props.items.find((item) => item.id === initialValue);
19
23
  return /* @__PURE__ */ jsx(ComboboxDropdown, {
@@ -1 +1 @@
1
- {"version":3,"file":"combobox-dropdown.client.mjs","names":[],"sources":["../../../../src/modules/inline-edit/components/combobox-dropdown.client.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n ComboboxDropdown,\n type ComboboxDropdownItem,\n type ComboboxDropdownProps,\n} from \"@/components/ui/combobox-dropdown.client\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { useInlineEdit, type useInlineEditOptions } from \"../hooks/use-inline.client\";\nimport { type InlineEditVariantsProps, inlineEditVariants } from \"../lib/variants\";\n\nexport type InlineEditComboboxDropdownProps<\n TValue extends ComboboxDropdownItem,\n Required extends boolean = false,\n> = useInlineEditOptions<string, Required> &\n InlineEditVariantsProps &\n Omit<ComboboxDropdownProps<TValue>, \"onSelect\"> & {\n onSelect?: ComboboxDropdownProps<TValue>[\"onSelect\"];\n };\n\nexport function InlineComboboxDropdown<\n TValue extends ComboboxDropdownItem,\n Required extends boolean,\n>({\n selectedItem,\n variant,\n className,\n onSelect,\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n disabled,\n ...props\n}: InlineEditComboboxDropdownProps<TValue, Required>) {\n const { handleChange, handleBlur, isAllowed, status } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n });\n\n const initialSelectedItem = props.items.find((item) => item.id === initialValue);\n\n return (\n <ComboboxDropdown\n {...props}\n className={cn(inlineEditVariants({ variant, status }), className)}\n disabled={disabled || !isAllowed}\n selectedItem={selectedItem ?? initialSelectedItem}\n onSelect={(event) => {\n handleChange(event.id ?? null);\n handleBlur(event.id ?? null);\n onSelect?.(event);\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAoBA,SAAgB,uBAGd,EACA,cACA,SACA,WACA,UACA,cACA,QACA,YACA,gBACA,YACA,UACA,GAAG,SACiD;CACpD,MAAM,EAAE,cAAc,YAAY,WAAW,WAAW,cAAc;EACpE;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,sBAAsB,MAAM,MAAM,MAAM,SAAS,KAAK,OAAO,aAAa;AAEhF,QACE,oBAAC;EACC,GAAI;EACJ,WAAW,GAAG,mBAAmB;GAAE;GAAS;GAAQ,CAAC,EAAE,UAAU;EACjE,UAAU,YAAY,CAAC;EACvB,cAAc,gBAAgB;EAC9B,WAAW,UAAU;AACnB,gBAAa,MAAM,MAAM,KAAK;AAC9B,cAAW,MAAM,MAAM,KAAK;AAC5B,cAAW,MAAM;;GAEnB"}
1
+ {"version":3,"file":"combobox-dropdown.client.mjs","names":[],"sources":["../../../../src/modules/inline-edit/components/combobox-dropdown.client.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n ComboboxDropdown,\n type ComboboxDropdownItem,\n type ComboboxDropdownProps,\n} from \"@/components/ui/combobox-dropdown.client\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { useInlineEdit, type useInlineEditOptions } from \"../hooks/use-inline.client\";\nimport { type InlineEditVariantsProps, inlineEditVariants } from \"../lib/variants\";\n\nexport type InlineEditComboboxDropdownProps<\n TValue extends ComboboxDropdownItem,\n Required extends boolean = false,\n> = useInlineEditOptions<string, Required> &\n InlineEditVariantsProps &\n Omit<ComboboxDropdownProps<TValue>, \"onSelect\"> & {\n onSelect?: ComboboxDropdownProps<TValue>[\"onSelect\"];\n };\n\nexport function InlineComboboxDropdown<\n TValue extends ComboboxDropdownItem,\n Required extends boolean,\n>({\n selectedItem,\n variant,\n className,\n onSelect,\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n disabled,\n ...props\n}: InlineEditComboboxDropdownProps<TValue, Required>) {\n const { handleChange, handleBlur, isAllowed, status } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n parser: {\n decode: (value) => value,\n encode: (value) => value,\n },\n });\n\n const initialSelectedItem = props.items.find((item) => item.id === initialValue);\n\n return (\n <ComboboxDropdown\n {...props}\n className={cn(inlineEditVariants({ variant, status }), className)}\n disabled={disabled || !isAllowed}\n selectedItem={selectedItem ?? initialSelectedItem}\n onSelect={(event) => {\n handleChange(event.id ?? null);\n handleBlur(event.id ?? null);\n onSelect?.(event);\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAoBA,SAAgB,uBAGd,EACA,cACA,SACA,WACA,UACA,cACA,QACA,YACA,gBACA,YACA,UACA,GAAG,SACiD;CACpD,MAAM,EAAE,cAAc,YAAY,WAAW,WAAW,cAAc;EACpE;EACA;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,UAAU;GACnB,SAAS,UAAU;GACpB;EACF,CAAC;CAEF,MAAM,sBAAsB,MAAM,MAAM,MAAM,SAAS,KAAK,OAAO,aAAa;AAEhF,QACE,oBAAC;EACC,GAAI;EACJ,WAAW,GAAG,mBAAmB;GAAE;GAAS;GAAQ,CAAC,EAAE,UAAU;EACjE,UAAU,YAAY,CAAC;EACvB,cAAc,gBAAgB;EAC9B,WAAW,UAAU;AACnB,gBAAa,MAAM,MAAM,KAAK;AAC9B,cAAW,MAAM,MAAM,KAAK;AAC5B,cAAW,MAAM;;GAEnB"}
@@ -11,7 +11,11 @@ function InlineCombobox({ initialValue, action, permission, onSelect, onBlur, di
11
11
  action,
12
12
  permission,
13
13
  updateStrategy,
14
- isRequired
14
+ isRequired,
15
+ parser: {
16
+ decode: (value) => value,
17
+ encode: (value) => value
18
+ }
15
19
  });
16
20
  return /* @__PURE__ */ jsx(Combobox, {
17
21
  ...props,
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.client.mjs","names":[],"sources":["../../../../src/modules/inline-edit/components/combobox.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { Combobox, type ComboboxProps } from \"@/components/ui/combobox.client\";\nimport { useInlineEdit, type useInlineEditOptions } from \"../hooks/use-inline.client\";\n\nexport type InlineComboboxProps<TValue, Required extends boolean = false> = useInlineEditOptions<\n string,\n Required\n> &\n Omit<ComboboxProps<TValue>, \"value\">;\n\nexport function InlineCombobox<TValue, Required extends boolean>({\n initialValue,\n action,\n permission,\n onSelect,\n onBlur,\n disabled,\n updateStrategy,\n isRequired,\n ...props\n}: InlineComboboxProps<TValue, Required>) {\n const { value, handleChange, handleBlur, isAllowed } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n });\n\n return (\n <Combobox\n {...props}\n value={value}\n disabled={disabled || !isAllowed}\n onSelect={(value) => {\n handleChange(value ?? null);\n onSelect?.(value as TValue);\n }}\n onBlur={(e) => {\n handleBlur(e.target.value ?? null);\n onBlur?.(e);\n }}\n />\n );\n}\n"],"mappings":";;;;;;;AAWA,SAAgB,eAAiD,EAC/D,cACA,QACA,YACA,UACA,QACA,UACA,gBACA,YACA,GAAG,SACqC;CACxC,MAAM,EAAE,OAAO,cAAc,YAAY,cAAc,cAAc;EACnE;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,QACE,oBAAC;EACC,GAAI;EACG;EACP,UAAU,YAAY,CAAC;EACvB,WAAW,UAAU;AACnB,gBAAa,SAAS,KAAK;AAC3B,cAAW,MAAgB;;EAE7B,SAAS,MAAM;AACb,cAAW,EAAE,OAAO,SAAS,KAAK;AAClC,YAAS,EAAE;;GAEb"}
1
+ {"version":3,"file":"combobox.client.mjs","names":[],"sources":["../../../../src/modules/inline-edit/components/combobox.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { Combobox, type ComboboxProps } from \"@/components/ui/combobox.client\";\nimport { useInlineEdit, type useInlineEditOptions } from \"../hooks/use-inline.client\";\n\nexport type InlineComboboxProps<TValue, Required extends boolean = false> = useInlineEditOptions<\n string,\n Required\n> &\n Omit<ComboboxProps<TValue>, \"value\">;\n\nexport function InlineCombobox<TValue, Required extends boolean>({\n initialValue,\n action,\n permission,\n onSelect,\n onBlur,\n disabled,\n updateStrategy,\n isRequired,\n ...props\n}: InlineComboboxProps<TValue, Required>) {\n const { value, handleChange, handleBlur, isAllowed } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n parser: {\n decode: (value) => value,\n encode: (value) => value,\n },\n });\n\n return (\n <Combobox\n {...props}\n value={value}\n disabled={disabled || !isAllowed}\n onSelect={(value) => {\n handleChange(value ?? null);\n onSelect?.(value as TValue);\n }}\n onBlur={(e) => {\n handleBlur(e.target.value ?? null);\n onBlur?.(e);\n }}\n />\n );\n}\n"],"mappings":";;;;;;;AAWA,SAAgB,eAAiD,EAC/D,cACA,QACA,YACA,UACA,QACA,UACA,gBACA,YACA,GAAG,SACqC;CACxC,MAAM,EAAE,OAAO,cAAc,YAAY,cAAc,cAAc;EACnE;EACA;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,UAAU;GACnB,SAAS,UAAU;GACpB;EACF,CAAC;AAEF,QACE,oBAAC;EACC,GAAI;EACG;EACP,UAAU,YAAY,CAAC;EACvB,WAAW,UAAU;AACnB,gBAAa,SAAS,KAAK;AAC3B,cAAW,MAAgB;;EAE7B,SAAS,MAAM;AACb,cAAW,EAAE,OAAO,SAAS,KAAK;AAClC,YAAS,EAAE;;GAEb"}
@@ -23,7 +23,11 @@ function InlineDateInput({ initialValue, action, permission, variant, className,
23
23
  action,
24
24
  permission,
25
25
  updateStrategy,
26
- isRequired
26
+ isRequired,
27
+ parser: {
28
+ decode: (value) => value,
29
+ encode: (value) => value
30
+ }
27
31
  });
28
32
  const [stringDate, setStringDate] = React.useState(initialValue ? formatDate(initialValue) : "");
29
33
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"date-input.client.mjs","names":["Calendar"],"sources":["../../../../src/modules/inline-edit/components/date-input.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { format } from \"date-fns\";\nimport { CalendarIcon } from \"lucide-react\";\nimport React, { type ComponentProps } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Calendar } from \"@/components/ui/calendar\";\nimport { Input } from \"@/components/ui/input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { useInlineEdit, type useInlineEditOptions } from \"../hooks/use-inline.client\";\nimport { type InlineEditVariantsProps, inlineEditVariants } from \"../lib/variants\";\n\nconst formatDate = (value: Date) => format(value, \"dd/MM/yyyy\");\nconst parseDate = (value: string) => new Date(value.split(\"/\").reverse().join(\"-\"));\nconst isValidDate = (date: Date) => date instanceof Date && date.toString() !== \"Invalid Date\";\n\nexport function InlineDateInput<Required extends boolean = false>({\n initialValue,\n action,\n permission,\n variant,\n className,\n updateStrategy,\n isRequired,\n ...props\n}: ComponentProps<\"div\"> & useInlineEditOptions<Date, Required> & InlineEditVariantsProps) {\n const [inValid, setInValid] = React.useState<boolean>(false);\n\n const { value, setValue, handleChange, handleBlur, status, isAllowed } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n });\n\n const [stringDate, setStringDate] = React.useState<string>(\n initialValue ? formatDate(initialValue) : \"\",\n );\n\n /**\n * Update string date when value changes\n */\n React.useEffect(() => {\n if (value) setStringDate(formatDate(value));\n }, [value]);\n\n return (\n <Popover>\n <div {...props} className={cn(\"relative h-full\", className)}>\n <Input\n data-input\n type=\"string\"\n value={stringDate}\n className={cn(inlineEditVariants({ variant, status }), inValid && \"text-destructive\")}\n disabled={!isAllowed}\n onChange={(e) => {\n setStringDate(e.target.value);\n const parsedDate = parseDate(e.target.value);\n\n if (!isValidDate(parsedDate)) {\n setInValid(true);\n setValue(undefined);\n } else {\n setInValid(false);\n setValue(parsedDate);\n }\n }}\n onBlur={(e) => {\n const parsedDate = parseDate(e.target.value);\n handleBlur(isValidDate(parsedDate) ? parsedDate : null);\n }}\n />\n\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n tabIndex={-1}\n disabled={!isAllowed}\n className={cn(\n \"absolute bottom-0 right-0 top-0 opacity-50\",\n !value && \"text-muted-foreground\",\n )}\n >\n <CalendarIcon className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n </div>\n\n <PopoverContent className=\"w-auto p-0\">\n <Calendar\n mode=\"single\"\n autoFocus\n selected={value ?? undefined}\n defaultMonth={value ?? undefined}\n disabled={!isAllowed}\n onSelect={(selectedDate) => {\n if (!selectedDate) return;\n\n setStringDate(formatDate(selectedDate));\n\n handleChange(selectedDate ?? null);\n handleBlur(selectedDate ?? null);\n\n setInValid(false);\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAaA,MAAM,cAAc,UAAgB,OAAO,OAAO,aAAa;AAC/D,MAAM,aAAa,UAAkB,IAAI,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;AACnF,MAAM,eAAe,SAAe,gBAAgB,QAAQ,KAAK,UAAU,KAAK;AAEhF,SAAgB,gBAAkD,EAChE,cACA,QACA,YACA,SACA,WACA,gBACA,YACA,GAAG,SACsF;CACzF,MAAM,CAAC,SAAS,cAAc,MAAM,SAAkB,MAAM;CAE5D,MAAM,EAAE,OAAO,UAAU,cAAc,YAAY,QAAQ,cAAc,cAAc;EACrF;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,CAAC,YAAY,iBAAiB,MAAM,SACxC,eAAe,WAAW,aAAa,GAAG,GAC3C;;;;AAKD,OAAM,gBAAgB;AACpB,MAAI,MAAO,eAAc,WAAW,MAAM,CAAC;IAC1C,CAAC,MAAM,CAAC;AAEX,QACE,qBAAC,sBACC,qBAAC;EAAI,GAAI;EAAO,WAAW,GAAG,mBAAmB,UAAU;aACzD,oBAAC;GACC;GACA,MAAK;GACL,OAAO;GACP,WAAW,GAAG,mBAAmB;IAAE;IAAS;IAAQ,CAAC,EAAE,WAAW,mBAAmB;GACrF,UAAU,CAAC;GACX,WAAW,MAAM;AACf,kBAAc,EAAE,OAAO,MAAM;IAC7B,MAAM,aAAa,UAAU,EAAE,OAAO,MAAM;AAE5C,QAAI,CAAC,YAAY,WAAW,EAAE;AAC5B,gBAAW,KAAK;AAChB,cAAS,OAAU;WACd;AACL,gBAAW,MAAM;AACjB,cAAS,WAAW;;;GAGxB,SAAS,MAAM;IACb,MAAM,aAAa,UAAU,EAAE,OAAO,MAAM;AAC5C,eAAW,YAAY,WAAW,GAAG,aAAa,KAAK;;IAEzD,EAEF,oBAAC;GAAe;aACd,oBAAC;IACC,SAAQ;IACR,UAAU;IACV,UAAU,CAAC;IACX,WAAW,GACT,8CACA,CAAC,SAAS,wBACX;cAED,oBAAC,gBAAa,WAAU,YAAY;KAC7B;IACM;GACb,EAEN,oBAAC;EAAe,WAAU;YACxB,oBAACA;GACC,MAAK;GACL;GACA,UAAU,SAAS;GACnB,cAAc,SAAS;GACvB,UAAU,CAAC;GACX,WAAW,iBAAiB;AAC1B,QAAI,CAAC,aAAc;AAEnB,kBAAc,WAAW,aAAa,CAAC;AAEvC,iBAAa,gBAAgB,KAAK;AAClC,eAAW,gBAAgB,KAAK;AAEhC,eAAW,MAAM;;IAEnB;GACa,IACT"}
1
+ {"version":3,"file":"date-input.client.mjs","names":["Calendar"],"sources":["../../../../src/modules/inline-edit/components/date-input.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { format } from \"date-fns\";\nimport { CalendarIcon } from \"lucide-react\";\nimport React, { type ComponentProps } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Calendar } from \"@/components/ui/calendar\";\nimport { Input } from \"@/components/ui/input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { useInlineEdit, type useInlineEditOptions } from \"../hooks/use-inline.client\";\nimport { type InlineEditVariantsProps, inlineEditVariants } from \"../lib/variants\";\n\nconst formatDate = (value: Date) => format(value, \"dd/MM/yyyy\");\nconst parseDate = (value: string) => new Date(value.split(\"/\").reverse().join(\"-\"));\nconst isValidDate = (date: Date) => date instanceof Date && date.toString() !== \"Invalid Date\";\n\nexport function InlineDateInput<Required extends boolean = false>({\n initialValue,\n action,\n permission,\n variant,\n className,\n updateStrategy,\n isRequired,\n ...props\n}: ComponentProps<\"div\"> & useInlineEditOptions<Date, Required> & InlineEditVariantsProps) {\n const [inValid, setInValid] = React.useState<boolean>(false);\n\n const { value, setValue, handleChange, handleBlur, status, isAllowed } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n parser: {\n decode: (value) => value,\n encode: (value) => value,\n },\n });\n\n const [stringDate, setStringDate] = React.useState<string>(\n initialValue ? formatDate(initialValue) : \"\",\n );\n\n /**\n * Update string date when value changes\n */\n React.useEffect(() => {\n if (value) setStringDate(formatDate(value));\n }, [value]);\n\n return (\n <Popover>\n <div {...props} className={cn(\"relative h-full\", className)}>\n <Input\n data-input\n type=\"string\"\n value={stringDate}\n className={cn(inlineEditVariants({ variant, status }), inValid && \"text-destructive\")}\n disabled={!isAllowed}\n onChange={(e) => {\n setStringDate(e.target.value);\n const parsedDate = parseDate(e.target.value);\n\n if (!isValidDate(parsedDate)) {\n setInValid(true);\n setValue(undefined);\n } else {\n setInValid(false);\n setValue(parsedDate);\n }\n }}\n onBlur={(e) => {\n const parsedDate = parseDate(e.target.value);\n handleBlur(isValidDate(parsedDate) ? parsedDate : null);\n }}\n />\n\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n tabIndex={-1}\n disabled={!isAllowed}\n className={cn(\n \"absolute bottom-0 right-0 top-0 opacity-50\",\n !value && \"text-muted-foreground\",\n )}\n >\n <CalendarIcon className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n </div>\n\n <PopoverContent className=\"w-auto p-0\">\n <Calendar\n mode=\"single\"\n autoFocus\n selected={value ?? undefined}\n defaultMonth={value ?? undefined}\n disabled={!isAllowed}\n onSelect={(selectedDate) => {\n if (!selectedDate) return;\n\n setStringDate(formatDate(selectedDate));\n\n handleChange(selectedDate ?? null);\n handleBlur(selectedDate ?? null);\n\n setInValid(false);\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAaA,MAAM,cAAc,UAAgB,OAAO,OAAO,aAAa;AAC/D,MAAM,aAAa,UAAkB,IAAI,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;AACnF,MAAM,eAAe,SAAe,gBAAgB,QAAQ,KAAK,UAAU,KAAK;AAEhF,SAAgB,gBAAkD,EAChE,cACA,QACA,YACA,SACA,WACA,gBACA,YACA,GAAG,SACsF;CACzF,MAAM,CAAC,SAAS,cAAc,MAAM,SAAkB,MAAM;CAE5D,MAAM,EAAE,OAAO,UAAU,cAAc,YAAY,QAAQ,cAAc,cAAc;EACrF;EACA;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,UAAU;GACnB,SAAS,UAAU;GACpB;EACF,CAAC;CAEF,MAAM,CAAC,YAAY,iBAAiB,MAAM,SACxC,eAAe,WAAW,aAAa,GAAG,GAC3C;;;;AAKD,OAAM,gBAAgB;AACpB,MAAI,MAAO,eAAc,WAAW,MAAM,CAAC;IAC1C,CAAC,MAAM,CAAC;AAEX,QACE,qBAAC,sBACC,qBAAC;EAAI,GAAI;EAAO,WAAW,GAAG,mBAAmB,UAAU;aACzD,oBAAC;GACC;GACA,MAAK;GACL,OAAO;GACP,WAAW,GAAG,mBAAmB;IAAE;IAAS;IAAQ,CAAC,EAAE,WAAW,mBAAmB;GACrF,UAAU,CAAC;GACX,WAAW,MAAM;AACf,kBAAc,EAAE,OAAO,MAAM;IAC7B,MAAM,aAAa,UAAU,EAAE,OAAO,MAAM;AAE5C,QAAI,CAAC,YAAY,WAAW,EAAE;AAC5B,gBAAW,KAAK;AAChB,cAAS,OAAU;WACd;AACL,gBAAW,MAAM;AACjB,cAAS,WAAW;;;GAGxB,SAAS,MAAM;IACb,MAAM,aAAa,UAAU,EAAE,OAAO,MAAM;AAC5C,eAAW,YAAY,WAAW,GAAG,aAAa,KAAK;;IAEzD,EAEF,oBAAC;GAAe;aACd,oBAAC;IACC,SAAQ;IACR,UAAU;IACV,UAAU,CAAC;IACX,WAAW,GACT,8CACA,CAAC,SAAS,wBACX;cAED,oBAAC,gBAAa,WAAU,YAAY;KAC7B;IACM;GACb,EAEN,oBAAC;EAAe,WAAU;YACxB,oBAACA;GACC,MAAK;GACL;GACA,UAAU,SAAS;GACnB,cAAc,SAAS;GACvB,UAAU,CAAC;GACX,WAAW,iBAAiB;AAC1B,QAAI,CAAC,aAAc;AAEnB,kBAAc,WAAW,aAAa,CAAC;AAEvC,iBAAa,gBAAgB,KAAK;AAClC,eAAW,gBAAgB,KAAK;AAEhC,eAAW,MAAM;;IAEnB;GACa,IACT"}