@postxl/generators 1.1.0 → 1.2.0

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 (169) hide show
  1. package/dist/backend-core/template/apps/api/src/e2e.ts +13 -4
  2. package/dist/e2e/e2e.generator.js +2 -14
  3. package/dist/e2e/e2e.generator.js.map +1 -1
  4. package/dist/e2e/generators/docker-sh.generator.d.ts +2 -0
  5. package/dist/e2e/generators/docker-sh.generator.js +25 -0
  6. package/dist/e2e/generators/docker-sh.generator.js.map +1 -0
  7. package/dist/frontend-core/frontend.generator.d.ts +0 -58
  8. package/dist/frontend-core/frontend.generator.js +6 -172
  9. package/dist/frontend-core/frontend.generator.js.map +1 -1
  10. package/dist/frontend-core/template/README.md +1 -1
  11. package/dist/frontend-core/template/src/components/admin/table-filter.tsx +1 -5
  12. package/dist/frontend-core/template/src/components/ui/color-mode-toggle/color-mode-toggle.tsx +10 -4
  13. package/dist/frontend-core/template/src/context-providers/auth-context-provider.tsx +2 -5
  14. package/dist/frontend-core/template/src/pages/dashboard/dashboard.page.tsx +2 -3
  15. package/dist/frontend-core/template/src/pages/error/default-error.page.tsx +1 -1
  16. package/dist/frontend-core/template/src/pages/error/not-found-error.page.tsx +1 -1
  17. package/dist/frontend-core/template/src/styles/styles.css +13 -1
  18. package/dist/frontend-core/template/tsconfig.json +2 -0
  19. package/dist/frontend-core/types/component.d.ts +1 -1
  20. package/dist/frontend-forms/generators/discriminated-union/fields.generator.js +4 -6
  21. package/dist/frontend-forms/generators/discriminated-union/fields.generator.js.map +1 -1
  22. package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js +1 -1
  23. package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js.map +1 -1
  24. package/dist/frontend-forms/generators/enum/inputs.generator.js +1 -1
  25. package/dist/frontend-forms/generators/enum/inputs.generator.js.map +1 -1
  26. package/dist/frontend-forms/generators/model/forms.generator.js +8 -12
  27. package/dist/frontend-forms/generators/model/forms.generator.js.map +1 -1
  28. package/dist/frontend-forms/generators/model/inputs.generator.js +2 -6
  29. package/dist/frontend-forms/generators/model/inputs.generator.js.map +1 -1
  30. package/dist/frontend-forms/template/src/components/ui/field/field.tsx +1 -4
  31. package/dist/frontend-tables/generators/model-table.generator.js +1 -5
  32. package/dist/frontend-tables/generators/model-table.generator.js.map +1 -1
  33. package/package.json +3 -2
  34. package/dist/e2e/template/scripts/docker.sh +0 -17
  35. package/dist/frontend-core/template/src/components/ui/accordion/accordion.stories.tsx +0 -47
  36. package/dist/frontend-core/template/src/components/ui/accordion/accordion.tsx +0 -52
  37. package/dist/frontend-core/template/src/components/ui/admin-sidebar/admin-sidebar.tsx +0 -195
  38. package/dist/frontend-core/template/src/components/ui/alert/alert.stories.tsx +0 -61
  39. package/dist/frontend-core/template/src/components/ui/alert/alert.tsx +0 -45
  40. package/dist/frontend-core/template/src/components/ui/alert-dialog/alert-dialog.stories.tsx +0 -52
  41. package/dist/frontend-core/template/src/components/ui/alert-dialog/alert-dialog.tsx +0 -105
  42. package/dist/frontend-core/template/src/components/ui/avatar/avatar.stories.tsx +0 -30
  43. package/dist/frontend-core/template/src/components/ui/avatar/avatar.tsx +0 -39
  44. package/dist/frontend-core/template/src/components/ui/badge/badge.stories.tsx +0 -78
  45. package/dist/frontend-core/template/src/components/ui/badge/badge.tsx +0 -48
  46. package/dist/frontend-core/template/src/components/ui/breadcrumb/breadcrumb.stories.tsx +0 -67
  47. package/dist/frontend-core/template/src/components/ui/breadcrumb/breadcrumb.tsx +0 -85
  48. package/dist/frontend-core/template/src/components/ui/button/button.stories.tsx +0 -150
  49. package/dist/frontend-core/template/src/components/ui/button/button.tsx +0 -68
  50. package/dist/frontend-core/template/src/components/ui/calendar/calendar.stories.tsx +0 -160
  51. package/dist/frontend-core/template/src/components/ui/calendar/calendar.tsx +0 -293
  52. package/dist/frontend-core/template/src/components/ui/card/card.stories.tsx +0 -77
  53. package/dist/frontend-core/template/src/components/ui/card/card.tsx +0 -45
  54. package/dist/frontend-core/template/src/components/ui/card-hover/card-hover.stories.tsx +0 -29
  55. package/dist/frontend-core/template/src/components/ui/card-hover/card-hover.tsx +0 -28
  56. package/dist/frontend-core/template/src/components/ui/carousel/carousel.stories.tsx +0 -154
  57. package/dist/frontend-core/template/src/components/ui/carousel/carousel.tsx +0 -227
  58. package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.stories.tsx +0 -106
  59. package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.tsx +0 -88
  60. package/dist/frontend-core/template/src/components/ui/checkbox/shadcn-checkbox.stories.tsx +0 -90
  61. package/dist/frontend-core/template/src/components/ui/checkbox/shadcn-checkbox.tsx +0 -54
  62. package/dist/frontend-core/template/src/components/ui/collapse/collapse.stories.tsx +0 -52
  63. package/dist/frontend-core/template/src/components/ui/collapse/collapse.tsx +0 -9
  64. package/dist/frontend-core/template/src/components/ui/combobox/combobox.stories.tsx +0 -207
  65. package/dist/frontend-core/template/src/components/ui/combobox/combobox.tsx +0 -79
  66. package/dist/frontend-core/template/src/components/ui/command/command.stories.tsx +0 -186
  67. package/dist/frontend-core/template/src/components/ui/command/command.tsx +0 -165
  68. package/dist/frontend-core/template/src/components/ui/command-palette/command-palette.stories.tsx +0 -160
  69. package/dist/frontend-core/template/src/components/ui/command-palette/command-palette.tsx +0 -134
  70. package/dist/frontend-core/template/src/components/ui/content-frame/content-frame.stories.tsx +0 -198
  71. package/dist/frontend-core/template/src/components/ui/content-frame/content-frame.tsx +0 -100
  72. package/dist/frontend-core/template/src/components/ui/context-menu/context-menu.stories.tsx +0 -78
  73. package/dist/frontend-core/template/src/components/ui/context-menu/context-menu.tsx +0 -179
  74. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/cell-variant-types.ts +0 -11
  75. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/checkbox-cell.tsx +0 -116
  76. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/date-cell.tsx +0 -157
  77. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/gantt-cell.tsx +0 -82
  78. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/long-text-cell.tsx +0 -180
  79. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/multi-select-cell.tsx +0 -280
  80. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/number-cell.tsx +0 -169
  81. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/react-node-cell.tsx +0 -33
  82. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/select-cell.tsx +0 -175
  83. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/short-text-cell.tsx +0 -138
  84. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/utils/gantt-timeline.tsx +0 -92
  85. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/utils/gantt-timerange-picker.tsx +0 -330
  86. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-cell-wrapper.tsx +0 -212
  87. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-cell.tsx +0 -157
  88. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-column-header.tsx +0 -340
  89. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-context-menu.tsx +0 -271
  90. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-row.tsx +0 -123
  91. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-search.tsx +0 -211
  92. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-types.ts +0 -159
  93. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-utils.ts +0 -67
  94. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-view-menu.tsx +0 -360
  95. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid.stories.tsx +0 -780
  96. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid.tsx +0 -217
  97. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-callback-ref.ts +0 -22
  98. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-data-grid.tsx +0 -1892
  99. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-debounced-callback.ts +0 -19
  100. package/dist/frontend-core/template/src/components/ui/data-grid/styles.css +0 -3
  101. package/dist/frontend-core/template/src/components/ui/data-table/context-menu-simple.tsx +0 -141
  102. package/dist/frontend-core/template/src/components/ui/data-table/data-table.stories.tsx +0 -146
  103. package/dist/frontend-core/template/src/components/ui/data-table/data-table.tsx +0 -447
  104. package/dist/frontend-core/template/src/components/ui/data-table/renderers/country-array-cell-renderer.tsx +0 -77
  105. package/dist/frontend-core/template/src/components/ui/data-table/renderers/country-cell-renderer.tsx +0 -56
  106. package/dist/frontend-core/template/src/components/ui/data-table/renderers/favorite-cell-renderer.tsx +0 -68
  107. package/dist/frontend-core/template/src/components/ui/data-table/renderers/links-cell-renderer.tsx +0 -205
  108. package/dist/frontend-core/template/src/components/ui/data-table/utils/columns.ts +0 -351
  109. package/dist/frontend-core/template/src/components/ui/data-table/utils/data-table.utils.ts +0 -49
  110. package/dist/frontend-core/template/src/components/ui/date-picker/date-picker.stories.tsx +0 -149
  111. package/dist/frontend-core/template/src/components/ui/date-picker/date-picker.tsx +0 -30
  112. package/dist/frontend-core/template/src/components/ui/dialog/dialog.stories.tsx +0 -80
  113. package/dist/frontend-core/template/src/components/ui/dialog/dialog.tsx +0 -134
  114. package/dist/frontend-core/template/src/components/ui/drawer/drawer.stories.tsx +0 -104
  115. package/dist/frontend-core/template/src/components/ui/drawer/drawer.tsx +0 -87
  116. package/dist/frontend-core/template/src/components/ui/dropdown-menu/dropdown-menu.stories.tsx +0 -168
  117. package/dist/frontend-core/template/src/components/ui/dropdown-menu/dropdown-menu.tsx +0 -225
  118. package/dist/frontend-core/template/src/components/ui/input/input.stories.tsx +0 -141
  119. package/dist/frontend-core/template/src/components/ui/input/input.tsx +0 -47
  120. package/dist/frontend-core/template/src/components/ui/label/label.stories.tsx +0 -41
  121. package/dist/frontend-core/template/src/components/ui/label/label.tsx +0 -20
  122. package/dist/frontend-core/template/src/components/ui/loader/loader.stories.tsx +0 -45
  123. package/dist/frontend-core/template/src/components/ui/loader/loader.tsx +0 -17
  124. package/dist/frontend-core/template/src/components/ui/mark-value-renderer/mark-value-renderer.stories.tsx +0 -114
  125. package/dist/frontend-core/template/src/components/ui/mark-value-renderer/mark-value-renderer.tsx +0 -48
  126. package/dist/frontend-core/template/src/components/ui/menubar/menu.stories.tsx +0 -134
  127. package/dist/frontend-core/template/src/components/ui/menubar/menubar.tsx +0 -208
  128. package/dist/frontend-core/template/src/components/ui/modal/modal.stories.tsx +0 -297
  129. package/dist/frontend-core/template/src/components/ui/modal/modal.tsx +0 -80
  130. package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.stories.tsx +0 -213
  131. package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.tsx +0 -142
  132. package/dist/frontend-core/template/src/components/ui/pagination/pagination.stories.tsx +0 -49
  133. package/dist/frontend-core/template/src/components/ui/pagination/pagination.tsx +0 -84
  134. package/dist/frontend-core/template/src/components/ui/popover/popover.stories.tsx +0 -82
  135. package/dist/frontend-core/template/src/components/ui/popover/popover.tsx +0 -55
  136. package/dist/frontend-core/template/src/components/ui/progress/progress.stories.tsx +0 -80
  137. package/dist/frontend-core/template/src/components/ui/progress/progress.tsx +0 -17
  138. package/dist/frontend-core/template/src/components/ui/radio-group/radio-group.stories.tsx +0 -154
  139. package/dist/frontend-core/template/src/components/ui/radio-group/radio-group.tsx +0 -68
  140. package/dist/frontend-core/template/src/components/ui/resizable/resizable.stories.tsx +0 -73
  141. package/dist/frontend-core/template/src/components/ui/resizable/resizeable.tsx +0 -38
  142. package/dist/frontend-core/template/src/components/ui/scroll-area/scroll-area.stories.tsx +0 -55
  143. package/dist/frontend-core/template/src/components/ui/scroll-area/scroll-area.tsx +0 -39
  144. package/dist/frontend-core/template/src/components/ui/select/select.stories.tsx +0 -297
  145. package/dist/frontend-core/template/src/components/ui/select/select.tsx +0 -227
  146. package/dist/frontend-core/template/src/components/ui/separator/separator.tsx +0 -21
  147. package/dist/frontend-core/template/src/components/ui/separator/seperator.stories.tsx +0 -25
  148. package/dist/frontend-core/template/src/components/ui/sheet/sheet.stories.tsx +0 -45
  149. package/dist/frontend-core/template/src/components/ui/sheet/sheet.tsx +0 -107
  150. package/dist/frontend-core/template/src/components/ui/skeleton/skeleton.stories.tsx +0 -26
  151. package/dist/frontend-core/template/src/components/ui/skeleton/skeleton.tsx +0 -7
  152. package/dist/frontend-core/template/src/components/ui/slider/slider.stories.tsx +0 -101
  153. package/dist/frontend-core/template/src/components/ui/slider/slider.tsx +0 -98
  154. package/dist/frontend-core/template/src/components/ui/spinner/spinner.stories.tsx +0 -19
  155. package/dist/frontend-core/template/src/components/ui/spinner/spinner.tsx +0 -21
  156. package/dist/frontend-core/template/src/components/ui/switch/switch.stories.tsx +0 -33
  157. package/dist/frontend-core/template/src/components/ui/switch/switch.tsx +0 -28
  158. package/dist/frontend-core/template/src/components/ui/tabs/tabs.stories.tsx +0 -215
  159. package/dist/frontend-core/template/src/components/ui/tabs/tabs.tsx +0 -70
  160. package/dist/frontend-core/template/src/components/ui/textarea/textarea.stories.tsx +0 -138
  161. package/dist/frontend-core/template/src/components/ui/textarea/textarea.tsx +0 -40
  162. package/dist/frontend-core/template/src/components/ui/toast/toast.mdx +0 -31
  163. package/dist/frontend-core/template/src/components/ui/toast/toast.stories.tsx +0 -89
  164. package/dist/frontend-core/template/src/components/ui/toggle/toggle.stories.tsx +0 -65
  165. package/dist/frontend-core/template/src/components/ui/toggle/toggle.tsx +0 -38
  166. package/dist/frontend-core/template/src/components/ui/toggle-group/toggle-group.stories.tsx +0 -85
  167. package/dist/frontend-core/template/src/components/ui/toggle-group/toggle-group.tsx +0 -54
  168. package/dist/frontend-core/template/src/components/ui/tooltip/tooltip.stories.tsx +0 -29
  169. package/dist/frontend-core/template/src/components/ui/tooltip/tooltip.tsx +0 -29
@@ -1,179 +0,0 @@
1
- import * as ContextMenuPrimitive from '@radix-ui/react-context-menu'
2
- import { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons'
3
-
4
- import * as React from 'react'
5
-
6
- import { cn } from '@lib/utils'
7
-
8
- const ContextMenu = ContextMenuPrimitive.Root
9
-
10
- const ContextMenuTrigger = ContextMenuPrimitive.Trigger
11
-
12
- const ContextMenuGroup = ContextMenuPrimitive.Group
13
-
14
- const ContextMenuPortal = ContextMenuPrimitive.Portal
15
-
16
- const ContextMenuSub = ContextMenuPrimitive.Sub
17
-
18
- const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup
19
-
20
- const ContextMenuSubTrigger = React.forwardRef<
21
- React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,
22
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {
23
- inset?: boolean
24
- }
25
- >(({ className, inset, children, ...props }, ref) => (
26
- <ContextMenuPrimitive.SubTrigger
27
- ref={ref}
28
- className={cn(
29
- 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground',
30
- inset && 'pl-8',
31
- className,
32
- )}
33
- {...props}
34
- >
35
- {children}
36
- <ChevronRightIcon className="ml-auto h-4 w-4" />
37
- </ContextMenuPrimitive.SubTrigger>
38
- ))
39
- ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName
40
-
41
- const ContextMenuSubContent = React.forwardRef<
42
- React.ElementRef<typeof ContextMenuPrimitive.SubContent>,
43
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>
44
- >(({ className, ...props }, ref) => (
45
- <ContextMenuPrimitive.SubContent
46
- ref={ref}
47
- className={cn(
48
- 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
49
- className,
50
- )}
51
- {...props}
52
- />
53
- ))
54
- ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName
55
-
56
- const ContextMenuContent = React.forwardRef<
57
- React.ElementRef<typeof ContextMenuPrimitive.Content>,
58
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>
59
- >(({ className, ...props }, ref) => (
60
- <ContextMenuPrimitive.Portal>
61
- <ContextMenuPrimitive.Content
62
- ref={ref}
63
- className={cn(
64
- 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
65
- className,
66
- )}
67
- {...props}
68
- />
69
- </ContextMenuPrimitive.Portal>
70
- ))
71
- ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName
72
-
73
- const ContextMenuItem = React.forwardRef<
74
- React.ElementRef<typeof ContextMenuPrimitive.Item>,
75
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {
76
- inset?: boolean
77
- }
78
- >(({ className, inset, ...props }, ref) => (
79
- <ContextMenuPrimitive.Item
80
- ref={ref}
81
- className={cn(
82
- 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
83
- inset && 'pl-8',
84
- className,
85
- )}
86
- {...props}
87
- />
88
- ))
89
- ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName
90
-
91
- const ContextMenuCheckboxItem = React.forwardRef<
92
- React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,
93
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>
94
- >(({ className, children, checked, ...props }, ref) => (
95
- <ContextMenuPrimitive.CheckboxItem
96
- ref={ref}
97
- className={cn(
98
- 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
99
- className,
100
- )}
101
- checked={checked}
102
- {...props}
103
- >
104
- <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
105
- <ContextMenuPrimitive.ItemIndicator>
106
- <CheckIcon className="h-4 w-4" />
107
- </ContextMenuPrimitive.ItemIndicator>
108
- </span>
109
- {children}
110
- </ContextMenuPrimitive.CheckboxItem>
111
- ))
112
- ContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName
113
-
114
- const ContextMenuRadioItem = React.forwardRef<
115
- React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,
116
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>
117
- >(({ className, children, ...props }, ref) => (
118
- <ContextMenuPrimitive.RadioItem
119
- ref={ref}
120
- className={cn(
121
- 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
122
- className,
123
- )}
124
- {...props}
125
- >
126
- <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
127
- <ContextMenuPrimitive.ItemIndicator>
128
- <DotFilledIcon className="h-4 w-4 fill-current" />
129
- </ContextMenuPrimitive.ItemIndicator>
130
- </span>
131
- {children}
132
- </ContextMenuPrimitive.RadioItem>
133
- ))
134
- ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName
135
-
136
- const ContextMenuLabel = React.forwardRef<
137
- React.ElementRef<typeof ContextMenuPrimitive.Label>,
138
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {
139
- inset?: boolean
140
- }
141
- >(({ className, inset, ...props }, ref) => (
142
- <ContextMenuPrimitive.Label
143
- ref={ref}
144
- className={cn('px-2 py-1.5 text-sm font-semibold text-foreground', inset && 'pl-8', className)}
145
- {...props}
146
- />
147
- ))
148
- ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName
149
-
150
- const ContextMenuSeparator = React.forwardRef<
151
- React.ElementRef<typeof ContextMenuPrimitive.Separator>,
152
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>
153
- >(({ className, ...props }, ref) => (
154
- <ContextMenuPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-border', className)} {...props} />
155
- ))
156
- ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName
157
-
158
- const ContextMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {
159
- return <span className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} />
160
- }
161
- ContextMenuShortcut.displayName = 'ContextMenuShortcut'
162
-
163
- export {
164
- ContextMenu,
165
- ContextMenuTrigger,
166
- ContextMenuContent,
167
- ContextMenuItem,
168
- ContextMenuCheckboxItem,
169
- ContextMenuRadioItem,
170
- ContextMenuLabel,
171
- ContextMenuSeparator,
172
- ContextMenuShortcut,
173
- ContextMenuGroup,
174
- ContextMenuPortal,
175
- ContextMenuSub,
176
- ContextMenuSubContent,
177
- ContextMenuSubTrigger,
178
- ContextMenuRadioGroup,
179
- }
@@ -1,11 +0,0 @@
1
- import type { Cell, Table } from '@tanstack/react-table'
2
-
3
- export type CellVariantProps<TData, TCell> = {
4
- cell: Cell<TData, TCell>
5
- table: Table<TData>
6
- rowIndex: number
7
- columnId: string
8
- isEditing: boolean
9
- isFocused: boolean
10
- isSelected: boolean
11
- }
@@ -1,116 +0,0 @@
1
- import * as React from 'react'
2
-
3
- import { Checkbox } from '@components/ui/checkbox/checkbox'
4
- import { DataGridCellWrapper } from '@components/ui/data-grid/data-grid-cell-wrapper'
5
-
6
- import { CellVariantProps } from './cell-variant-types'
7
-
8
- export function CheckboxCell<TData>({
9
- cell,
10
- table,
11
- rowIndex,
12
- columnId,
13
- isFocused,
14
- isSelected,
15
- }: Readonly<CellVariantProps<TData, boolean>>) {
16
- const initialValue = cell.getValue()
17
- const [value, setValue] = React.useState(Boolean(initialValue))
18
- const containerRef = React.useRef<HTMLDivElement>(null)
19
- const meta = table.options.meta
20
- const colMeta = cell.column.columnDef.meta
21
- // Normalize editable to a resolver function and memoize to avoid typeof checks per cell
22
- const editableResolver = React.useMemo(() => {
23
- const v = colMeta?.editable
24
- if (v === undefined) {
25
- return () => true
26
- }
27
- return typeof v === 'function' ? (v as (row: TData) => boolean) : () => Boolean(v)
28
- }, [colMeta?.editable])
29
- const isEditable = editableResolver(cell.row.original)
30
-
31
- const onCheckedChange = React.useCallback(
32
- (checked: boolean) => {
33
- setValue(checked)
34
- meta?.onDataUpdate?.({ rowIndex, columnId, value: checked })
35
- },
36
- [meta, rowIndex, columnId],
37
- )
38
-
39
- const onWrapperKeyDown = React.useCallback(
40
- (event: React.KeyboardEvent<HTMLDivElement>) => {
41
- if (!isEditable) {
42
- return
43
- }
44
- if (isFocused && (event.key === '' || event.key === 'Enter')) {
45
- event.preventDefault()
46
- event.stopPropagation()
47
- onCheckedChange(!value)
48
- }
49
- },
50
- [isFocused, value, onCheckedChange, isEditable],
51
- )
52
-
53
- React.useEffect(() => {
54
- setValue(Boolean(initialValue))
55
- }, [initialValue])
56
-
57
- React.useEffect(() => {
58
- if (isFocused && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {
59
- containerRef.current.focus()
60
- }
61
- }, [isFocused, meta?.searchOpen, meta?.isScrolling])
62
-
63
- const onWrapperClick = React.useCallback(
64
- (event: React.MouseEvent) => {
65
- if (!isEditable) {
66
- return
67
- }
68
- if (isFocused) {
69
- event.preventDefault()
70
- event.stopPropagation()
71
- onCheckedChange(!value)
72
- }
73
- },
74
- [isFocused, value, onCheckedChange, isEditable],
75
- )
76
-
77
- const onCheckboxClick = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {
78
- event.stopPropagation()
79
- }, [])
80
-
81
- const onCheckboxMouseDown = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {
82
- event.stopPropagation()
83
- }, [])
84
-
85
- const onCheckboxDoubleClick = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {
86
- event.stopPropagation()
87
- }, [])
88
-
89
- return (
90
- <DataGridCellWrapper
91
- ref={containerRef}
92
- cell={cell}
93
- table={table}
94
- rowIndex={rowIndex}
95
- columnId={columnId}
96
- isEditing={false}
97
- isFocused={isFocused}
98
- isSelected={isSelected}
99
- onClick={onWrapperClick}
100
- onKeyDown={onWrapperKeyDown}
101
- className="flex size-full justify-center"
102
- >
103
- <Checkbox
104
- variant="simple"
105
- iconStyle="simple"
106
- checkIcon="check"
107
- checked={value}
108
- onChange={(event) => onCheckedChange(event.target.checked)}
109
- onClick={onCheckboxClick}
110
- onMouseDown={onCheckboxMouseDown}
111
- onDoubleClick={onCheckboxDoubleClick}
112
- className="border-secondary-foreground"
113
- />
114
- </DataGridCellWrapper>
115
- )
116
- }
@@ -1,157 +0,0 @@
1
- import * as React from 'react'
2
-
3
- import { Calendar } from '@components/ui/calendar/calendar'
4
- import { DataGridCellWrapper } from '@components/ui/data-grid/data-grid-cell-wrapper'
5
- import { Popover, PopoverAnchor, PopoverContent } from '@components/ui/popover/popover'
6
- import { cn } from '@lib/utils'
7
-
8
- import { CellVariantProps } from './cell-variant-types'
9
-
10
- /**
11
- * Parse a date value (Date object or ISO string YYYY-MM-DD) as a local date, not UTC.
12
- * new Date('2025-12-01') interprets as UTC, causing timezone shifts.
13
- */
14
- function parseToLocalDate(value: string | Date | null | undefined): Date | undefined {
15
- if (!value) {
16
- return undefined
17
- }
18
- if (value instanceof Date) {
19
- return value
20
- }
21
- if (typeof value !== 'string') {
22
- return undefined
23
- }
24
-
25
- // Parse ISO date string in local timezone by explicitly setting year, month, day
26
- const regex = /^(\d{4})-(\d{2})-(\d{2})$/
27
- const match = regex.exec(value)
28
- if (!match) {
29
- return undefined
30
- }
31
- const year = Number.parseInt(match[1], 10)
32
- const month = Number.parseInt(match[2], 10) - 1 // months are 0-indexed
33
- const day = Number.parseInt(match[3], 10)
34
-
35
- return new Date(year, month, day)
36
- }
37
-
38
- function formatDateToISOString(date: Date): string {
39
- const year = date.getFullYear()
40
- const month = String(date.getMonth() + 1).padStart(2, '0')
41
- const day = String(date.getDate()).padStart(2, '0')
42
- return `${year}-${month}-${day}`
43
- }
44
-
45
- export function DateCell<TData>({
46
- cell,
47
- table,
48
- rowIndex,
49
- columnId,
50
- isFocused,
51
- isEditing,
52
- isSelected,
53
- }: Readonly<CellVariantProps<TData, string>>) {
54
- const initialValue = cell.getValue() as string | Date | null | undefined
55
- const [value, setValue] = React.useState<Date | undefined>(parseToLocalDate(initialValue))
56
- const [open, setOpen] = React.useState(false)
57
- const containerRef = React.useRef<HTMLDivElement>(null)
58
- const meta = table.options.meta
59
-
60
- const prevInitialValueRef = React.useRef(initialValue)
61
- if (initialValue !== prevInitialValueRef.current) {
62
- prevInitialValueRef.current = initialValue
63
- setValue(parseToLocalDate(initialValue))
64
- }
65
-
66
- const onDateSelect = React.useCallback(
67
- (date: Date | undefined) => {
68
- if (!date) {
69
- return
70
- }
71
-
72
- setValue(date)
73
- meta?.onDataUpdate?.({ rowIndex, columnId, value: formatDateToISOString(date) })
74
- setOpen(false)
75
- meta?.onCellEditingStop?.()
76
- },
77
- [meta, rowIndex, columnId],
78
- )
79
-
80
- const onOpenChange = React.useCallback(
81
- (isOpen: boolean) => {
82
- setOpen(isOpen)
83
- if (!isOpen && isEditing) {
84
- meta?.onCellEditingStop?.()
85
- }
86
- },
87
- [isEditing, meta],
88
- )
89
-
90
- const onWrapperKeyDown = React.useCallback(
91
- (event: React.KeyboardEvent<HTMLDivElement>) => {
92
- if (isEditing) {
93
- if (event.key === 'Escape') {
94
- event.preventDefault()
95
- setValue(parseToLocalDate(initialValue))
96
- setOpen(false)
97
- } else if (event.key === 'Tab') {
98
- event.preventDefault()
99
- setOpen(false)
100
- meta?.onCellEditingStop?.({
101
- direction: event.shiftKey ? 'left' : 'right',
102
- })
103
- }
104
- }
105
- },
106
- [isEditing, initialValue, meta],
107
- )
108
-
109
- React.useEffect(() => {
110
- setOpen(isEditing)
111
- }, [isEditing])
112
-
113
- React.useEffect(() => {
114
- if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {
115
- containerRef.current.focus()
116
- }
117
- }, [isFocused, isEditing, meta?.searchOpen, meta?.isScrolling])
118
-
119
- return (
120
- <DataGridCellWrapper
121
- ref={containerRef}
122
- cell={cell}
123
- table={table}
124
- rowIndex={rowIndex}
125
- columnId={columnId}
126
- isEditing={isEditing}
127
- isFocused={isFocused}
128
- isSelected={isSelected}
129
- onKeyDown={onWrapperKeyDown}
130
- >
131
- <Popover open={open} onOpenChange={onOpenChange}>
132
- <PopoverAnchor asChild>
133
- <span
134
- data-slot="grid-cell-content"
135
- className={cn('tabular-nums', (cell.column.columnDef.meta as any)?.align ?? 'text-right')}
136
- >
137
- {value?.toLocaleDateString() ?? ''}
138
- </span>
139
- </PopoverAnchor>
140
- {isEditing && (
141
- <PopoverContent data-grid-cell-editor="" align="start" sideOffset={10} className="w-auto p-0">
142
- <Calendar
143
- showYearNavigation={true}
144
- autoFocus
145
- captionLayout="dropdown"
146
- mode="single"
147
- className="rounded-md border border-border shadow-sm"
148
- defaultMonth={value}
149
- selected={value}
150
- onSelect={onDateSelect}
151
- />
152
- </PopoverContent>
153
- )}
154
- </Popover>
155
- </DataGridCellWrapper>
156
- )
157
- }
@@ -1,82 +0,0 @@
1
- import type { Cell, Table } from '@tanstack/react-table'
2
-
3
- import * as React from 'react'
4
-
5
- import { DataGridCellWrapper } from '@components/ui/data-grid/data-grid-cell-wrapper'
6
- import { cn } from '@lib/utils'
7
-
8
- export type GanttCellProps<TData> = {
9
- cell: Cell<TData, { start: Date; end: Date; barClassName?: string } | null>
10
- table: Table<TData>
11
- rowIndex: number
12
- columnId: string
13
- isEditing: boolean
14
- isFocused: boolean
15
- isSelected: boolean
16
- }
17
-
18
- export function GanttCell<TData>({
19
- cell,
20
- table,
21
- rowIndex,
22
- columnId,
23
- isFocused,
24
- isEditing,
25
- isSelected,
26
- }: Readonly<GanttCellProps<TData>>) {
27
- const initialValue = cell.getValue() as { start: Date; end: Date; barClassName?: string } | null
28
- const containerRef = React.useRef<HTMLDivElement>(null)
29
- const cellOpts = (cell.column.columnDef.meta as any)?.cell
30
-
31
- const ts = cellOpts?.dateRangeFrom ?? cellOpts?.timelineStart
32
- const te = cellOpts?.dateRangeTo ?? cellOpts?.timelineEnd
33
-
34
- const timelineStartMs = ts instanceof Date ? ts.getTime() : undefined
35
- const timelineEndMs = te instanceof Date ? te.getTime() : undefined
36
-
37
- if (!timelineStartMs || !timelineEndMs) {
38
- return null
39
- }
40
-
41
- const timelineDurationMs = timelineEndMs - timelineStartMs
42
- const hasValidDates = initialValue && initialValue.start instanceof Date && initialValue.end instanceof Date
43
-
44
- const msUntilStart = hasValidDates ? initialValue.start.getTime() - timelineStartMs : 0
45
- // end - start time considering timeline bounds
46
- const barWidthMs = hasValidDates
47
- ? Math.min(initialValue.end.getTime(), timelineEndMs) - Math.max(initialValue.start.getTime(), timelineStartMs)
48
- : 0
49
-
50
- return (
51
- <DataGridCellWrapper
52
- ref={containerRef}
53
- cell={cell}
54
- table={table}
55
- rowIndex={rowIndex}
56
- columnId={columnId}
57
- isEditing={isEditing}
58
- isFocused={isFocused}
59
- isSelected={isSelected}
60
- className="px-1"
61
- >
62
- <div className="size-full flex overflow-hidden">
63
- {hasValidDates && (
64
- <>
65
- <div
66
- className="shrink-0"
67
- style={{
68
- width: `${Math.max(0, (msUntilStart / timelineDurationMs) * 100)}%`,
69
- }}
70
- />
71
- <div
72
- className={cn('shrink-0 h-full rounded-sm bg-primary', initialValue.barClassName)}
73
- style={{
74
- width: `${(barWidthMs / timelineDurationMs) * 100}%`,
75
- }}
76
- />
77
- </>
78
- )}
79
- </div>
80
- </DataGridCellWrapper>
81
- )
82
- }