@ayasofyazilim/ui 0.0.4 → 0.0.6

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 (253) hide show
  1. package/dist/components/accordion.js +1 -1
  2. package/dist/components/accordion.js.map +1 -1
  3. package/dist/components/alert-dialog.js +2 -2
  4. package/dist/components/alert-dialog.js.map +1 -1
  5. package/dist/components/alert.js +1 -1
  6. package/dist/components/alert.js.map +1 -1
  7. package/dist/components/avatar.js +1 -1
  8. package/dist/components/avatar.js.map +1 -1
  9. package/dist/components/badge.js +1 -1
  10. package/dist/components/badge.js.map +1 -1
  11. package/dist/components/breadcrumb.js +1 -1
  12. package/dist/components/breadcrumb.js.map +1 -1
  13. package/dist/components/button-group.js +2 -2
  14. package/dist/components/button-group.js.map +1 -1
  15. package/dist/components/button.js +1 -1
  16. package/dist/components/button.js.map +1 -1
  17. package/dist/components/calendar.js +2 -5
  18. package/dist/components/calendar.js.map +1 -1
  19. package/dist/components/card.js +1 -1
  20. package/dist/components/card.js.map +1 -1
  21. package/dist/components/carousel.js +2 -2
  22. package/dist/components/carousel.js.map +1 -1
  23. package/dist/components/chart.js +1 -1
  24. package/dist/components/chart.js.map +1 -1
  25. package/dist/components/checkbox.js +1 -1
  26. package/dist/components/checkbox.js.map +1 -1
  27. package/dist/components/command.js +2 -2
  28. package/dist/components/command.js.map +1 -1
  29. package/dist/components/context-menu.js +1 -1
  30. package/dist/components/context-menu.js.map +1 -1
  31. package/dist/components/dialog.js +1 -1
  32. package/dist/components/dialog.js.map +1 -1
  33. package/dist/components/drawer.js +1 -1
  34. package/dist/components/drawer.js.map +1 -1
  35. package/dist/components/dropdown-menu.js +1 -1
  36. package/dist/components/dropdown-menu.js.map +1 -1
  37. package/dist/components/field.js +3 -3
  38. package/dist/components/field.js.map +1 -1
  39. package/dist/components/form.js +2 -2
  40. package/dist/components/form.js.map +1 -1
  41. package/dist/components/hover-card.js +1 -1
  42. package/dist/components/hover-card.js.map +1 -1
  43. package/dist/components/input-group.js +4 -4
  44. package/dist/components/input-group.js.map +1 -1
  45. package/dist/components/input-otp.js +1 -1
  46. package/dist/components/input-otp.js.map +1 -1
  47. package/dist/components/input.js +1 -1
  48. package/dist/components/input.js.map +1 -1
  49. package/dist/components/item.js +2 -2
  50. package/dist/components/item.js.map +1 -1
  51. package/dist/components/kbd.js +1 -1
  52. package/dist/components/kbd.js.map +1 -1
  53. package/dist/components/label.js +1 -1
  54. package/dist/components/label.js.map +1 -1
  55. package/dist/components/menubar.js +1 -1
  56. package/dist/components/menubar.js.map +1 -1
  57. package/dist/components/navigation-menu.js +1 -1
  58. package/dist/components/navigation-menu.js.map +1 -1
  59. package/dist/components/pagination.js +2 -4
  60. package/dist/components/pagination.js.map +1 -1
  61. package/dist/components/progress.js +1 -1
  62. package/dist/components/progress.js.map +1 -1
  63. package/dist/components/radio-group.js +1 -1
  64. package/dist/components/radio-group.js.map +1 -1
  65. package/dist/components/resizable.js +1 -1
  66. package/dist/components/resizable.js.map +1 -1
  67. package/dist/components/scroll-area.js +1 -1
  68. package/dist/components/scroll-area.js.map +1 -1
  69. package/dist/components/select.js +1 -1
  70. package/dist/components/select.js.map +1 -1
  71. package/dist/components/separator.js +1 -1
  72. package/dist/components/separator.js.map +1 -1
  73. package/dist/components/sheet.js +1 -1
  74. package/dist/components/sheet.js.map +1 -1
  75. package/dist/components/skeleton.js +1 -1
  76. package/dist/components/skeleton.js.map +1 -1
  77. package/dist/components/slider.js +1 -1
  78. package/dist/components/slider.js.map +1 -1
  79. package/dist/components/spinner.js +1 -1
  80. package/dist/components/spinner.js.map +1 -1
  81. package/dist/components/stepper.js +1 -1
  82. package/dist/components/stepper.js.map +1 -1
  83. package/dist/components/switch.js +1 -1
  84. package/dist/components/switch.js.map +1 -1
  85. package/dist/components/table.js +1 -1
  86. package/dist/components/table.js.map +1 -1
  87. package/dist/components/tabs.js +1 -1
  88. package/dist/components/tabs.js.map +1 -1
  89. package/dist/components/textarea.js +1 -1
  90. package/dist/components/textarea.js.map +1 -1
  91. package/dist/components/toggle-group.js +2 -2
  92. package/dist/components/toggle-group.js.map +1 -1
  93. package/dist/components/toggle.js +1 -1
  94. package/dist/components/toggle.js.map +1 -1
  95. package/dist/components/tooltip.js +1 -1
  96. package/dist/components/tooltip.js.map +1 -1
  97. package/dist/custom/action-button.js +2 -4
  98. package/dist/custom/action-button.js.map +1 -1
  99. package/dist/custom/async-select.js +7 -7
  100. package/dist/custom/async-select.js.map +1 -1
  101. package/dist/custom/awesome-not-found.js +3 -3
  102. package/dist/custom/awesome-not-found.js.map +1 -1
  103. package/dist/custom/charts/area-chart.js +2 -2
  104. package/dist/custom/charts/area-chart.js.map +1 -1
  105. package/dist/custom/charts/bar-chart.js +2 -2
  106. package/dist/custom/charts/bar-chart.js.map +1 -1
  107. package/dist/custom/charts/chart-card.js +3 -3
  108. package/dist/custom/charts/chart-card.js.map +1 -1
  109. package/dist/custom/charts/pie-chart.js +2 -2
  110. package/dist/custom/charts/pie-chart.js.map +1 -1
  111. package/dist/custom/charts/radar-chart.js +2 -2
  112. package/dist/custom/charts/radar-chart.js.map +1 -1
  113. package/dist/custom/combobox.js +8 -8
  114. package/dist/custom/combobox.js.map +1 -1
  115. package/dist/custom/confirm-dialog.js +3 -3
  116. package/dist/custom/confirm-dialog.js.map +1 -1
  117. package/dist/custom/country-selector.js +6 -6
  118. package/dist/custom/country-selector.js.map +1 -1
  119. package/dist/custom/date-picker/calendar-rac.js +1 -1
  120. package/dist/custom/date-picker/calendar-rac.js.map +1 -1
  121. package/dist/custom/date-picker/datefield-rac.js +1 -1
  122. package/dist/custom/date-picker/datefield-rac.js.map +1 -1
  123. package/dist/custom/date-picker/index.js +3 -3
  124. package/dist/custom/date-picker/index.js.map +1 -1
  125. package/dist/custom/date-picker-old.js +4 -4
  126. package/dist/custom/date-picker-old.js.map +1 -1
  127. package/dist/custom/date-tooltip.js +1 -1
  128. package/dist/custom/date-tooltip.js.map +1 -1
  129. package/dist/custom/document-scanner/corner-adjustment/action-buttons.js +1 -1
  130. package/dist/custom/document-scanner/corner-adjustment/action-buttons.js.map +1 -1
  131. package/dist/custom/document-scanner/corner-adjustment/corner-handle.js +1 -1
  132. package/dist/custom/document-scanner/corner-adjustment/corner-handle.js.map +1 -1
  133. package/dist/custom/document-scanner/index.js +2 -2
  134. package/dist/custom/document-scanner/index.js.map +1 -1
  135. package/dist/custom/document-viewer/controllers.js +3 -3
  136. package/dist/custom/document-viewer/controllers.js.map +1 -1
  137. package/dist/custom/document-viewer/index.js +1 -1
  138. package/dist/custom/document-viewer/index.js.map +1 -1
  139. package/dist/custom/document-viewer/renderers/pdf.js +1 -1
  140. package/dist/custom/document-viewer/renderers/pdf.js.map +1 -1
  141. package/dist/custom/email-input/email.js +4 -4
  142. package/dist/custom/email-input/email.js.map +1 -1
  143. package/dist/custom/file-uploader.js +6 -6
  144. package/dist/custom/file-uploader.js.map +1 -1
  145. package/dist/custom/filter-component/fields/async-select.js +1 -1
  146. package/dist/custom/filter-component/fields/async-select.js.map +1 -1
  147. package/dist/custom/filter-component/fields/date.js +3 -3
  148. package/dist/custom/filter-component/fields/date.js.map +1 -1
  149. package/dist/custom/filter-component/fields/multi-select.js +1 -1
  150. package/dist/custom/filter-component/fields/multi-select.js.map +1 -1
  151. package/dist/custom/filter-component/index.js +4 -4
  152. package/dist/custom/filter-component/index.js.map +1 -1
  153. package/dist/custom/image-canvas.js +1 -1
  154. package/dist/custom/image-canvas.js.map +1 -1
  155. package/dist/custom/master-data-grid/components/filters/client-filter.js +2 -2
  156. package/dist/custom/master-data-grid/components/filters/client-filter.js.map +1 -1
  157. package/dist/custom/master-data-grid/components/filters/multi-filter-dialog.js +2 -2
  158. package/dist/custom/master-data-grid/components/filters/multi-filter-dialog.js.map +1 -1
  159. package/dist/custom/master-data-grid/components/filters/server-filter.js +5 -5
  160. package/dist/custom/master-data-grid/components/filters/server-filter.js.map +1 -1
  161. package/dist/custom/master-data-grid/components/table/cell-renderer.js +1 -1
  162. package/dist/custom/master-data-grid/components/table/cell-renderer.js.map +1 -1
  163. package/dist/custom/master-data-grid/hooks/use-columns.js +1 -1
  164. package/dist/custom/master-data-grid/hooks/use-columns.js.map +1 -1
  165. package/dist/custom/multi-select.js +6 -6
  166. package/dist/custom/multi-select.js.map +1 -1
  167. package/dist/custom/password-input.js +1 -1
  168. package/dist/custom/password-input.js.map +1 -1
  169. package/dist/custom/phone-input.js +2 -2
  170. package/dist/custom/phone-input.js.map +1 -1
  171. package/dist/custom/schema-form/custom/label.js +3 -3
  172. package/dist/custom/schema-form/custom/label.js.map +1 -1
  173. package/dist/custom/schema-form/fields/base-input-field.js +2 -2
  174. package/dist/custom/schema-form/fields/base-input-field.js.map +1 -1
  175. package/dist/custom/schema-form/fields/field.js +2 -2
  176. package/dist/custom/schema-form/fields/field.js.map +1 -1
  177. package/dist/custom/schema-form/fields/table-array/array-field-item.js +5 -5
  178. package/dist/custom/schema-form/fields/table-array/array-field-item.js.map +1 -1
  179. package/dist/custom/schema-form/fields/table-array/array-field-template.js +3 -3
  180. package/dist/custom/schema-form/fields/table-array/array-field-template.js.map +1 -1
  181. package/dist/custom/schema-form/index.js +1 -1
  182. package/dist/custom/schema-form/index.js.map +1 -1
  183. package/dist/custom/schema-form/templates/description.js +1 -1
  184. package/dist/custom/schema-form/templates/description.js.map +1 -1
  185. package/dist/custom/schema-form/templates/submit.js +2 -2
  186. package/dist/custom/schema-form/templates/submit.js.map +1 -1
  187. package/dist/custom/schema-form/utils/schemas.js +1 -1
  188. package/dist/custom/schema-form/utils/schemas.js.map +1 -1
  189. package/dist/custom/schema-form/widgets/boolean.js +4 -4
  190. package/dist/custom/schema-form/widgets/boolean.js.map +1 -1
  191. package/dist/custom/schema-form/widgets/combobox.js +7 -7
  192. package/dist/custom/schema-form/widgets/combobox.js.map +1 -1
  193. package/dist/custom/schema-form/widgets/date.js +1 -1
  194. package/dist/custom/schema-form/widgets/date.js.map +1 -1
  195. package/dist/custom/schema-form/widgets/email.js +2 -2
  196. package/dist/custom/schema-form/widgets/email.js.map +1 -1
  197. package/dist/custom/schema-form/widgets/password.js +1 -1
  198. package/dist/custom/schema-form/widgets/password.js.map +1 -1
  199. package/dist/custom/schema-form/widgets/phone.js +1 -1
  200. package/dist/custom/schema-form/widgets/phone.js.map +1 -1
  201. package/dist/custom/schema-form/widgets/select.js +3 -3
  202. package/dist/custom/schema-form/widgets/select.js.map +1 -1
  203. package/dist/custom/schema-form/widgets/selectable.js +1 -1
  204. package/dist/custom/schema-form/widgets/selectable.js.map +1 -1
  205. package/dist/custom/schema-form/widgets/string-array.js +3 -3
  206. package/dist/custom/schema-form/widgets/string-array.js.map +1 -1
  207. package/dist/custom/schema-form/widgets/url.js +2 -2
  208. package/dist/custom/schema-form/widgets/url.js.map +1 -1
  209. package/dist/custom/section-layout-v2.js +3 -3
  210. package/dist/custom/section-layout-v2.js.map +1 -1
  211. package/dist/custom/select-tabs.js +2 -2
  212. package/dist/custom/select-tabs.js.map +1 -1
  213. package/dist/custom/stepper.js +2 -2
  214. package/dist/custom/stepper.js.map +1 -1
  215. package/dist/custom/tab-layout.js +2 -2
  216. package/dist/custom/tab-layout.js.map +1 -1
  217. package/dist/custom/tanstack-table/fields/tanstack-table-column-header.js +3 -3
  218. package/dist/custom/tanstack-table/fields/tanstack-table-column-header.js.map +1 -1
  219. package/dist/custom/tanstack-table/fields/tanstack-table-filter-date.js +4 -4
  220. package/dist/custom/tanstack-table/fields/tanstack-table-filter-date.js.map +1 -1
  221. package/dist/custom/tanstack-table/fields/tanstack-table-filter-faceted.js +6 -6
  222. package/dist/custom/tanstack-table/fields/tanstack-table-filter-faceted.js.map +1 -1
  223. package/dist/custom/tanstack-table/fields/tanstack-table-filter-text.js +5 -8
  224. package/dist/custom/tanstack-table/fields/tanstack-table-filter-text.js.map +1 -1
  225. package/dist/custom/tanstack-table/fields/tanstack-table-pagination.js +2 -2
  226. package/dist/custom/tanstack-table/fields/tanstack-table-pagination.js.map +1 -1
  227. package/dist/custom/tanstack-table/fields/tanstack-table-plain-table.js +2 -2
  228. package/dist/custom/tanstack-table/fields/tanstack-table-plain-table.js.map +1 -1
  229. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-confirmation.js +2 -2
  230. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-confirmation.js.map +1 -1
  231. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-custom-dialog.js +2 -2
  232. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions-custom-dialog.js.map +1 -1
  233. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions.js +3 -3
  234. package/dist/custom/tanstack-table/fields/tanstack-table-row-actions.js.map +1 -1
  235. package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-custom-dialog.js +3 -3
  236. package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-custom-dialog.js.map +1 -1
  237. package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-schemaform-dialog.js +2 -2
  238. package/dist/custom/tanstack-table/fields/tanstack-table-table-actions-schemaform-dialog.js.map +1 -1
  239. package/dist/custom/tanstack-table/fields/tanstack-table-toolbar.js +1 -1
  240. package/dist/custom/tanstack-table/fields/tanstack-table-toolbar.js.map +1 -1
  241. package/dist/custom/tanstack-table/fields/tanstack-table-view-options.js +2 -2
  242. package/dist/custom/tanstack-table/fields/tanstack-table-view-options.js.map +1 -1
  243. package/dist/custom/tanstack-table/utils/columns-by-row-data.js +3 -3
  244. package/dist/custom/tanstack-table/utils/columns-by-row-data.js.map +1 -1
  245. package/dist/custom/tanstack-table/utils/editable-columns-by-row-data.js +5 -5
  246. package/dist/custom/tanstack-table/utils/editable-columns-by-row-data.js.map +1 -1
  247. package/dist/custom/timeline.js +1 -1
  248. package/dist/custom/timeline.js.map +1 -1
  249. package/dist/custom/tree.js +1 -1
  250. package/dist/custom/tree.js.map +1 -1
  251. package/dist/custom/webcam.js +2 -2
  252. package/dist/custom/webcam.js.map +1 -1
  253. package/package.json +13 -84
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/custom/filter-component/index.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { FilterIcon } from \"lucide-react\";\r\nimport {\r\n Dispatch,\r\n JSX,\r\n ReactNode,\r\n SetStateAction,\r\n useState,\r\n useTransition,\r\n} from \"react\";\r\nimport { Button } from \"@repo/ayasofyazilim-ui/components/button\";\r\nimport {\r\n Card,\r\n CardContent,\r\n CardHeader,\r\n} from \"@repo/ayasofyazilim-ui/components/card\";\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from \"@repo/ayasofyazilim-ui/components/collapsible\";\r\nimport { cn } from \"@repo/ayasofyazilim-ui/lib/utils\";\r\nimport AsyncSelectField from \"./fields/async-select\";\r\nimport DateField from \"./fields/date\";\r\nimport MultiSelectField from \"./fields/multi-select\";\r\n\r\nexport type FilterComponentSearchItem = { id: string; name: string };\r\nexport type DateSelectType = {\r\n title: string;\r\n id: string;\r\n placeholder?: string;\r\n onChange: Dispatch<SetStateAction<string>>;\r\n value: string;\r\n options: {\r\n label: string;\r\n value: string;\r\n }[];\r\n order?: number;\r\n};\r\n\r\nexport type MultiSelectType = {\r\n title: string;\r\n value: string[];\r\n options: { label: string; value: string }[];\r\n onChange: Dispatch<SetStateAction<string[]>>;\r\n order?: number;\r\n placeholder?: string;\r\n selectAllLabel?: string;\r\n id: string;\r\n};\r\nexport type AsyncSelectType = {\r\n id: string;\r\n title: string;\r\n fetchAction: (search: string) => Promise<FilterComponentSearchItem[]>;\r\n onChange: Dispatch<SetStateAction<FilterComponentSearchItem[]>>;\r\n value: FilterComponentSearchItem[];\r\n multiple?: boolean;\r\n order?: number;\r\n};\r\nexport type CustomFieldType = { order?: number; component: JSX.Element };\r\n\r\nfunction isAsyncSelectType(\r\n filter: DateSelectType | MultiSelectType | AsyncSelectType | CustomFieldType\r\n): filter is AsyncSelectType {\r\n return (filter as AsyncSelectType).fetchAction !== undefined;\r\n}\r\n\r\nfunction isMultiSelectType(\r\n filter: DateSelectType | MultiSelectType | AsyncSelectType | CustomFieldType\r\n): filter is MultiSelectType {\r\n return (\r\n (filter as MultiSelectType).options !== undefined &&\r\n Array.isArray((filter as MultiSelectType).value)\r\n );\r\n}\r\n\r\nfunction isDateSelectType(\r\n filter: DateSelectType | MultiSelectType | AsyncSelectType | CustomFieldType\r\n): filter is DateSelectType {\r\n return (\r\n (filter as DateSelectType).options !== undefined &&\r\n typeof (filter as DateSelectType).value === \"string\"\r\n );\r\n}\r\n\r\nexport default function FilterComponent({\r\n dateSelect,\r\n multiSelect,\r\n asyncSelect,\r\n onSubmit,\r\n filtersText = \"Filters\",\r\n searchText = \"Search\",\r\n applyFilterText = \"Apply\",\r\n className,\r\n cardClassName,\r\n defaultOpen = true,\r\n customField,\r\n disabled = false,\r\n isCollapsible = true,\r\n filterGuidanceContent,\r\n}: {\r\n dateSelect: DateSelectType[];\r\n multiSelect: MultiSelectType[];\r\n asyncSelect: AsyncSelectType[];\r\n onSubmit: () => void;\r\n filtersText?: string;\r\n applyFilterText?: string;\r\n searchText?: string;\r\n className?: string;\r\n cardClassName?: string;\r\n defaultOpen?: boolean;\r\n disabled?: boolean;\r\n customField?: CustomFieldType[];\r\n isCollapsible?: boolean;\r\n filterGuidanceContent?: ReactNode;\r\n}) {\r\n const fields = [\r\n ...dateSelect,\r\n ...multiSelect,\r\n ...asyncSelect,\r\n ...(customField || []),\r\n ].sort((a, b) => (a.order || 0) - (b.order || 0));\r\n\r\n const [isPending, startTransition] = useTransition();\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n function handleSubmit() {\r\n startTransition(() => {\r\n onSubmit();\r\n });\r\n }\r\n return (\r\n <Collapsible\r\n open={isOpen}\r\n onOpenChange={setIsOpen}\r\n className={cn(\"w-full space-y-2\", className)}\r\n >\r\n {isCollapsible && (\r\n <CollapsibleTrigger asChild>\r\n <Button variant=\"outline\" size=\"icon\" disabled={!isCollapsible}>\r\n <FilterIcon className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Filters</span>\r\n </Button>\r\n </CollapsibleTrigger>\r\n )}\r\n <CollapsibleContent className=\"space-y-2\">\r\n <Card\r\n className={cn(\r\n \"shadow-none\",\r\n !filterGuidanceContent && \"mx-auto\",\r\n cardClassName\r\n )}\r\n >\r\n <CardHeader className=\"flex flex-row font-bold text-xl items-center justify-between\">\r\n {filtersText}\r\n </CardHeader>\r\n <CardContent className=\"flex flex-row gap-3 items-start\">\r\n {filterGuidanceContent && (\r\n <div className=\"w-1/2 text-sm text-muted-foreground\">\r\n {filterGuidanceContent}\r\n </div>\r\n )}\r\n\r\n <div\r\n className={cn(\r\n \"flex flex-col gap-4\",\r\n filterGuidanceContent ? \"w-1/2\" : \"w-full\"\r\n )}\r\n >\r\n {fields.map((filter, index) => {\r\n if (isAsyncSelectType(filter)) {\r\n return (\r\n <AsyncSelectField\r\n key={filter.id}\r\n filter={filter}\r\n isPending={isPending || disabled}\r\n searchText={searchText}\r\n />\r\n );\r\n }\r\n if (isMultiSelectType(filter)) {\r\n return (\r\n <MultiSelectField\r\n key={filter.id}\r\n filter={filter}\r\n isPending={isPending || disabled}\r\n />\r\n );\r\n }\r\n if (isDateSelectType(filter)) {\r\n return (\r\n <DateField\r\n key={filter.id}\r\n filter={filter}\r\n isPending={isPending || disabled}\r\n />\r\n );\r\n }\r\n return (\r\n <div key={`c${index.toString()}`}>{filter.component}</div>\r\n );\r\n })}\r\n\r\n <Button\r\n disabled={isPending || disabled}\r\n onClick={() => handleSubmit()}\r\n variant=\"default\"\r\n >\r\n {applyFilterText}\r\n </Button>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n </CollapsibleContent>\r\n </Collapsible>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/custom/filter-component/index.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { FilterIcon } from \"lucide-react\";\r\nimport {\r\n Dispatch,\r\n JSX,\r\n ReactNode,\r\n SetStateAction,\r\n useState,\r\n useTransition,\r\n} from \"react\";\r\nimport { Button } from \"@ayasofyazilim/ui/components/button\";\r\nimport {\r\n Card,\r\n CardContent,\r\n CardHeader,\r\n} from \"@ayasofyazilim/ui/components/card\";\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from \"@ayasofyazilim/ui/components/collapsible\";\r\nimport { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\nimport AsyncSelectField from \"./fields/async-select\";\r\nimport DateField from \"./fields/date\";\r\nimport MultiSelectField from \"./fields/multi-select\";\r\n\r\nexport type FilterComponentSearchItem = { id: string; name: string };\r\nexport type DateSelectType = {\r\n title: string;\r\n id: string;\r\n placeholder?: string;\r\n onChange: Dispatch<SetStateAction<string>>;\r\n value: string;\r\n options: {\r\n label: string;\r\n value: string;\r\n }[];\r\n order?: number;\r\n};\r\n\r\nexport type MultiSelectType = {\r\n title: string;\r\n value: string[];\r\n options: { label: string; value: string }[];\r\n onChange: Dispatch<SetStateAction<string[]>>;\r\n order?: number;\r\n placeholder?: string;\r\n selectAllLabel?: string;\r\n id: string;\r\n};\r\nexport type AsyncSelectType = {\r\n id: string;\r\n title: string;\r\n fetchAction: (search: string) => Promise<FilterComponentSearchItem[]>;\r\n onChange: Dispatch<SetStateAction<FilterComponentSearchItem[]>>;\r\n value: FilterComponentSearchItem[];\r\n multiple?: boolean;\r\n order?: number;\r\n};\r\nexport type CustomFieldType = { order?: number; component: JSX.Element };\r\n\r\nfunction isAsyncSelectType(\r\n filter: DateSelectType | MultiSelectType | AsyncSelectType | CustomFieldType,\r\n): filter is AsyncSelectType {\r\n return (filter as AsyncSelectType).fetchAction !== undefined;\r\n}\r\n\r\nfunction isMultiSelectType(\r\n filter: DateSelectType | MultiSelectType | AsyncSelectType | CustomFieldType,\r\n): filter is MultiSelectType {\r\n return (\r\n (filter as MultiSelectType).options !== undefined &&\r\n Array.isArray((filter as MultiSelectType).value)\r\n );\r\n}\r\n\r\nfunction isDateSelectType(\r\n filter: DateSelectType | MultiSelectType | AsyncSelectType | CustomFieldType,\r\n): filter is DateSelectType {\r\n return (\r\n (filter as DateSelectType).options !== undefined &&\r\n typeof (filter as DateSelectType).value === \"string\"\r\n );\r\n}\r\n\r\nexport default function FilterComponent({\r\n dateSelect,\r\n multiSelect,\r\n asyncSelect,\r\n onSubmit,\r\n filtersText = \"Filters\",\r\n searchText = \"Search\",\r\n applyFilterText = \"Apply\",\r\n className,\r\n cardClassName,\r\n defaultOpen = true,\r\n customField,\r\n disabled = false,\r\n isCollapsible = true,\r\n filterGuidanceContent,\r\n}: {\r\n dateSelect: DateSelectType[];\r\n multiSelect: MultiSelectType[];\r\n asyncSelect: AsyncSelectType[];\r\n onSubmit: () => void;\r\n filtersText?: string;\r\n applyFilterText?: string;\r\n searchText?: string;\r\n className?: string;\r\n cardClassName?: string;\r\n defaultOpen?: boolean;\r\n disabled?: boolean;\r\n customField?: CustomFieldType[];\r\n isCollapsible?: boolean;\r\n filterGuidanceContent?: ReactNode;\r\n}) {\r\n const fields = [\r\n ...dateSelect,\r\n ...multiSelect,\r\n ...asyncSelect,\r\n ...(customField || []),\r\n ].sort((a, b) => (a.order || 0) - (b.order || 0));\r\n\r\n const [isPending, startTransition] = useTransition();\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n function handleSubmit() {\r\n startTransition(() => {\r\n onSubmit();\r\n });\r\n }\r\n return (\r\n <Collapsible\r\n open={isOpen}\r\n onOpenChange={setIsOpen}\r\n className={cn(\"w-full space-y-2\", className)}\r\n >\r\n {isCollapsible && (\r\n <CollapsibleTrigger asChild>\r\n <Button variant=\"outline\" size=\"icon\" disabled={!isCollapsible}>\r\n <FilterIcon className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Filters</span>\r\n </Button>\r\n </CollapsibleTrigger>\r\n )}\r\n <CollapsibleContent className=\"space-y-2\">\r\n <Card\r\n className={cn(\r\n \"shadow-none\",\r\n !filterGuidanceContent && \"mx-auto\",\r\n cardClassName,\r\n )}\r\n >\r\n <CardHeader className=\"flex flex-row font-bold text-xl items-center justify-between\">\r\n {filtersText}\r\n </CardHeader>\r\n <CardContent className=\"flex flex-row gap-3 items-start\">\r\n {filterGuidanceContent && (\r\n <div className=\"w-1/2 text-sm text-muted-foreground\">\r\n {filterGuidanceContent}\r\n </div>\r\n )}\r\n\r\n <div\r\n className={cn(\r\n \"flex flex-col gap-4\",\r\n filterGuidanceContent ? \"w-1/2\" : \"w-full\",\r\n )}\r\n >\r\n {fields.map((filter, index) => {\r\n if (isAsyncSelectType(filter)) {\r\n return (\r\n <AsyncSelectField\r\n key={filter.id}\r\n filter={filter}\r\n isPending={isPending || disabled}\r\n searchText={searchText}\r\n />\r\n );\r\n }\r\n if (isMultiSelectType(filter)) {\r\n return (\r\n <MultiSelectField\r\n key={filter.id}\r\n filter={filter}\r\n isPending={isPending || disabled}\r\n />\r\n );\r\n }\r\n if (isDateSelectType(filter)) {\r\n return (\r\n <DateField\r\n key={filter.id}\r\n filter={filter}\r\n isPending={isPending || disabled}\r\n />\r\n );\r\n }\r\n return (\r\n <div key={`c${index.toString()}`}>{filter.component}</div>\r\n );\r\n })}\r\n\r\n <Button\r\n disabled={isPending || disabled}\r\n onClick={() => handleSubmit()}\r\n variant=\"default\"\r\n >\r\n {applyFilterText}\r\n </Button>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n </CollapsibleContent>\r\n </Collapsible>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useRef, useState } from "react";
4
- import { cn } from "@repo/ayasofyazilim-ui/lib/utils";
4
+ import { cn } from "@ayasofyazilim/ui/lib/utils";
5
5
  function ImageCanvas({
6
6
  imageUrl,
7
7
  zoom = 1,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/custom/image-canvas.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { cn } from \"@repo/ayasofyazilim-ui/lib/utils\";\r\n\r\ntype Props = {\r\n imageUrl: string;\r\n zoom?: number;\r\n classNames?: {\r\n container?: string;\r\n canvas?: string;\r\n };\r\n minZoom?: number;\r\n maxZoom?: number;\r\n onZoomChange?: (zoom: number) => void;\r\n};\r\n\r\nexport default function ImageCanvas({\r\n imageUrl,\r\n zoom = 1,\r\n classNames,\r\n onZoomChange,\r\n minZoom = 0.1,\r\n maxZoom = 5,\r\n}: Props) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const [image, setImage] = useState<HTMLImageElement | null>(null);\r\n const [currentZoom, setCurrentZoom] = useState(zoom);\r\n const [position, setPosition] = useState({ x: 0, y: 0 });\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const renderError = useCallback((errorMessage: string) => {\r\n if (!canvasRef.current) return;\r\n\r\n const canvas = canvasRef.current;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n // Clear canvas\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Set styling for the error message\r\n ctx.fillStyle = \"rgba(220, 53, 69, 0.1)\"; // Light red background\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n ctx.font = \"16px Arial\";\r\n ctx.fillStyle = \"#dc3545\"; // Bootstrap danger color\r\n ctx.textAlign = \"center\";\r\n ctx.textBaseline = \"middle\";\r\n\r\n // Split message by newlines and render each line\r\n const lines = errorMessage.split(\"\\n\");\r\n const lineHeight = 20;\r\n const startY = canvas.height / 2 - (lines.length * lineHeight) / 2;\r\n\r\n lines.forEach((line, index) => {\r\n ctx.fillText(line, canvas.width / 2, startY + index * lineHeight);\r\n });\r\n }, []);\r\n\r\n // Memoized rendering function\r\n const renderCanvas = useCallback(() => {\r\n if (!canvasRef.current) return;\r\n if (!image) {\r\n if (error) {\r\n renderError(error);\r\n }\r\n return;\r\n }\r\n const canvas = canvasRef.current;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n // Set canvas dimensions to match container\r\n canvas.width = canvas.clientWidth;\r\n canvas.height = canvas.clientHeight;\r\n\r\n // Clear the canvas\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Calculate the center of the canvas\r\n const centerX = canvas.width / 2;\r\n const centerY = canvas.height / 2;\r\n\r\n // Calculate the scaled dimensions\r\n const scaledWidth = image.width * currentZoom;\r\n const scaledHeight = image.height * currentZoom;\r\n\r\n // Calculate position to center the image\r\n const x = centerX - scaledWidth / 2 + position.x;\r\n const y = centerY - scaledHeight / 2 + position.y;\r\n\r\n // Draw the image with the current zoom and position\r\n ctx.drawImage(image, x, y, scaledWidth, scaledHeight);\r\n }, [image, currentZoom, position]); // Load the image - optimized to properly clean up\r\n useEffect(() => {\r\n const img = new Image();\r\n\r\n const onLoad = () => {\r\n setImage(img);\r\n // We need to wait for the next render cycle after setImage before rendering the canvas\r\n // This ensures the image state is updated before trying to render\r\n setTimeout(() => renderCanvas(), 0);\r\n };\r\n\r\n const onError = (e: ErrorEvent) => {\r\n const errorMsg = e.message || \"Failed to load image\";\r\n setError(`Failed to load image: ${errorMsg}`);\r\n setImage(null);\r\n setTimeout(() => renderCanvas(), 0);\r\n };\r\n\r\n img.addEventListener(\"load\", onLoad);\r\n img.addEventListener(\"error\", onError);\r\n\r\n try {\r\n img.src = imageUrl;\r\n img.crossOrigin = \"anonymous\"; // Handle CORS if needed\r\n img.className = \"border rounded-md\";\r\n } catch (err) {\r\n const errorMsg = err instanceof Error ? err.message : \"Invalid image URL\";\r\n setError(`Image error: ${errorMsg}`);\r\n }\r\n return () => {\r\n img.removeEventListener(\"load\", onLoad);\r\n img.removeEventListener(\"error\", onError);\r\n img.src = \"\"; // Clean up to avoid memory leaks\r\n };\r\n }, [imageUrl]);\r\n\r\n // Ensure the canvas is drawn whenever image, zoom, or position changes\r\n useEffect(() => {\r\n if (image) {\r\n renderCanvas();\r\n }\r\n }, [image, currentZoom, position, renderCanvas]);\r\n\r\n // Handle window resize with requestAnimationFrame for better performance\r\n useEffect(() => {\r\n let frameId: number;\r\n let isResizing = false;\r\n\r\n const handleResize = () => {\r\n if (!isResizing) {\r\n isResizing = true;\r\n\r\n frameId = requestAnimationFrame(() => {\r\n renderCanvas();\r\n isResizing = false;\r\n });\r\n }\r\n };\r\n\r\n window.addEventListener(\"resize\", handleResize);\r\n\r\n return () => {\r\n window.removeEventListener(\"resize\", handleResize);\r\n cancelAnimationFrame(frameId);\r\n };\r\n }, [renderCanvas]);\r\n\r\n // Handle zoom changes from props\r\n useEffect(() => {\r\n if (zoom !== undefined) {\r\n // Set the zoom level\r\n if (zoom >= minZoom && zoom <= maxZoom && zoom !== currentZoom) {\r\n setCurrentZoom(zoom);\r\n if (onZoomChange) {\r\n onZoomChange(zoom);\r\n }\r\n }\r\n }\r\n }, [zoom, minZoom, maxZoom, currentZoom, onZoomChange]);\r\n\r\n // Mouse event handlers for dragging - memoized with useCallback\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent<HTMLCanvasElement>) => {\r\n e.preventDefault();\r\n setIsDragging(true);\r\n setDragStart({ x: e.clientX - position.x, y: e.clientY - position.y });\r\n },\r\n [position]\r\n );\r\n\r\n const handleMouseMove = useCallback(\r\n (e: React.MouseEvent<HTMLCanvasElement>) => {\r\n if (!isDragging) return;\r\n\r\n e.preventDefault();\r\n setPosition({\r\n x: e.clientX - dragStart.x,\r\n y: e.clientY - dragStart.y,\r\n });\r\n },\r\n [isDragging, dragStart]\r\n );\r\n\r\n const handleMouseUp = useCallback(() => {\r\n setIsDragging(false);\r\n }, []);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n setIsDragging(false);\r\n }, []);\r\n const handleWheel = useCallback(\r\n (e: WheelEvent) => {\r\n e.preventDefault();\r\n\r\n // Calculate new zoom level\r\n const zoomFactor = 0.1;\r\n let newZoom = currentZoom;\r\n\r\n if (e.deltaY < 0) {\r\n // Zoom in\r\n newZoom = Math.min(currentZoom + zoomFactor, maxZoom);\r\n } else {\r\n // Zoom out\r\n newZoom = Math.max(currentZoom - zoomFactor, minZoom);\r\n }\r\n\r\n if (newZoom !== currentZoom) {\r\n setCurrentZoom(newZoom);\r\n if (onZoomChange) {\r\n onZoomChange(newZoom);\r\n }\r\n }\r\n },\r\n [currentZoom, minZoom, maxZoom, onZoomChange]\r\n ); // Add non-passive wheel event listener\r\n useEffect(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return undefined;\r\n\r\n canvas.addEventListener(\"wheel\", handleWheel, { passive: false });\r\n\r\n return () => {\r\n canvas.removeEventListener(\"wheel\", handleWheel);\r\n };\r\n }, [handleWheel]);\r\n\r\n return (\r\n <div className={cn(`relative w-full h-full`, classNames?.container)}>\r\n <canvas\r\n ref={canvasRef}\r\n className={cn(\r\n \"w-full h-full cursor-grab\",\r\n isDragging ? \"cursor-grabbing\" : \"\",\r\n classNames?.canvas\r\n )}\r\n onMouseDown={handleMouseDown}\r\n onMouseMove={handleMouseMove}\r\n onMouseUp={handleMouseUp}\r\n onMouseLeave={handleMouseLeave}\r\n // onWheel handler removed and replaced with addEventListener above\r\n />\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/custom/image-canvas.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { cn } from \"@ayasofyazilim/ui/lib/utils\";\r\n\r\ntype Props = {\r\n imageUrl: string;\r\n zoom?: number;\r\n classNames?: {\r\n container?: string;\r\n canvas?: string;\r\n };\r\n minZoom?: number;\r\n maxZoom?: number;\r\n onZoomChange?: (zoom: number) => void;\r\n};\r\n\r\nexport default function ImageCanvas({\r\n imageUrl,\r\n zoom = 1,\r\n classNames,\r\n onZoomChange,\r\n minZoom = 0.1,\r\n maxZoom = 5,\r\n}: Props) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const [image, setImage] = useState<HTMLImageElement | null>(null);\r\n const [currentZoom, setCurrentZoom] = useState(zoom);\r\n const [position, setPosition] = useState({ x: 0, y: 0 });\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const renderError = useCallback((errorMessage: string) => {\r\n if (!canvasRef.current) return;\r\n\r\n const canvas = canvasRef.current;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n // Clear canvas\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Set styling for the error message\r\n ctx.fillStyle = \"rgba(220, 53, 69, 0.1)\"; // Light red background\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n ctx.font = \"16px Arial\";\r\n ctx.fillStyle = \"#dc3545\"; // Bootstrap danger color\r\n ctx.textAlign = \"center\";\r\n ctx.textBaseline = \"middle\";\r\n\r\n // Split message by newlines and render each line\r\n const lines = errorMessage.split(\"\\n\");\r\n const lineHeight = 20;\r\n const startY = canvas.height / 2 - (lines.length * lineHeight) / 2;\r\n\r\n lines.forEach((line, index) => {\r\n ctx.fillText(line, canvas.width / 2, startY + index * lineHeight);\r\n });\r\n }, []);\r\n\r\n // Memoized rendering function\r\n const renderCanvas = useCallback(() => {\r\n if (!canvasRef.current) return;\r\n if (!image) {\r\n if (error) {\r\n renderError(error);\r\n }\r\n return;\r\n }\r\n const canvas = canvasRef.current;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n // Set canvas dimensions to match container\r\n canvas.width = canvas.clientWidth;\r\n canvas.height = canvas.clientHeight;\r\n\r\n // Clear the canvas\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Calculate the center of the canvas\r\n const centerX = canvas.width / 2;\r\n const centerY = canvas.height / 2;\r\n\r\n // Calculate the scaled dimensions\r\n const scaledWidth = image.width * currentZoom;\r\n const scaledHeight = image.height * currentZoom;\r\n\r\n // Calculate position to center the image\r\n const x = centerX - scaledWidth / 2 + position.x;\r\n const y = centerY - scaledHeight / 2 + position.y;\r\n\r\n // Draw the image with the current zoom and position\r\n ctx.drawImage(image, x, y, scaledWidth, scaledHeight);\r\n }, [image, currentZoom, position]); // Load the image - optimized to properly clean up\r\n useEffect(() => {\r\n const img = new Image();\r\n\r\n const onLoad = () => {\r\n setImage(img);\r\n // We need to wait for the next render cycle after setImage before rendering the canvas\r\n // This ensures the image state is updated before trying to render\r\n setTimeout(() => renderCanvas(), 0);\r\n };\r\n\r\n const onError = (e: ErrorEvent) => {\r\n const errorMsg = e.message || \"Failed to load image\";\r\n setError(`Failed to load image: ${errorMsg}`);\r\n setImage(null);\r\n setTimeout(() => renderCanvas(), 0);\r\n };\r\n\r\n img.addEventListener(\"load\", onLoad);\r\n img.addEventListener(\"error\", onError);\r\n\r\n try {\r\n img.src = imageUrl;\r\n img.crossOrigin = \"anonymous\"; // Handle CORS if needed\r\n img.className = \"border rounded-md\";\r\n } catch (err) {\r\n const errorMsg = err instanceof Error ? err.message : \"Invalid image URL\";\r\n setError(`Image error: ${errorMsg}`);\r\n }\r\n return () => {\r\n img.removeEventListener(\"load\", onLoad);\r\n img.removeEventListener(\"error\", onError);\r\n img.src = \"\"; // Clean up to avoid memory leaks\r\n };\r\n }, [imageUrl]);\r\n\r\n // Ensure the canvas is drawn whenever image, zoom, or position changes\r\n useEffect(() => {\r\n if (image) {\r\n renderCanvas();\r\n }\r\n }, [image, currentZoom, position, renderCanvas]);\r\n\r\n // Handle window resize with requestAnimationFrame for better performance\r\n useEffect(() => {\r\n let frameId: number;\r\n let isResizing = false;\r\n\r\n const handleResize = () => {\r\n if (!isResizing) {\r\n isResizing = true;\r\n\r\n frameId = requestAnimationFrame(() => {\r\n renderCanvas();\r\n isResizing = false;\r\n });\r\n }\r\n };\r\n\r\n window.addEventListener(\"resize\", handleResize);\r\n\r\n return () => {\r\n window.removeEventListener(\"resize\", handleResize);\r\n cancelAnimationFrame(frameId);\r\n };\r\n }, [renderCanvas]);\r\n\r\n // Handle zoom changes from props\r\n useEffect(() => {\r\n if (zoom !== undefined) {\r\n // Set the zoom level\r\n if (zoom >= minZoom && zoom <= maxZoom && zoom !== currentZoom) {\r\n setCurrentZoom(zoom);\r\n if (onZoomChange) {\r\n onZoomChange(zoom);\r\n }\r\n }\r\n }\r\n }, [zoom, minZoom, maxZoom, currentZoom, onZoomChange]);\r\n\r\n // Mouse event handlers for dragging - memoized with useCallback\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent<HTMLCanvasElement>) => {\r\n e.preventDefault();\r\n setIsDragging(true);\r\n setDragStart({ x: e.clientX - position.x, y: e.clientY - position.y });\r\n },\r\n [position],\r\n );\r\n\r\n const handleMouseMove = useCallback(\r\n (e: React.MouseEvent<HTMLCanvasElement>) => {\r\n if (!isDragging) return;\r\n\r\n e.preventDefault();\r\n setPosition({\r\n x: e.clientX - dragStart.x,\r\n y: e.clientY - dragStart.y,\r\n });\r\n },\r\n [isDragging, dragStart],\r\n );\r\n\r\n const handleMouseUp = useCallback(() => {\r\n setIsDragging(false);\r\n }, []);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n setIsDragging(false);\r\n }, []);\r\n const handleWheel = useCallback(\r\n (e: WheelEvent) => {\r\n e.preventDefault();\r\n\r\n // Calculate new zoom level\r\n const zoomFactor = 0.1;\r\n let newZoom = currentZoom;\r\n\r\n if (e.deltaY < 0) {\r\n // Zoom in\r\n newZoom = Math.min(currentZoom + zoomFactor, maxZoom);\r\n } else {\r\n // Zoom out\r\n newZoom = Math.max(currentZoom - zoomFactor, minZoom);\r\n }\r\n\r\n if (newZoom !== currentZoom) {\r\n setCurrentZoom(newZoom);\r\n if (onZoomChange) {\r\n onZoomChange(newZoom);\r\n }\r\n }\r\n },\r\n [currentZoom, minZoom, maxZoom, onZoomChange],\r\n ); // Add non-passive wheel event listener\r\n useEffect(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return undefined;\r\n\r\n canvas.addEventListener(\"wheel\", handleWheel, { passive: false });\r\n\r\n return () => {\r\n canvas.removeEventListener(\"wheel\", handleWheel);\r\n };\r\n }, [handleWheel]);\r\n\r\n return (\r\n <div className={cn(`relative w-full h-full`, classNames?.container)}>\r\n <canvas\r\n ref={canvasRef}\r\n className={cn(\r\n \"w-full h-full cursor-grab\",\r\n isDragging ? \"cursor-grabbing\" : \"\",\r\n classNames?.canvas,\r\n )}\r\n onMouseDown={handleMouseDown}\r\n onMouseMove={handleMouseMove}\r\n onMouseUp={handleMouseUp}\r\n onMouseLeave={handleMouseLeave}\r\n // onWheel handler removed and replaced with addEventListener above\r\n />\r\n </div>\r\n );\r\n}\r\n"],"mappings":";AAoPM;AAlPN,SAAgB,aAAa,WAAW,QAAQ,gBAAgB;AAChE,SAAS,UAAU;AAcJ,SAAR,YAA6B;AAAA,EAClC;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AACZ,GAAU;AACR,QAAM,YAAY,OAA0B,IAAI;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkC,IAAI;AAChE,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,IAAI;AACnD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACvD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACzD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,QAAM,cAAc,YAAY,CAAC,iBAAyB;AACxD,QAAI,CAAC,UAAU,QAAS;AAExB,UAAM,SAAS,UAAU;AACzB,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK;AAGV,QAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAG/C,QAAI,YAAY;AAChB,QAAI,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAE9C,QAAI,OAAO;AACX,QAAI,YAAY;AAChB,QAAI,YAAY;AAChB,QAAI,eAAe;AAGnB,UAAM,QAAQ,aAAa,MAAM,IAAI;AACrC,UAAM,aAAa;AACnB,UAAM,SAAS,OAAO,SAAS,IAAK,MAAM,SAAS,aAAc;AAEjE,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,UAAI,SAAS,MAAM,OAAO,QAAQ,GAAG,SAAS,QAAQ,UAAU;AAAA,IAClE,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAGL,QAAM,eAAe,YAAY,MAAM;AACrC,QAAI,CAAC,UAAU,QAAS;AACxB,QAAI,CAAC,OAAO;AACV,UAAI,OAAO;AACT,oBAAY,KAAK;AAAA,MACnB;AACA;AAAA,IACF;AACA,UAAM,SAAS,UAAU;AACzB,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK;AAGV,WAAO,QAAQ,OAAO;AACtB,WAAO,SAAS,OAAO;AAGvB,QAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAG/C,UAAM,UAAU,OAAO,QAAQ;AAC/B,UAAM,UAAU,OAAO,SAAS;AAGhC,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,eAAe,MAAM,SAAS;AAGpC,UAAM,IAAI,UAAU,cAAc,IAAI,SAAS;AAC/C,UAAM,IAAI,UAAU,eAAe,IAAI,SAAS;AAGhD,QAAI,UAAU,OAAO,GAAG,GAAG,aAAa,YAAY;AAAA,EACtD,GAAG,CAAC,OAAO,aAAa,QAAQ,CAAC;AACjC,YAAU,MAAM;AACd,UAAM,MAAM,IAAI,MAAM;AAEtB,UAAM,SAAS,MAAM;AACnB,eAAS,GAAG;AAGZ,iBAAW,MAAM,aAAa,GAAG,CAAC;AAAA,IACpC;AAEA,UAAM,UAAU,CAAC,MAAkB;AACjC,YAAM,WAAW,EAAE,WAAW;AAC9B,eAAS,yBAAyB,QAAQ,EAAE;AAC5C,eAAS,IAAI;AACb,iBAAW,MAAM,aAAa,GAAG,CAAC;AAAA,IACpC;AAEA,QAAI,iBAAiB,QAAQ,MAAM;AACnC,QAAI,iBAAiB,SAAS,OAAO;AAErC,QAAI;AACF,UAAI,MAAM;AACV,UAAI,cAAc;AAClB,UAAI,YAAY;AAAA,IAClB,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,IAAI,UAAU;AACtD,eAAS,gBAAgB,QAAQ,EAAE;AAAA,IACrC;AACA,WAAO,MAAM;AACX,UAAI,oBAAoB,QAAQ,MAAM;AACtC,UAAI,oBAAoB,SAAS,OAAO;AACxC,UAAI,MAAM;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAGb,YAAU,MAAM;AACd,QAAI,OAAO;AACT,mBAAa;AAAA,IACf;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,UAAU,YAAY,CAAC;AAG/C,YAAU,MAAM;AACd,QAAI;AACJ,QAAI,aAAa;AAEjB,UAAM,eAAe,MAAM;AACzB,UAAI,CAAC,YAAY;AACf,qBAAa;AAEb,kBAAU,sBAAsB,MAAM;AACpC,uBAAa;AACb,uBAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,iBAAiB,UAAU,YAAY;AAE9C,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,YAAY;AACjD,2BAAqB,OAAO;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAGjB,YAAU,MAAM;AACd,QAAI,SAAS,QAAW;AAEtB,UAAI,QAAQ,WAAW,QAAQ,WAAW,SAAS,aAAa;AAC9D,uBAAe,IAAI;AACnB,YAAI,cAAc;AAChB,uBAAa,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,SAAS,aAAa,YAAY,CAAC;AAGtD,QAAM,kBAAkB;AAAA,IACtB,CAAC,MAA2C;AAC1C,QAAE,eAAe;AACjB,oBAAc,IAAI;AAClB,mBAAa,EAAE,GAAG,EAAE,UAAU,SAAS,GAAG,GAAG,EAAE,UAAU,SAAS,EAAE,CAAC;AAAA,IACvE;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,kBAAkB;AAAA,IACtB,CAAC,MAA2C;AAC1C,UAAI,CAAC,WAAY;AAEjB,QAAE,eAAe;AACjB,kBAAY;AAAA,QACV,GAAG,EAAE,UAAU,UAAU;AAAA,QACzB,GAAG,EAAE,UAAU,UAAU;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,IACA,CAAC,YAAY,SAAS;AAAA,EACxB;AAEA,QAAM,gBAAgB,YAAY,MAAM;AACtC,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmB,YAAY,MAAM;AACzC,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,CAAC;AACL,QAAM,cAAc;AAAA,IAClB,CAAC,MAAkB;AACjB,QAAE,eAAe;AAGjB,YAAM,aAAa;AACnB,UAAI,UAAU;AAEd,UAAI,EAAE,SAAS,GAAG;AAEhB,kBAAU,KAAK,IAAI,cAAc,YAAY,OAAO;AAAA,MACtD,OAAO;AAEL,kBAAU,KAAK,IAAI,cAAc,YAAY,OAAO;AAAA,MACtD;AAEA,UAAI,YAAY,aAAa;AAC3B,uBAAe,OAAO;AACtB,YAAI,cAAc;AAChB,uBAAa,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,aAAa,SAAS,SAAS,YAAY;AAAA,EAC9C;AACA,YAAU,MAAM;AACd,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ,QAAO;AAEpB,WAAO,iBAAiB,SAAS,aAAa,EAAE,SAAS,MAAM,CAAC;AAEhE,WAAO,MAAM;AACX,aAAO,oBAAoB,SAAS,WAAW;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,SACE,oBAAC,SAAI,WAAW,GAAG,0BAA0B,YAAY,SAAS,GAChE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA,aAAa,oBAAoB;AAAA,QACjC,YAAY;AAAA,MACd;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,MACX,cAAc;AAAA;AAAA,EAEhB,GACF;AAEJ;","names":[]}
@@ -10,8 +10,8 @@ import {
10
10
  import { getFilterOperators } from "../../utils/filter-fns";
11
11
  import { getColumnName, getTranslations } from "../../utils/translation-utils";
12
12
  import { FilterInput } from "./filter-input";
13
- import { ButtonGroup } from "@repo/ayasofyazilim-ui/components/button-group";
14
- import { Button } from "@repo/ayasofyazilim-ui/components/button";
13
+ import { ButtonGroup } from "@ayasofyazilim/ui/components/button-group";
14
+ import { Button } from "@ayasofyazilim/ui/components/button";
15
15
  import {
16
16
  Trash2,
17
17
  ArrowUpDown,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/custom/master-data-grid/components/filters/client-filter.tsx"],"sourcesContent":["import { Dispatch, SetStateAction, useState } from \"react\";\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"../../../../components/select\";\r\nimport type { ColumnFilter, ColumnMeta, FilterOperator } from \"../../types\";\r\nimport { getFilterOperators } from \"../../utils/filter-fns\";\r\nimport { getColumnName, getTranslations } from \"../../utils/translation-utils\";\r\nimport { FilterInput } from \"./filter-input\";\r\nimport { BaseMultiFilterDialogProps } from \"./multi-filter-dialog\";\r\nimport { ButtonGroup } from \"@repo/ayasofyazilim-ui/components/button-group\";\r\nimport { Button } from \"@repo/ayasofyazilim-ui/components/button\";\r\nimport {\r\n Trash2,\r\n ArrowUpDown,\r\n CalendarCheck,\r\n CalendarX,\r\n ChevronLeft,\r\n ChevronRight,\r\n Circle,\r\n CircleOff,\r\n Equal,\r\n List,\r\n ListX,\r\n X as NotEqual,\r\n SearchCode,\r\n SearchX,\r\n TextCursor,\r\n TextCursorInput,\r\n} from \"lucide-react\";\r\n\r\ninterface FilterRow {\r\n id: string;\r\n columnId: string;\r\n operator: FilterOperator;\r\n value: string;\r\n value2?: string;\r\n}\r\ninterface ClientFilterContentProps<TData>\r\n extends BaseMultiFilterDialogProps<TData> {\r\n setOpen: Dispatch<SetStateAction<boolean>>;\r\n}\r\n\r\nfunction getOperatorIcon(operator: FilterOperator) {\r\n const icons: Record<FilterOperator, React.ReactNode> = {\r\n equals: <Equal className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n notEquals: <NotEqual className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n contains: <SearchCode className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n notContains: <SearchX className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n startsWith: <TextCursorInput className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n endsWith: <TextCursor className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n isEmpty: <Circle className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n isNotEmpty: <CircleOff className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n greaterThan: <ChevronRight className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n greaterThanOrEqual: <ChevronRight className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n lessThan: <ChevronLeft className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n lessThanOrEqual: <ChevronLeft className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n between: <ArrowUpDown className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n inRange: <ArrowUpDown className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n before: <CalendarX className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n after: <CalendarCheck className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n inList: <List className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n notInList: <ListX className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n };\r\n return icons[operator] || <SearchCode className=\"h-3.5 w-3.5 min-w-3.5\" />;\r\n}\r\n\r\nexport function ClientFilterContent<TData>({\r\n table,\r\n config,\r\n setOpen,\r\n}: ClientFilterContentProps<TData>) {\r\n const { t } = config;\r\n const currentFilters = table.getState().columnFilters;\r\n const [filterRows, setFilterRows] = useState<FilterRow[]>(() => {\r\n if (currentFilters.length > 0) {\r\n return currentFilters.map((tableFilter, index) => {\r\n // TanStack Table stores the entire ColumnFilter object in the value property\r\n const filterValue = tableFilter.value as ColumnFilter;\r\n\r\n // Handle different value types\r\n let parsedValue = \"\";\r\n let parsedValue2 = \"\";\r\n\r\n if (filterValue?.value !== null && filterValue?.value !== undefined) {\r\n parsedValue =\r\n typeof filterValue.value === \"object\"\r\n ? JSON.stringify(filterValue.value)\r\n : String(filterValue.value);\r\n }\r\n\r\n if (filterValue?.value2 !== null && filterValue?.value2 !== undefined) {\r\n parsedValue2 =\r\n typeof filterValue.value2 === \"object\"\r\n ? JSON.stringify(filterValue.value2)\r\n : String(filterValue.value2);\r\n }\r\n\r\n return {\r\n id: `filter-${index}`,\r\n columnId: tableFilter.id,\r\n operator: filterValue?.operator || \"contains\",\r\n value: parsedValue,\r\n value2: parsedValue2,\r\n };\r\n });\r\n }\r\n return [\r\n {\r\n id: \"filter-0\",\r\n columnId: \"\",\r\n operator: \"contains\",\r\n value: \"\",\r\n value2: \"\",\r\n },\r\n ];\r\n });\r\n const filterableColumns = table\r\n .getAllColumns()\r\n .filter((col) => col.getCanFilter());\r\n\r\n const addFilter = () => {\r\n const newId = `filter-${Date.now()}`;\r\n setFilterRows([\r\n ...filterRows,\r\n { id: newId, columnId: \"\", operator: \"contains\", value: \"\", value2: \"\" },\r\n ]);\r\n };\r\n\r\n const removeFilter = (id: string) => {\r\n if (filterRows.length === 1) {\r\n setFilterRows([\r\n {\r\n id: \"filter-0\",\r\n columnId: \"\",\r\n operator: \"contains\",\r\n value: \"\",\r\n value2: \"\",\r\n },\r\n ]);\r\n } else {\r\n setFilterRows(filterRows.filter((row) => row.id !== id));\r\n }\r\n };\r\n\r\n const updateFilter = (id: string, updates: Partial<FilterRow>) => {\r\n setFilterRows(\r\n filterRows.map((row) => (row.id === id ? { ...row, ...updates } : row))\r\n );\r\n };\r\n\r\n const getAvailableOperators = (columnId: string): FilterOperator[] => {\r\n if (!columnId) return [\"contains\"];\r\n const column = table.getColumn(columnId);\r\n if (!column) return [\"contains\"];\r\n\r\n const meta = column.columnDef.meta as ColumnMeta | undefined;\r\n const schemaProperty = meta?.schemaProperty;\r\n const filterOperators = meta?.filterOperators;\r\n\r\n return (\r\n filterOperators ||\r\n (schemaProperty\r\n ? getFilterOperators(schemaProperty.type, schemaProperty.format)\r\n : [\"contains\"])\r\n );\r\n };\r\n\r\n const getColumnMeta = (columnId: string): ColumnMeta | undefined => {\r\n if (!columnId) return undefined;\r\n const column = table.getColumn(columnId);\r\n if (!column) return undefined;\r\n return column.columnDef.meta as ColumnMeta | undefined;\r\n };\r\n\r\n const handleColumnChange = (filterId: string, columnId: string) => {\r\n const operators = getAvailableOperators(columnId);\r\n updateFilter(filterId, { columnId, operator: operators[0] || \"contains\" });\r\n };\r\n\r\n const applyFilters = (closePopover?: () => void) => {\r\n table.resetColumnFilters();\r\n filterRows.forEach((row) => {\r\n const isRange = row.operator === \"between\" || row.operator === \"inRange\";\r\n const needsNoInput =\r\n row.operator === \"isEmpty\" || row.operator === \"isNotEmpty\";\r\n\r\n if (row.columnId) {\r\n const column = table.getColumn(row.columnId);\r\n if (column) {\r\n if (needsNoInput) {\r\n const filter: ColumnFilter = {\r\n id: row.columnId,\r\n operator: row.operator,\r\n value: \"\",\r\n };\r\n column.setFilterValue(filter);\r\n } else if (isRange && row.value && row.value2) {\r\n const filter: ColumnFilter = {\r\n id: row.columnId,\r\n operator: row.operator,\r\n value: row.value,\r\n value2: row.value2,\r\n };\r\n column.setFilterValue(filter);\r\n } else if (!isRange && row.value) {\r\n const filter: ColumnFilter = {\r\n id: row.columnId,\r\n operator: row.operator,\r\n value: row.value,\r\n };\r\n column.setFilterValue(filter);\r\n }\r\n }\r\n }\r\n });\r\n\r\n closePopover?.();\r\n setOpen(false);\r\n };\r\n\r\n const resetFilters = () => {\r\n table.resetColumnFilters();\r\n setFilterRows([\r\n {\r\n id: \"filter-0\",\r\n columnId: \"\",\r\n operator: \"contains\",\r\n value: \"\",\r\n value2: \"\",\r\n },\r\n ]);\r\n setOpen(false);\r\n };\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"font-semibold text-sm sm:hidden\">\r\n {getTranslations(\"filter.title\", t)}\r\n </div>\r\n <div className=\"space-y-2 max-h-[60vh] overflow-y-auto\">\r\n {filterRows.map((row, index) => {\r\n const availableOps = getAvailableOperators(row.columnId);\r\n const columnMeta = getColumnMeta(row.columnId);\r\n\r\n return (\r\n <ButtonGroup\r\n className=\"w-full min-w-0 flex-wrap sm:flex-nowrap\"\r\n key={row.id}\r\n >\r\n {index === 0 ? (\r\n <div className=\"w-12 sm:w-16 rounded-l-md border flex items-center justify-center px-1 sm:px-2 text-xs font-medium text-muted-foreground shrink-0\">\r\n {getTranslations(\"filter.where\", t)}\r\n </div>\r\n ) : (\r\n <div className=\"w-12 sm:w-16 rounded-l-md border flex items-center justify-center px-1 sm:px-2 text-xs font-medium text-muted-foreground shrink-0\">\r\n {getTranslations(\"filter.and\", t)}\r\n </div>\r\n )}\r\n <Select\r\n value={row.columnId}\r\n onValueChange={(value) => handleColumnChange(row.id, value)}\r\n >\r\n <SelectTrigger className=\"w-32 sm:w-40 min-w-0\">\r\n <SelectValue\r\n placeholder={getTranslations(\"filter.selectColumn\", t)}\r\n />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {filterableColumns.map((col) => (\r\n <SelectItem key={col.id} value={col.id}>\r\n {getColumnName(col, t)}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <Select\r\n value={row.operator}\r\n onValueChange={(value) =>\r\n updateFilter(row.id, { operator: value as FilterOperator })\r\n }\r\n disabled={!row.columnId}\r\n >\r\n <SelectTrigger className=\"w-16 sm:w-40 min-w-0\">\r\n <span className=\"flex items-center gap-2\">\r\n <span className=\"sm:hidden\">\r\n {getOperatorIcon(row.operator)}\r\n </span>\r\n <span className=\"hidden sm:inline\">\r\n {getTranslations(`filter.operator.${row.operator}`, t)}\r\n </span>\r\n </span>\r\n </SelectTrigger>\r\n <SelectContent>\r\n {availableOps.map((op) => (\r\n <SelectItem key={op} value={op}>\r\n <span className=\"flex items-center gap-2\">\r\n {getOperatorIcon(op)}\r\n <span>\r\n {getTranslations(`filter.operator.${op}`, t)}\r\n </span>\r\n </span>\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <FilterInput\r\n operator={row.operator}\r\n value={row.value}\r\n value2={row.value2}\r\n columnMeta={columnMeta}\r\n onValueChange={(value) => updateFilter(row.id, { value })}\r\n onValue2Change={(value2) => updateFilter(row.id, { value2 })}\r\n onSliderChange={(values) => {\r\n const [min, max] = values;\r\n updateFilter(row.id, {\r\n value: String(min),\r\n value2: String(max),\r\n });\r\n }}\r\n onClear={() => updateFilter(row.id, { value: \"\", value2: \"\" })}\r\n t={t}\r\n variant=\"popover\"\r\n />\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => removeFilter(row.id)}\r\n className=\"shrink-0\"\r\n >\r\n <Trash2 className=\"h-3.5 w-3.5 sm:h-4 sm:w-4\" />\r\n </Button>\r\n </ButtonGroup>\r\n );\r\n })}\r\n </div>\r\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center justify-between gap-2 pt-4 border-t\">\r\n <div className=\"flex flex-col sm:flex-row gap-2\">\r\n <Button\r\n onClick={addFilter}\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"text-xs sm:text-sm\"\r\n >\r\n {getTranslations(\"filter.addFilter\", t)}\r\n </Button>\r\n <Button\r\n onClick={resetFilters}\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"text-xs sm:text-sm\"\r\n >\r\n {getTranslations(\"filter.resetFilters\", t)}\r\n </Button>\r\n </div>\r\n <Button\r\n onClick={() => applyFilters()}\r\n size=\"sm\"\r\n className=\"text-xs sm:text-sm\"\r\n >\r\n {getTranslations(\"filter.apply\", t)}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/custom/master-data-grid/components/filters/client-filter.tsx"],"sourcesContent":["import { Dispatch, SetStateAction, useState } from \"react\";\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"../../../../components/select\";\r\nimport type { ColumnFilter, ColumnMeta, FilterOperator } from \"../../types\";\r\nimport { getFilterOperators } from \"../../utils/filter-fns\";\r\nimport { getColumnName, getTranslations } from \"../../utils/translation-utils\";\r\nimport { FilterInput } from \"./filter-input\";\r\nimport { BaseMultiFilterDialogProps } from \"./multi-filter-dialog\";\r\nimport { ButtonGroup } from \"@ayasofyazilim/ui/components/button-group\";\r\nimport { Button } from \"@ayasofyazilim/ui/components/button\";\r\nimport {\r\n Trash2,\r\n ArrowUpDown,\r\n CalendarCheck,\r\n CalendarX,\r\n ChevronLeft,\r\n ChevronRight,\r\n Circle,\r\n CircleOff,\r\n Equal,\r\n List,\r\n ListX,\r\n X as NotEqual,\r\n SearchCode,\r\n SearchX,\r\n TextCursor,\r\n TextCursorInput,\r\n} from \"lucide-react\";\r\n\r\ninterface FilterRow {\r\n id: string;\r\n columnId: string;\r\n operator: FilterOperator;\r\n value: string;\r\n value2?: string;\r\n}\r\ninterface ClientFilterContentProps<\r\n TData,\r\n> extends BaseMultiFilterDialogProps<TData> {\r\n setOpen: Dispatch<SetStateAction<boolean>>;\r\n}\r\n\r\nfunction getOperatorIcon(operator: FilterOperator) {\r\n const icons: Record<FilterOperator, React.ReactNode> = {\r\n equals: <Equal className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n notEquals: <NotEqual className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n contains: <SearchCode className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n notContains: <SearchX className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n startsWith: <TextCursorInput className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n endsWith: <TextCursor className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n isEmpty: <Circle className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n isNotEmpty: <CircleOff className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n greaterThan: <ChevronRight className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n greaterThanOrEqual: <ChevronRight className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n lessThan: <ChevronLeft className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n lessThanOrEqual: <ChevronLeft className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n between: <ArrowUpDown className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n inRange: <ArrowUpDown className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n before: <CalendarX className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n after: <CalendarCheck className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n inList: <List className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n notInList: <ListX className=\"h-3.5 w-3.5 min-w-3.5\" />,\r\n };\r\n return icons[operator] || <SearchCode className=\"h-3.5 w-3.5 min-w-3.5\" />;\r\n}\r\n\r\nexport function ClientFilterContent<TData>({\r\n table,\r\n config,\r\n setOpen,\r\n}: ClientFilterContentProps<TData>) {\r\n const { t } = config;\r\n const currentFilters = table.getState().columnFilters;\r\n const [filterRows, setFilterRows] = useState<FilterRow[]>(() => {\r\n if (currentFilters.length > 0) {\r\n return currentFilters.map((tableFilter, index) => {\r\n // TanStack Table stores the entire ColumnFilter object in the value property\r\n const filterValue = tableFilter.value as ColumnFilter;\r\n\r\n // Handle different value types\r\n let parsedValue = \"\";\r\n let parsedValue2 = \"\";\r\n\r\n if (filterValue?.value !== null && filterValue?.value !== undefined) {\r\n parsedValue =\r\n typeof filterValue.value === \"object\"\r\n ? JSON.stringify(filterValue.value)\r\n : String(filterValue.value);\r\n }\r\n\r\n if (filterValue?.value2 !== null && filterValue?.value2 !== undefined) {\r\n parsedValue2 =\r\n typeof filterValue.value2 === \"object\"\r\n ? JSON.stringify(filterValue.value2)\r\n : String(filterValue.value2);\r\n }\r\n\r\n return {\r\n id: `filter-${index}`,\r\n columnId: tableFilter.id,\r\n operator: filterValue?.operator || \"contains\",\r\n value: parsedValue,\r\n value2: parsedValue2,\r\n };\r\n });\r\n }\r\n return [\r\n {\r\n id: \"filter-0\",\r\n columnId: \"\",\r\n operator: \"contains\",\r\n value: \"\",\r\n value2: \"\",\r\n },\r\n ];\r\n });\r\n const filterableColumns = table\r\n .getAllColumns()\r\n .filter((col) => col.getCanFilter());\r\n\r\n const addFilter = () => {\r\n const newId = `filter-${Date.now()}`;\r\n setFilterRows([\r\n ...filterRows,\r\n { id: newId, columnId: \"\", operator: \"contains\", value: \"\", value2: \"\" },\r\n ]);\r\n };\r\n\r\n const removeFilter = (id: string) => {\r\n if (filterRows.length === 1) {\r\n setFilterRows([\r\n {\r\n id: \"filter-0\",\r\n columnId: \"\",\r\n operator: \"contains\",\r\n value: \"\",\r\n value2: \"\",\r\n },\r\n ]);\r\n } else {\r\n setFilterRows(filterRows.filter((row) => row.id !== id));\r\n }\r\n };\r\n\r\n const updateFilter = (id: string, updates: Partial<FilterRow>) => {\r\n setFilterRows(\r\n filterRows.map((row) => (row.id === id ? { ...row, ...updates } : row)),\r\n );\r\n };\r\n\r\n const getAvailableOperators = (columnId: string): FilterOperator[] => {\r\n if (!columnId) return [\"contains\"];\r\n const column = table.getColumn(columnId);\r\n if (!column) return [\"contains\"];\r\n\r\n const meta = column.columnDef.meta as ColumnMeta | undefined;\r\n const schemaProperty = meta?.schemaProperty;\r\n const filterOperators = meta?.filterOperators;\r\n\r\n return (\r\n filterOperators ||\r\n (schemaProperty\r\n ? getFilterOperators(schemaProperty.type, schemaProperty.format)\r\n : [\"contains\"])\r\n );\r\n };\r\n\r\n const getColumnMeta = (columnId: string): ColumnMeta | undefined => {\r\n if (!columnId) return undefined;\r\n const column = table.getColumn(columnId);\r\n if (!column) return undefined;\r\n return column.columnDef.meta as ColumnMeta | undefined;\r\n };\r\n\r\n const handleColumnChange = (filterId: string, columnId: string) => {\r\n const operators = getAvailableOperators(columnId);\r\n updateFilter(filterId, { columnId, operator: operators[0] || \"contains\" });\r\n };\r\n\r\n const applyFilters = (closePopover?: () => void) => {\r\n table.resetColumnFilters();\r\n filterRows.forEach((row) => {\r\n const isRange = row.operator === \"between\" || row.operator === \"inRange\";\r\n const needsNoInput =\r\n row.operator === \"isEmpty\" || row.operator === \"isNotEmpty\";\r\n\r\n if (row.columnId) {\r\n const column = table.getColumn(row.columnId);\r\n if (column) {\r\n if (needsNoInput) {\r\n const filter: ColumnFilter = {\r\n id: row.columnId,\r\n operator: row.operator,\r\n value: \"\",\r\n };\r\n column.setFilterValue(filter);\r\n } else if (isRange && row.value && row.value2) {\r\n const filter: ColumnFilter = {\r\n id: row.columnId,\r\n operator: row.operator,\r\n value: row.value,\r\n value2: row.value2,\r\n };\r\n column.setFilterValue(filter);\r\n } else if (!isRange && row.value) {\r\n const filter: ColumnFilter = {\r\n id: row.columnId,\r\n operator: row.operator,\r\n value: row.value,\r\n };\r\n column.setFilterValue(filter);\r\n }\r\n }\r\n }\r\n });\r\n\r\n closePopover?.();\r\n setOpen(false);\r\n };\r\n\r\n const resetFilters = () => {\r\n table.resetColumnFilters();\r\n setFilterRows([\r\n {\r\n id: \"filter-0\",\r\n columnId: \"\",\r\n operator: \"contains\",\r\n value: \"\",\r\n value2: \"\",\r\n },\r\n ]);\r\n setOpen(false);\r\n };\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"font-semibold text-sm sm:hidden\">\r\n {getTranslations(\"filter.title\", t)}\r\n </div>\r\n <div className=\"space-y-2 max-h-[60vh] overflow-y-auto\">\r\n {filterRows.map((row, index) => {\r\n const availableOps = getAvailableOperators(row.columnId);\r\n const columnMeta = getColumnMeta(row.columnId);\r\n\r\n return (\r\n <ButtonGroup\r\n className=\"w-full min-w-0 flex-wrap sm:flex-nowrap\"\r\n key={row.id}\r\n >\r\n {index === 0 ? (\r\n <div className=\"w-12 sm:w-16 rounded-l-md border flex items-center justify-center px-1 sm:px-2 text-xs font-medium text-muted-foreground shrink-0\">\r\n {getTranslations(\"filter.where\", t)}\r\n </div>\r\n ) : (\r\n <div className=\"w-12 sm:w-16 rounded-l-md border flex items-center justify-center px-1 sm:px-2 text-xs font-medium text-muted-foreground shrink-0\">\r\n {getTranslations(\"filter.and\", t)}\r\n </div>\r\n )}\r\n <Select\r\n value={row.columnId}\r\n onValueChange={(value) => handleColumnChange(row.id, value)}\r\n >\r\n <SelectTrigger className=\"w-32 sm:w-40 min-w-0\">\r\n <SelectValue\r\n placeholder={getTranslations(\"filter.selectColumn\", t)}\r\n />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {filterableColumns.map((col) => (\r\n <SelectItem key={col.id} value={col.id}>\r\n {getColumnName(col, t)}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <Select\r\n value={row.operator}\r\n onValueChange={(value) =>\r\n updateFilter(row.id, { operator: value as FilterOperator })\r\n }\r\n disabled={!row.columnId}\r\n >\r\n <SelectTrigger className=\"w-16 sm:w-40 min-w-0\">\r\n <span className=\"flex items-center gap-2\">\r\n <span className=\"sm:hidden\">\r\n {getOperatorIcon(row.operator)}\r\n </span>\r\n <span className=\"hidden sm:inline\">\r\n {getTranslations(`filter.operator.${row.operator}`, t)}\r\n </span>\r\n </span>\r\n </SelectTrigger>\r\n <SelectContent>\r\n {availableOps.map((op) => (\r\n <SelectItem key={op} value={op}>\r\n <span className=\"flex items-center gap-2\">\r\n {getOperatorIcon(op)}\r\n <span>\r\n {getTranslations(`filter.operator.${op}`, t)}\r\n </span>\r\n </span>\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <FilterInput\r\n operator={row.operator}\r\n value={row.value}\r\n value2={row.value2}\r\n columnMeta={columnMeta}\r\n onValueChange={(value) => updateFilter(row.id, { value })}\r\n onValue2Change={(value2) => updateFilter(row.id, { value2 })}\r\n onSliderChange={(values) => {\r\n const [min, max] = values;\r\n updateFilter(row.id, {\r\n value: String(min),\r\n value2: String(max),\r\n });\r\n }}\r\n onClear={() => updateFilter(row.id, { value: \"\", value2: \"\" })}\r\n t={t}\r\n variant=\"popover\"\r\n />\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => removeFilter(row.id)}\r\n className=\"shrink-0\"\r\n >\r\n <Trash2 className=\"h-3.5 w-3.5 sm:h-4 sm:w-4\" />\r\n </Button>\r\n </ButtonGroup>\r\n );\r\n })}\r\n </div>\r\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center justify-between gap-2 pt-4 border-t\">\r\n <div className=\"flex flex-col sm:flex-row gap-2\">\r\n <Button\r\n onClick={addFilter}\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"text-xs sm:text-sm\"\r\n >\r\n {getTranslations(\"filter.addFilter\", t)}\r\n </Button>\r\n <Button\r\n onClick={resetFilters}\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"text-xs sm:text-sm\"\r\n >\r\n {getTranslations(\"filter.resetFilters\", t)}\r\n </Button>\r\n </div>\r\n <Button\r\n onClick={() => applyFilters()}\r\n size=\"sm\"\r\n className=\"text-xs sm:text-sm\"\r\n >\r\n {getTranslations(\"filter.apply\", t)}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
@@ -4,8 +4,8 @@ import {
4
4
  TabsContent,
5
5
  TabsList,
6
6
  TabsTrigger
7
- } from "@repo/ayasofyazilim-ui/components/tabs";
8
- import { useIsMobile } from "@repo/ayasofyazilim-ui/hooks/use-mobile";
7
+ } from "@ayasofyazilim/ui/components/tabs";
8
+ import { useIsMobile } from "@ayasofyazilim/ui/hooks/use-mobile";
9
9
  import { useState } from "react";
10
10
  import {
11
11
  Drawer,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/custom/master-data-grid/components/filters/multi-filter-dialog.tsx"],"sourcesContent":["import {\r\n Tabs,\r\n TabsContent,\r\n TabsList,\r\n TabsTrigger,\r\n} from \"@repo/ayasofyazilim-ui/components/tabs\";\r\nimport type { Table } from \"@tanstack/react-table\";\r\n\r\nimport { useIsMobile } from \"@repo/ayasofyazilim-ui/hooks/use-mobile\";\r\nimport { useState } from \"react\";\r\nimport {\r\n Drawer,\r\n DrawerContent,\r\n DrawerHeader,\r\n DrawerTitle,\r\n DrawerTrigger,\r\n} from \"../../../../components/drawer\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"../../../../components/popover\";\r\nimport type { MasterDataGridConfig } from \"../../types\";\r\nimport { getTranslations } from \"../../utils/translation-utils\";\r\nimport { ClientFilterContent } from \"./client-filter\";\r\nimport { ServerFilterContent } from \"./server-filter\";\r\n\r\nexport interface BaseMultiFilterDialogProps<TData> {\r\n table: Table<TData>;\r\n config: MasterDataGridConfig<TData>;\r\n}\r\ninterface MultiFilterDialogProps<TData>\r\n extends BaseMultiFilterDialogProps<TData> {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function MultiFilterDialog<TData>({\r\n table,\r\n config,\r\n children,\r\n}: MultiFilterDialogProps<TData>) {\r\n const { t } = config;\r\n const isMobile = useIsMobile();\r\n const [open, setOpen] = useState(false);\r\n\r\n const filterContent = (\r\n <Tabs defaultValue=\"client\">\r\n {config.serverFilters && (\r\n <TabsList>\r\n <TabsTrigger value=\"client\">{t?.[\"toolbar.client\"]}</TabsTrigger>\r\n <TabsTrigger value=\"server\">{t?.[\"toolbar.server\"]}</TabsTrigger>\r\n </TabsList>\r\n )}\r\n <TabsContent value=\"client\" className=\"w-full\">\r\n <ClientFilterContent setOpen={setOpen} table={table} config={config} />\r\n </TabsContent>\r\n <TabsContent\r\n value=\"server\"\r\n className=\"w-full min-w-lg max-w-lg [&>fieldset]:p-0\"\r\n >\r\n <ServerFilterContent table={table} config={config} />\r\n </TabsContent>\r\n </Tabs>\r\n );\r\n\r\n if (isMobile) {\r\n return (\r\n <Drawer open={open} onOpenChange={setOpen}>\r\n <DrawerTrigger asChild>{children}</DrawerTrigger>\r\n <DrawerContent>\r\n <DrawerHeader>\r\n <DrawerTitle>{getTranslations(\"filter.title\", t)}</DrawerTitle>\r\n </DrawerHeader>\r\n <div className=\"px-4 pb-4 max-h-[70vh] overflow-y-auto\">\r\n {filterContent}\r\n </div>\r\n </DrawerContent>\r\n </Drawer>\r\n );\r\n }\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>{children}</PopoverTrigger>\r\n <PopoverContent className=\"w-auto max-w-3xl\" align=\"end\">\r\n {filterContent}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n"],"mappings":"AAgDQ,SACE,KADF;AAhDR;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,uBAAuB;AAChC,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AAW7B,SAAS,kBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,EAAE,EAAE,IAAI;AACd,QAAM,WAAW,YAAY;AAC7B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AAEtC,QAAM,gBACJ,qBAAC,QAAK,cAAa,UAChB;AAAA,WAAO,iBACN,qBAAC,YACC;AAAA,0BAAC,eAAY,OAAM,UAAU,cAAI,gBAAgB,GAAE;AAAA,MACnD,oBAAC,eAAY,OAAM,UAAU,cAAI,gBAAgB,GAAE;AAAA,OACrD;AAAA,IAEF,oBAAC,eAAY,OAAM,UAAS,WAAU,UACpC,8BAAC,uBAAoB,SAAkB,OAAc,QAAgB,GACvE;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,WAAU;AAAA,QAEV,8BAAC,uBAAoB,OAAc,QAAgB;AAAA;AAAA,IACrD;AAAA,KACF;AAGF,MAAI,UAAU;AACZ,WACE,qBAAC,UAAO,MAAY,cAAc,SAChC;AAAA,0BAAC,iBAAc,SAAO,MAAE,UAAS;AAAA,MACjC,qBAAC,iBACC;AAAA,4BAAC,gBACC,8BAAC,eAAa,0BAAgB,gBAAgB,CAAC,GAAE,GACnD;AAAA,QACA,oBAAC,SAAI,WAAU,0CACZ,yBACH;AAAA,SACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,WAAQ,MAAY,cAAc,SACjC;AAAA,wBAAC,kBAAe,SAAO,MAAE,UAAS;AAAA,IAClC,oBAAC,kBAAe,WAAU,oBAAmB,OAAM,OAChD,yBACH;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/custom/master-data-grid/components/filters/multi-filter-dialog.tsx"],"sourcesContent":["import {\r\n Tabs,\r\n TabsContent,\r\n TabsList,\r\n TabsTrigger,\r\n} from \"@ayasofyazilim/ui/components/tabs\";\r\nimport type { Table } from \"@tanstack/react-table\";\r\n\r\nimport { useIsMobile } from \"@ayasofyazilim/ui/hooks/use-mobile\";\r\nimport { useState } from \"react\";\r\nimport {\r\n Drawer,\r\n DrawerContent,\r\n DrawerHeader,\r\n DrawerTitle,\r\n DrawerTrigger,\r\n} from \"../../../../components/drawer\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"../../../../components/popover\";\r\nimport type { MasterDataGridConfig } from \"../../types\";\r\nimport { getTranslations } from \"../../utils/translation-utils\";\r\nimport { ClientFilterContent } from \"./client-filter\";\r\nimport { ServerFilterContent } from \"./server-filter\";\r\n\r\nexport interface BaseMultiFilterDialogProps<TData> {\r\n table: Table<TData>;\r\n config: MasterDataGridConfig<TData>;\r\n}\r\ninterface MultiFilterDialogProps<\r\n TData,\r\n> extends BaseMultiFilterDialogProps<TData> {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function MultiFilterDialog<TData>({\r\n table,\r\n config,\r\n children,\r\n}: MultiFilterDialogProps<TData>) {\r\n const { t } = config;\r\n const isMobile = useIsMobile();\r\n const [open, setOpen] = useState(false);\r\n\r\n const filterContent = (\r\n <Tabs defaultValue=\"client\">\r\n {config.serverFilters && (\r\n <TabsList>\r\n <TabsTrigger value=\"client\">{t?.[\"toolbar.client\"]}</TabsTrigger>\r\n <TabsTrigger value=\"server\">{t?.[\"toolbar.server\"]}</TabsTrigger>\r\n </TabsList>\r\n )}\r\n <TabsContent value=\"client\" className=\"w-full\">\r\n <ClientFilterContent setOpen={setOpen} table={table} config={config} />\r\n </TabsContent>\r\n <TabsContent\r\n value=\"server\"\r\n className=\"w-full min-w-lg max-w-lg [&>fieldset]:p-0\"\r\n >\r\n <ServerFilterContent table={table} config={config} />\r\n </TabsContent>\r\n </Tabs>\r\n );\r\n\r\n if (isMobile) {\r\n return (\r\n <Drawer open={open} onOpenChange={setOpen}>\r\n <DrawerTrigger asChild>{children}</DrawerTrigger>\r\n <DrawerContent>\r\n <DrawerHeader>\r\n <DrawerTitle>{getTranslations(\"filter.title\", t)}</DrawerTitle>\r\n </DrawerHeader>\r\n <div className=\"px-4 pb-4 max-h-[70vh] overflow-y-auto\">\r\n {filterContent}\r\n </div>\r\n </DrawerContent>\r\n </Drawer>\r\n );\r\n }\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>{children}</PopoverTrigger>\r\n <PopoverContent className=\"w-auto max-w-3xl\" align=\"end\">\r\n {filterContent}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n"],"mappings":"AAiDQ,SACE,KADF;AAjDR;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,uBAAuB;AAChC,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AAY7B,SAAS,kBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,EAAE,EAAE,IAAI;AACd,QAAM,WAAW,YAAY;AAC7B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AAEtC,QAAM,gBACJ,qBAAC,QAAK,cAAa,UAChB;AAAA,WAAO,iBACN,qBAAC,YACC;AAAA,0BAAC,eAAY,OAAM,UAAU,cAAI,gBAAgB,GAAE;AAAA,MACnD,oBAAC,eAAY,OAAM,UAAU,cAAI,gBAAgB,GAAE;AAAA,OACrD;AAAA,IAEF,oBAAC,eAAY,OAAM,UAAS,WAAU,UACpC,8BAAC,uBAAoB,SAAkB,OAAc,QAAgB,GACvE;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,WAAU;AAAA,QAEV,8BAAC,uBAAoB,OAAc,QAAgB;AAAA;AAAA,IACrD;AAAA,KACF;AAGF,MAAI,UAAU;AACZ,WACE,qBAAC,UAAO,MAAY,cAAc,SAChC;AAAA,0BAAC,iBAAc,SAAO,MAAE,UAAS;AAAA,MACjC,qBAAC,iBACC;AAAA,4BAAC,gBACC,8BAAC,eAAa,0BAAgB,gBAAgB,CAAC,GAAE,GACnD;AAAA,QACA,oBAAC,SAAI,WAAU,0CACZ,yBACH;AAAA,SACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,WAAQ,MAAY,cAAc,SACjC;AAAA,wBAAC,kBAAe,SAAO,MAAE,UAAS;AAAA,IAClC,oBAAC,kBAAe,WAAU,oBAAmB,OAAM,OAChD,yBACH;AAAA,KACF;AAEJ;","names":[]}
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { Button } from "@repo/ayasofyazilim-ui/components/button";
3
+ import { Button } from "@ayasofyazilim/ui/components/button";
4
4
  import {
5
5
  Field,
6
6
  FieldError,
7
7
  FieldGroup,
8
8
  FieldLabel,
9
9
  FieldSet
10
- } from "@repo/ayasofyazilim-ui/components/field";
11
- import { Selectable } from "@repo/ayasofyazilim-ui/custom/selectable";
10
+ } from "@ayasofyazilim/ui/components/field";
11
+ import { Selectable } from "@ayasofyazilim/ui/custom/selectable";
12
12
  import { Loader2, RotateCcw, Search, XCircle } from "lucide-react";
13
13
  import { usePathname, useRouter, useSearchParams } from "next/navigation";
14
14
  import { useCallback, useState, useTransition } from "react";
@@ -17,11 +17,11 @@ import {
17
17
  InputGroupAddon,
18
18
  InputGroupButton,
19
19
  InputGroupInput
20
- } from "@repo/ayasofyazilim-ui/components/input-group";
20
+ } from "@ayasofyazilim/ui/components/input-group";
21
21
  import {
22
22
  ScrollArea,
23
23
  ScrollBar
24
- } from "@repo/ayasofyazilim-ui/components/scroll-area";
24
+ } from "@ayasofyazilim/ui/components/scroll-area";
25
25
  import { getTranslations } from "../../utils";
26
26
  function ServerFilterContent({
27
27
  config
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/custom/master-data-grid/components/filters/server-filter.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { Button } from \"@repo/ayasofyazilim-ui/components/button\";\r\nimport {\r\n Field,\r\n FieldError,\r\n FieldGroup,\r\n FieldLabel,\r\n FieldSet,\r\n} from \"@repo/ayasofyazilim-ui/components/field\";\r\nimport { Selectable } from \"@repo/ayasofyazilim-ui/custom/selectable\";\r\nimport { Loader2, RotateCcw, Search, XCircle } from \"lucide-react\";\r\nimport { usePathname, useRouter, useSearchParams } from \"next/navigation\";\r\nimport { useCallback, useState, useTransition } from \"react\";\r\nimport { ServerFilterConfig } from \"../../types\";\r\nimport { BaseMultiFilterDialogProps } from \"./multi-filter-dialog\";\r\nimport {\r\n InputGroup,\r\n InputGroupAddon,\r\n InputGroupButton,\r\n InputGroupInput,\r\n} from \"@repo/ayasofyazilim-ui/components/input-group\";\r\nimport {\r\n ScrollArea,\r\n ScrollBar,\r\n} from \"@repo/ayasofyazilim-ui/components/scroll-area\";\r\nimport { getTranslations } from \"../../utils\";\r\n\r\ntype FilterValue =\r\n | string\r\n | number\r\n | boolean\r\n | Array<string | boolean>\r\n | undefined;\r\n\r\nexport function ServerFilterContent<TData>({\r\n config,\r\n}: BaseMultiFilterDialogProps<TData>) {\r\n const router = useRouter();\r\n const pathname = usePathname();\r\n const searchParams = useSearchParams();\r\n const [isPending, startTransition] = useTransition();\r\n\r\n const { serverFilters } = config;\r\n if (!serverFilters) return null;\r\n\r\n const [resetCount, setResetCount] = useState(0);\r\n\r\n const [localValues, setLocalValues] = useState<Record<string, FilterValue>>(\r\n () => {\r\n const initial: Record<string, FilterValue> = {};\r\n serverFilters.forEach((filter) => {\r\n const val = searchParams.get(filter.key);\r\n if (filter.type === \"array\") {\r\n initial[filter.key] = searchParams.getAll(filter.key);\r\n } else if (filter.type === \"boolean\") {\r\n initial[filter.key] =\r\n val === \"true\" ? true : val === \"false\" ? false : undefined;\r\n } else if (filter.type === \"number\") {\r\n initial[filter.key] = val ? Number(val) : undefined;\r\n } else {\r\n initial[filter.key] = val || undefined;\r\n }\r\n });\r\n return initial;\r\n }\r\n );\r\n\r\n const [errors, setErrors] = useState<Record<string, string>>({});\r\n\r\n const onValueChange = useCallback(\r\n (filter: ServerFilterConfig, rawValue: FilterValue) => {\r\n let processedValue: FilterValue = rawValue;\r\n if (\r\n rawValue === \"\" ||\r\n (Array.isArray(rawValue) && rawValue.length === 0)\r\n ) {\r\n processedValue = undefined;\r\n }\r\n\r\n if (filter.validator) {\r\n const result = filter.validator.safeParse(processedValue);\r\n setErrors((prev) => ({\r\n ...prev,\r\n [filter.key]: result.success\r\n ? \"\"\r\n : result.error.issues[0]?.message || \"Hata\",\r\n }));\r\n }\r\n\r\n setLocalValues((prev) => ({ ...prev, [filter.key]: processedValue }));\r\n },\r\n []\r\n );\r\n\r\n const handleApply = () => {\r\n const params = new URLSearchParams(searchParams.toString());\r\n let hasValidationError = false;\r\n\r\n serverFilters.forEach((filter) => {\r\n const val = localValues[filter.key];\r\n params.delete(filter.key);\r\n const isEmpty =\r\n val === undefined ||\r\n val === null ||\r\n val === \"\" ||\r\n (Array.isArray(val) && val.length === 0);\r\n\r\n if (!isEmpty) {\r\n if (filter.validator) {\r\n const result = filter.validator.safeParse(val);\r\n if (!result.success) {\r\n hasValidationError = true;\r\n setErrors((prev) => ({\r\n ...prev,\r\n [filter.key]: result.error.issues[0]?.message || \"Hata\",\r\n }));\r\n return;\r\n }\r\n }\r\n if (Array.isArray(val)) {\r\n val.forEach((v) => params.append(filter.key, String(v)));\r\n } else {\r\n params.set(filter.key, String(val));\r\n }\r\n } else {\r\n setErrors((prev) => ({ ...prev, [filter.key]: \"\" }));\r\n }\r\n });\r\n if (hasValidationError) return;\r\n params.delete(\"page\");\r\n startTransition(() => {\r\n router.push(`${pathname}?${params.toString()}`, { scroll: false });\r\n });\r\n };\r\n\r\n const handleReset = () => {\r\n const initial: Record<string, FilterValue> = {};\r\n serverFilters.forEach((f) => {\r\n initial[f.key] = f.type === \"array\" ? [] : undefined;\r\n });\r\n setLocalValues(initial);\r\n setErrors({});\r\n setResetCount((prev) => prev + 1);\r\n startTransition(() => router.push(pathname, { scroll: false }));\r\n };\r\n\r\n const clearSingleFilter = useCallback((filter: ServerFilterConfig) => {\r\n const emptyValue =\r\n filter.type === \"array\" ? [] : filter.type === \"boolean\" ? undefined : \"\";\r\n setLocalValues((prev) => ({ ...prev, [filter.key]: emptyValue }));\r\n setErrors((prev) => ({ ...prev, [filter.key]: \"\" }));\r\n if ([\"select\", \"array\", \"boolean\"].includes(filter.type)) {\r\n setResetCount((prev) => prev + 1);\r\n }\r\n }, []);\r\n\r\n return (\r\n <FieldSet className=\"p-2\">\r\n <ScrollArea className=\"pr-4\">\r\n <ScrollBar />\r\n <FieldGroup className={\"gap-3 max-h-80\"}>\r\n {serverFilters.map((filter) => {\r\n const value = localValues[filter.key];\r\n\r\n const isSelectable =\r\n filter.type === \"select\" ||\r\n filter.type === \"array\" ||\r\n filter.type === \"boolean\";\r\n if (isSelectable) {\r\n return (\r\n <Field key={filter.key} className=\"gap-1\">\r\n <FieldLabel htmlFor={filter.key}>{filter.label}</FieldLabel>\r\n <Selectable\r\n id={filter.key}\r\n key={`${filter.key}-${resetCount}`}\r\n singular={filter.type !== \"array\"}\r\n options={filter.options}\r\n defaultValue={filter.options.filter((opt) =>\r\n Array.isArray(value)\r\n ? value.some(\r\n (v) =>\r\n v === opt.value || String(v) === String(opt.value)\r\n )\r\n : value === opt.value ||\r\n String(value) === String(opt.value)\r\n )}\r\n getKey={(opt) => String(opt.value)}\r\n getLabel={(opt) => opt.label}\r\n onChange={(selected) => {\r\n const values = selected.map((s) => s.value);\r\n onValueChange(\r\n filter,\r\n filter.type === \"array\"\r\n ? values\r\n : values[0] ?? undefined\r\n );\r\n }}\r\n searchPlaceholderText={filter.placeholder}\r\n makeAChoiceText={filter.placeholder}\r\n />\r\n {errors[filter.key] && (\r\n <FieldError>{errors[filter.key]}</FieldError>\r\n )}\r\n </Field>\r\n );\r\n }\r\n return (\r\n <Field key={filter.key} className=\"gap-1\">\r\n <FieldLabel htmlFor={filter.key}>{filter.label}</FieldLabel>\r\n <InputGroup>\r\n <InputGroupInput\r\n id={filter.key}\r\n type={filter.type === \"number\" ? \"number\" : \"text\"}\r\n value={\r\n typeof value === \"boolean\" || typeof value === \"object\"\r\n ? \"\"\r\n : value ?? \"\"\r\n }\r\n placeholder={filter.placeholder}\r\n onKeyDown={(e) => e.key === \"Enter\" && handleApply()}\r\n onChange={(e) => onValueChange(filter, e.target.value)}\r\n className={errors[filter.key] ? \"border-destructive\" : \"\"}\r\n />\r\n {localValues[filter.key] && (\r\n <InputGroupAddon align=\"inline-end\">\r\n <InputGroupButton\r\n onClick={() => clearSingleFilter(filter)}\r\n >\r\n <XCircle />\r\n </InputGroupButton>\r\n </InputGroupAddon>\r\n )}\r\n </InputGroup>\r\n {errors[filter.key] && (\r\n <FieldError>{errors[filter.key]}</FieldError>\r\n )}\r\n </Field>\r\n );\r\n })}\r\n </FieldGroup>\r\n </ScrollArea>\r\n <Field orientation=\"horizontal\">\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n onClick={handleReset}\r\n disabled={isPending}\r\n >\r\n <RotateCcw className=\"mr-2 h-4 w-4\" />{\" \"}\r\n {getTranslations(\"filter.clear\", config.t)}\r\n </Button>\r\n <Button type=\"button\" onClick={handleApply} disabled={isPending}>\r\n {isPending ? (\r\n <Loader2 className=\"animate-spin\" />\r\n ) : (\r\n <Search className=\"mr-2 h-4 w-4\" />\r\n )}\r\n {getTranslations(\"filter.apply\", config.t)}\r\n </Button>\r\n </Field>\r\n </FieldSet>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/custom/master-data-grid/components/filters/server-filter.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { Button } from \"@ayasofyazilim/ui/components/button\";\r\nimport {\r\n Field,\r\n FieldError,\r\n FieldGroup,\r\n FieldLabel,\r\n FieldSet,\r\n} from \"@ayasofyazilim/ui/components/field\";\r\nimport { Selectable } from \"@ayasofyazilim/ui/custom/selectable\";\r\nimport { Loader2, RotateCcw, Search, XCircle } from \"lucide-react\";\r\nimport { usePathname, useRouter, useSearchParams } from \"next/navigation\";\r\nimport { useCallback, useState, useTransition } from \"react\";\r\nimport { ServerFilterConfig } from \"../../types\";\r\nimport { BaseMultiFilterDialogProps } from \"./multi-filter-dialog\";\r\nimport {\r\n InputGroup,\r\n InputGroupAddon,\r\n InputGroupButton,\r\n InputGroupInput,\r\n} from \"@ayasofyazilim/ui/components/input-group\";\r\nimport {\r\n ScrollArea,\r\n ScrollBar,\r\n} from \"@ayasofyazilim/ui/components/scroll-area\";\r\nimport { getTranslations } from \"../../utils\";\r\n\r\ntype FilterValue =\r\n | string\r\n | number\r\n | boolean\r\n | Array<string | boolean>\r\n | undefined;\r\n\r\nexport function ServerFilterContent<TData>({\r\n config,\r\n}: BaseMultiFilterDialogProps<TData>) {\r\n const router = useRouter();\r\n const pathname = usePathname();\r\n const searchParams = useSearchParams();\r\n const [isPending, startTransition] = useTransition();\r\n\r\n const { serverFilters } = config;\r\n if (!serverFilters) return null;\r\n\r\n const [resetCount, setResetCount] = useState(0);\r\n\r\n const [localValues, setLocalValues] = useState<Record<string, FilterValue>>(\r\n () => {\r\n const initial: Record<string, FilterValue> = {};\r\n serverFilters.forEach((filter) => {\r\n const val = searchParams.get(filter.key);\r\n if (filter.type === \"array\") {\r\n initial[filter.key] = searchParams.getAll(filter.key);\r\n } else if (filter.type === \"boolean\") {\r\n initial[filter.key] =\r\n val === \"true\" ? true : val === \"false\" ? false : undefined;\r\n } else if (filter.type === \"number\") {\r\n initial[filter.key] = val ? Number(val) : undefined;\r\n } else {\r\n initial[filter.key] = val || undefined;\r\n }\r\n });\r\n return initial;\r\n },\r\n );\r\n\r\n const [errors, setErrors] = useState<Record<string, string>>({});\r\n\r\n const onValueChange = useCallback(\r\n (filter: ServerFilterConfig, rawValue: FilterValue) => {\r\n let processedValue: FilterValue = rawValue;\r\n if (\r\n rawValue === \"\" ||\r\n (Array.isArray(rawValue) && rawValue.length === 0)\r\n ) {\r\n processedValue = undefined;\r\n }\r\n\r\n if (filter.validator) {\r\n const result = filter.validator.safeParse(processedValue);\r\n setErrors((prev) => ({\r\n ...prev,\r\n [filter.key]: result.success\r\n ? \"\"\r\n : result.error.issues[0]?.message || \"Hata\",\r\n }));\r\n }\r\n\r\n setLocalValues((prev) => ({ ...prev, [filter.key]: processedValue }));\r\n },\r\n [],\r\n );\r\n\r\n const handleApply = () => {\r\n const params = new URLSearchParams(searchParams.toString());\r\n let hasValidationError = false;\r\n\r\n serverFilters.forEach((filter) => {\r\n const val = localValues[filter.key];\r\n params.delete(filter.key);\r\n const isEmpty =\r\n val === undefined ||\r\n val === null ||\r\n val === \"\" ||\r\n (Array.isArray(val) && val.length === 0);\r\n\r\n if (!isEmpty) {\r\n if (filter.validator) {\r\n const result = filter.validator.safeParse(val);\r\n if (!result.success) {\r\n hasValidationError = true;\r\n setErrors((prev) => ({\r\n ...prev,\r\n [filter.key]: result.error.issues[0]?.message || \"Hata\",\r\n }));\r\n return;\r\n }\r\n }\r\n if (Array.isArray(val)) {\r\n val.forEach((v) => params.append(filter.key, String(v)));\r\n } else {\r\n params.set(filter.key, String(val));\r\n }\r\n } else {\r\n setErrors((prev) => ({ ...prev, [filter.key]: \"\" }));\r\n }\r\n });\r\n if (hasValidationError) return;\r\n params.delete(\"page\");\r\n startTransition(() => {\r\n router.push(`${pathname}?${params.toString()}`, { scroll: false });\r\n });\r\n };\r\n\r\n const handleReset = () => {\r\n const initial: Record<string, FilterValue> = {};\r\n serverFilters.forEach((f) => {\r\n initial[f.key] = f.type === \"array\" ? [] : undefined;\r\n });\r\n setLocalValues(initial);\r\n setErrors({});\r\n setResetCount((prev) => prev + 1);\r\n startTransition(() => router.push(pathname, { scroll: false }));\r\n };\r\n\r\n const clearSingleFilter = useCallback((filter: ServerFilterConfig) => {\r\n const emptyValue =\r\n filter.type === \"array\" ? [] : filter.type === \"boolean\" ? undefined : \"\";\r\n setLocalValues((prev) => ({ ...prev, [filter.key]: emptyValue }));\r\n setErrors((prev) => ({ ...prev, [filter.key]: \"\" }));\r\n if ([\"select\", \"array\", \"boolean\"].includes(filter.type)) {\r\n setResetCount((prev) => prev + 1);\r\n }\r\n }, []);\r\n\r\n return (\r\n <FieldSet className=\"p-2\">\r\n <ScrollArea className=\"pr-4\">\r\n <ScrollBar />\r\n <FieldGroup className={\"gap-3 max-h-80\"}>\r\n {serverFilters.map((filter) => {\r\n const value = localValues[filter.key];\r\n\r\n const isSelectable =\r\n filter.type === \"select\" ||\r\n filter.type === \"array\" ||\r\n filter.type === \"boolean\";\r\n if (isSelectable) {\r\n return (\r\n <Field key={filter.key} className=\"gap-1\">\r\n <FieldLabel htmlFor={filter.key}>{filter.label}</FieldLabel>\r\n <Selectable\r\n id={filter.key}\r\n key={`${filter.key}-${resetCount}`}\r\n singular={filter.type !== \"array\"}\r\n options={filter.options}\r\n defaultValue={filter.options.filter((opt) =>\r\n Array.isArray(value)\r\n ? value.some(\r\n (v) =>\r\n v === opt.value ||\r\n String(v) === String(opt.value),\r\n )\r\n : value === opt.value ||\r\n String(value) === String(opt.value),\r\n )}\r\n getKey={(opt) => String(opt.value)}\r\n getLabel={(opt) => opt.label}\r\n onChange={(selected) => {\r\n const values = selected.map((s) => s.value);\r\n onValueChange(\r\n filter,\r\n filter.type === \"array\"\r\n ? values\r\n : (values[0] ?? undefined),\r\n );\r\n }}\r\n searchPlaceholderText={filter.placeholder}\r\n makeAChoiceText={filter.placeholder}\r\n />\r\n {errors[filter.key] && (\r\n <FieldError>{errors[filter.key]}</FieldError>\r\n )}\r\n </Field>\r\n );\r\n }\r\n return (\r\n <Field key={filter.key} className=\"gap-1\">\r\n <FieldLabel htmlFor={filter.key}>{filter.label}</FieldLabel>\r\n <InputGroup>\r\n <InputGroupInput\r\n id={filter.key}\r\n type={filter.type === \"number\" ? \"number\" : \"text\"}\r\n value={\r\n typeof value === \"boolean\" || typeof value === \"object\"\r\n ? \"\"\r\n : (value ?? \"\")\r\n }\r\n placeholder={filter.placeholder}\r\n onKeyDown={(e) => e.key === \"Enter\" && handleApply()}\r\n onChange={(e) => onValueChange(filter, e.target.value)}\r\n className={errors[filter.key] ? \"border-destructive\" : \"\"}\r\n />\r\n {localValues[filter.key] && (\r\n <InputGroupAddon align=\"inline-end\">\r\n <InputGroupButton\r\n onClick={() => clearSingleFilter(filter)}\r\n >\r\n <XCircle />\r\n </InputGroupButton>\r\n </InputGroupAddon>\r\n )}\r\n </InputGroup>\r\n {errors[filter.key] && (\r\n <FieldError>{errors[filter.key]}</FieldError>\r\n )}\r\n </Field>\r\n );\r\n })}\r\n </FieldGroup>\r\n </ScrollArea>\r\n <Field orientation=\"horizontal\">\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n onClick={handleReset}\r\n disabled={isPending}\r\n >\r\n <RotateCcw className=\"mr-2 h-4 w-4\" />{\" \"}\r\n {getTranslations(\"filter.clear\", config.t)}\r\n </Button>\r\n <Button type=\"button\" onClick={handleApply} disabled={isPending}>\r\n {isPending ? (\r\n <Loader2 className=\"animate-spin\" />\r\n ) : (\r\n <Search className=\"mr-2 h-4 w-4\" />\r\n )}\r\n {getTranslations(\"filter.apply\", config.t)}\r\n </Button>\r\n </Field>\r\n </FieldSet>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
- import { Switch } from "@repo/ayasofyazilim-ui/components/switch";
2
+ import { Switch } from "@ayasofyazilim/ui/components/switch";
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import { z } from "zod";
5
5
  import { Badge } from "../../../../components/badge";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/custom/master-data-grid/components/table/cell-renderer.tsx"],"sourcesContent":["import { Switch } from \"@repo/ayasofyazilim-ui/components/switch\";\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { z } from \"zod\";\r\nimport { Badge } from \"../../../../components/badge\";\r\nimport { Input } from \"../../../../components/input\";\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"../../../../components/select\";\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"../../../../components/tooltip\";\r\nimport { DatePicker } from \"../../../date-picker\";\r\nimport DateTooltip from \"../../../date-tooltip\";\r\nimport { cn } from \"../../../../lib/utils\";\r\nimport type {\r\n CellRendererProps,\r\n JSONSchemaProperty,\r\n MasterDataGridResources,\r\n} from \"../../types\";\r\nimport { getTranslations } from \"../../utils/translation-utils\";\r\n\r\nconst DEBOUNCE_DELAY = 150;\r\nconst MAX_STRING_LENGTH = 100;\r\n\r\nconst BADGE_VARIANT_MAP: Record<\r\n string,\r\n \"default\" | \"secondary\" | \"outline\" | \"destructive\"\r\n> = {\r\n active: \"default\",\r\n inactive: \"secondary\",\r\n pending: \"outline\",\r\n success: \"default\",\r\n warning: \"destructive\",\r\n error: \"destructive\",\r\n};\r\n\r\nfunction createZodSchema(\r\n schemaProperty?: JSONSchemaProperty,\r\n t?: MasterDataGridResources\r\n): z.ZodType {\r\n if (!schemaProperty) return z.unknown();\r\n\r\n let schema: z.ZodType;\r\n\r\n switch (schemaProperty.type) {\r\n case \"string\":\r\n schema = z.string({\r\n message: getTranslations(\"validation.invalidString\", t),\r\n });\r\n\r\n if (schemaProperty.minLength !== undefined) {\r\n schema = (schema as z.ZodString).min(\r\n schemaProperty.minLength,\r\n t?.[\"validation.min_length\"]\r\n ? (t[\"validation.min_length\"] ?? \"\").replace(\r\n \"{min}\",\r\n String(schemaProperty.minLength)\r\n )\r\n : `Must be at least ${schemaProperty.minLength} characters`\r\n );\r\n }\r\n if (schemaProperty.maxLength !== undefined) {\r\n schema = (schema as z.ZodString).max(\r\n schemaProperty.maxLength,\r\n t?.[\"validation.max_length\"]\r\n ? (t[\"validation.max_length\"] ?? \"\").replace(\r\n \"{max}\",\r\n String(schemaProperty.maxLength)\r\n )\r\n : `Must be at most ${schemaProperty.maxLength} characters`\r\n );\r\n }\r\n\r\n if (schemaProperty.format === \"email\") {\r\n schema = (schema as z.ZodString).email(\r\n t?.[\"validation.invalid_email\"] || \"Must be a valid email address\"\r\n );\r\n }\r\n if (schemaProperty.format === \"uri\" || schemaProperty.format === \"url\") {\r\n schema = z.url(t?.[\"validation.invalid_url\"] || \"Must be a valid URL\");\r\n }\r\n if (schemaProperty.format === \"uuid\") {\r\n schema = z.uuid(\r\n t?.[\"validation.invalid_uuid\"] || \"Must be a valid UUID\"\r\n );\r\n }\r\n break;\r\n\r\n case \"number\":\r\n schema = z.number({\r\n message: t?.[\"validation.invalid_number\"] || \"Must be a valid number\",\r\n });\r\n\r\n if (schemaProperty.minimum !== undefined) {\r\n schema = (schema as z.ZodNumber).min(\r\n schemaProperty.minimum,\r\n t?.[\"validation.min_value\"]\r\n ? (t[\"validation.min_value\"] ?? \"\").replace(\r\n \"{min}\",\r\n String(schemaProperty.minimum)\r\n )\r\n : `Must be at least ${schemaProperty.minimum}`\r\n );\r\n }\r\n if (schemaProperty.maximum !== undefined) {\r\n schema = (schema as z.ZodNumber).max(\r\n schemaProperty.maximum,\r\n t?.[\"validation.max_value\"]\r\n ? (t[\"validation.max_value\"] ?? \"\").replace(\r\n \"{max}\",\r\n String(schemaProperty.maximum)\r\n )\r\n : `Must be at most ${schemaProperty.maximum}`\r\n );\r\n }\r\n break;\r\n\r\n case \"integer\":\r\n schema = z\r\n .number({\r\n message:\r\n t?.[\"validation.invalid_integer\"] || \"Must be a valid integer\",\r\n })\r\n .int(t?.[\"validation.must_be_integer\"] || \"Must be an integer\");\r\n\r\n if (schemaProperty.minimum !== undefined) {\r\n schema = (schema as z.ZodNumber).min(\r\n schemaProperty.minimum,\r\n t?.[\"validation.min_value\"]\r\n ? (t[\"validation.min_value\"] ?? \"\").replace(\r\n \"{min}\",\r\n String(schemaProperty.minimum)\r\n )\r\n : `Must be at least ${schemaProperty.minimum}`\r\n );\r\n }\r\n if (schemaProperty.maximum !== undefined) {\r\n schema = (schema as z.ZodNumber).max(\r\n schemaProperty.maximum,\r\n t?.[\"validation.max_value\"]\r\n ? (t[\"validation.max_value\"] ?? \"\").replace(\r\n \"{max}\",\r\n String(schemaProperty.maximum)\r\n )\r\n : `Must be at most ${schemaProperty.maximum}`\r\n );\r\n }\r\n break;\r\n\r\n case \"boolean\":\r\n schema = z.boolean({\r\n message: t?.[\"validation.invalid_boolean\"] || \"Must be true or false\",\r\n });\r\n break;\r\n\r\n default:\r\n schema = z.unknown();\r\n }\r\n\r\n if (schemaProperty.enum && Array.isArray(schemaProperty.enum)) {\r\n schema = z.enum(\r\n schemaProperty.enum as [string, ...string[]],\r\n t?.[\"validation.invalid_enum\"] || \"Invalid value\"\r\n );\r\n }\r\n\r\n if (!schemaProperty.required) {\r\n schema = schema.optional().nullable();\r\n }\r\n\r\n return schema;\r\n}\r\n\r\ninterface ErrorWrapperProps {\r\n error: string | null;\r\n mode: \"tooltip\" | \"inline\" | \"both\";\r\n children: React.ReactNode;\r\n}\r\n\r\nfunction ErrorWrapper({ error, mode, children }: ErrorWrapperProps) {\r\n if (!error) return <>{children}</>;\r\n\r\n const showTooltip = mode === \"tooltip\" || mode === \"both\";\r\n const showInline = mode === \"inline\" || mode === \"both\";\r\n\r\n const inlineError = showInline && (\r\n <span className=\"text-[10px] text-destructive px-2 py-0.5 leading-tight animate-in fade-in slide-in-from-top-1\">\r\n {error}\r\n </span>\r\n );\r\n\r\n if (showTooltip && !showInline) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{children}</TooltipTrigger>\r\n <TooltipContent side=\"bottom\" className=\"max-w-xs\">\r\n {error}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n if (showInline && !showTooltip) {\r\n return (\r\n <div className=\"flex flex-col w-full h-full\">\r\n {children}\r\n {inlineError}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <div className=\"flex flex-col w-full h-full\">\r\n {children}\r\n {inlineError}\r\n </div>\r\n </TooltipTrigger>\r\n <TooltipContent side=\"bottom\" className=\"max-w-xs\">\r\n {error}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n}\r\n\r\nexport function CellRenderer<TData = unknown>({\r\n value,\r\n row,\r\n column,\r\n schemaProperty,\r\n editable = false,\r\n onUpdate,\r\n t,\r\n error,\r\n className,\r\n dateOptions,\r\n localization,\r\n fieldName,\r\n customRenderers,\r\n errorDisplayMode = \"tooltip\",\r\n}: CellRendererProps<TData>) {\r\n const [localValue, setLocalValue] = useState(value);\r\n const [validationError, setValidationError] = useState<string | null>(\r\n error || null\r\n );\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const updateTimeoutRef = useRef<NodeJS.Timeout>(null);\r\n const datePickerIdRef = useRef<string>(\r\n `date-${schemaProperty?.title || \"field\"}-${Date.now()}`\r\n );\r\n const datePickerMountedRef = useRef<boolean>(false);\r\n const handleDateChangeRef = useRef<((date: Date) => void) | null>(null);\r\n\r\n const validationSchema = useMemo(\r\n () => (schemaProperty ? createZodSchema(schemaProperty, t) : null),\r\n [schemaProperty, t]\r\n );\r\n\r\n useEffect(() => {\r\n if (!editable) {\r\n setLocalValue(value);\r\n datePickerMountedRef.current = false;\r\n }\r\n }, [value, editable]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (updateTimeoutRef.current) {\r\n clearTimeout(updateTimeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedUpdate = useCallback(\r\n (newValue: unknown) => {\r\n if (updateTimeoutRef.current) {\r\n clearTimeout(updateTimeoutRef.current);\r\n }\r\n updateTimeoutRef.current = setTimeout(() => {\r\n if (onUpdate) {\r\n onUpdate(newValue);\r\n }\r\n }, DEBOUNCE_DELAY);\r\n },\r\n [onUpdate]\r\n );\r\n\r\n const handleChange = useCallback(\r\n (newValue: unknown) => {\r\n setLocalValue(newValue);\r\n\r\n const err = validationSchema\r\n ? (() => {\r\n const result = validationSchema.safeParse(newValue);\r\n return result.success\r\n ? null\r\n : result.error.issues[0]?.message || \"Invalid value\";\r\n })()\r\n : null;\r\n\r\n setValidationError(err);\r\n\r\n if (!err) {\r\n debouncedUpdate(newValue);\r\n }\r\n },\r\n [validationSchema, debouncedUpdate]\r\n );\r\n\r\n const inputClassName = useMemo(\r\n () =>\r\n cn(\r\n \"h-full px-2 shadow-none border-0 rounded-none focus-visible:ring-0 focus-visible:ring-offset-0\",\r\n validationError && \"border border-destructive\"\r\n ),\r\n [validationError]\r\n );\r\n\r\n if (editable && !schemaProperty?.readOnly) {\r\n if (fieldName && customRenderers?.[fieldName]) {\r\n const customRenderer = customRenderers?.[fieldName]!;\r\n return (\r\n <>\r\n {customRenderer({\r\n value: localValue,\r\n row,\r\n column,\r\n onUpdate: handleChange,\r\n error: validationError || undefined,\r\n schemaProperty,\r\n t,\r\n })}\r\n </>\r\n );\r\n }\r\n\r\n if (schemaProperty?.type === \"boolean\" || typeof value === \"boolean\") {\r\n return (\r\n <ErrorWrapper error={validationError} mode={errorDisplayMode}>\r\n <div className=\"flex items-center px-2\">\r\n <Switch\r\n checked={!!localValue}\r\n onCheckedChange={handleChange}\r\n className={validationError ? \"border-destructive\" : \"\"}\r\n />\r\n </div>\r\n </ErrorWrapper>\r\n );\r\n }\r\n\r\n if (schemaProperty?.enum && Array.isArray(schemaProperty.enum)) {\r\n return (\r\n <ErrorWrapper error={validationError} mode={errorDisplayMode}>\r\n <div className=\"w-full h-full flex items-center\">\r\n <Select value={String(localValue)} onValueChange={handleChange}>\r\n <SelectTrigger\r\n size=\"sm\"\r\n className={cn(\r\n \"h-[35px]! px-2 w-full shadow-none border-0 rounded-none focus:ring-0 focus:ring-offset-0\",\r\n validationError && \"border border-destructive\"\r\n )}\r\n >\r\n <SelectValue />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {schemaProperty.enum.map((option) => (\r\n <SelectItem key={String(option)} value={String(option)}>\r\n {String(option)}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n </ErrorWrapper>\r\n );\r\n }\r\n\r\n if (\r\n schemaProperty?.type === \"number\" ||\r\n schemaProperty?.type === \"integer\"\r\n ) {\r\n const handleNumberChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val =\r\n schemaProperty.type === \"integer\"\r\n ? parseInt(e.target.value)\r\n : parseFloat(e.target.value);\r\n handleChange(isNaN(val) ? e.target.value : val);\r\n };\r\n\r\n return (\r\n <ErrorWrapper error={validationError} mode={errorDisplayMode}>\r\n <div className=\"w-full h-full flex items-center\">\r\n <Input\r\n ref={inputRef}\r\n type=\"number\"\r\n value={String(localValue ?? \"\")}\r\n onChange={handleNumberChange}\r\n className={inputClassName}\r\n />\r\n </div>\r\n </ErrorWrapper>\r\n );\r\n }\r\n\r\n if (\r\n schemaProperty?.format === \"date\" ||\r\n schemaProperty?.format === \"date-time\"\r\n ) {\r\n const dateValue =\r\n localValue instanceof Date\r\n ? localValue\r\n : localValue\r\n ? new Date(String(localValue))\r\n : undefined;\r\n\r\n const isDateTime = schemaProperty?.format === \"date-time\";\r\n\r\n if (!handleDateChangeRef.current) {\r\n handleDateChangeRef.current = (date: Date) => {\r\n if (!datePickerMountedRef.current) {\r\n datePickerMountedRef.current = true;\r\n return;\r\n }\r\n\r\n if (schemaProperty?.format === \"date-time\") {\r\n handleChange(date?.toISOString());\r\n } else {\r\n const isoDate = date?.toISOString().split(\"T\")[0];\r\n handleChange(isoDate);\r\n }\r\n };\r\n }\r\n\r\n return (\r\n <ErrorWrapper error={validationError} mode={errorDisplayMode}>\r\n <DatePicker\r\n id={datePickerIdRef.current}\r\n showIcon={false}\r\n defaultValue={\r\n dateValue instanceof Date && !Number.isNaN(dateValue.getTime())\r\n ? dateValue\r\n : undefined\r\n }\r\n onChange={handleDateChangeRef.current}\r\n classNames={{\r\n dateInput: cn(\r\n \"shadow-none border-0 h-8! rounded-none\",\r\n validationError && \"border border-destructive\"\r\n ),\r\n }}\r\n useTime={isDateTime}\r\n />\r\n </ErrorWrapper>\r\n );\r\n }\r\n\r\n const inputType = schemaProperty?.format === \"email\" ? \"email\" : \"text\";\r\n\r\n return (\r\n <ErrorWrapper error={validationError} mode={errorDisplayMode}>\r\n <div className=\"w-full h-full flex items-center\">\r\n <Input\r\n ref={inputRef}\r\n type={inputType}\r\n value={String(localValue ?? \"\")}\r\n onChange={(e) => handleChange(e.target.value)}\r\n className={inputClassName}\r\n />\r\n </div>\r\n </ErrorWrapper>\r\n );\r\n }\r\n\r\n if (fieldName && customRenderers?.[fieldName]) {\r\n const customRenderer = customRenderers?.[fieldName]!;\r\n return (\r\n <>\r\n {customRenderer({\r\n value: localValue,\r\n row,\r\n column,\r\n onUpdate: handleChange,\r\n error: validationError || undefined,\r\n schemaProperty,\r\n t,\r\n })}\r\n </>\r\n );\r\n }\r\n if (value === null || value === undefined) {\r\n return (\r\n <span className={cn(\"text-muted-foreground italic\", className)}>—</span>\r\n );\r\n }\r\n\r\n if (schemaProperty?.type === \"boolean\" || typeof value === \"boolean\") {\r\n const yesLabel = t?.[\"cell.boolean.yes\"] ?? \"Yes\";\r\n const noLabel = t?.[\"cell.boolean.no\"] ?? \"No\";\r\n return (\r\n <Badge variant={value ? \"default\" : \"secondary\"} className={className}>\r\n {value ? yesLabel : noLabel}\r\n </Badge>\r\n );\r\n }\r\n\r\n if (\r\n schemaProperty?.format === \"date\" ||\r\n schemaProperty?.format === \"date-time\"\r\n ) {\r\n try {\r\n const date = value instanceof Date ? value : new Date(value as string);\r\n\r\n const defaultLocalization = localization || {\r\n locale: \"en-US\",\r\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\r\n lang: \"en\",\r\n };\r\n\r\n const defaultDateOptions =\r\n dateOptions ||\r\n (schemaProperty.format === \"date\"\r\n ? {\r\n day: \"2-digit\",\r\n month: \"short\",\r\n year: \"numeric\",\r\n }\r\n : {\r\n day: \"2-digit\",\r\n month: \"short\",\r\n year: \"numeric\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n hour12: false,\r\n });\r\n\r\n return (\r\n <DateTooltip\r\n date={date}\r\n localization={defaultLocalization}\r\n dateOptions={defaultDateOptions}\r\n />\r\n );\r\n } catch {\r\n return <span className={className}>{String(value)}</span>;\r\n }\r\n }\r\n\r\n if (schemaProperty?.enum && Array.isArray(schemaProperty.enum)) {\r\n const label = String(value);\r\n return (\r\n <Badge variant=\"outline\" className={cn(\"font-normal\", className)}>\r\n {t?.[`column.${fieldName}.${label}`] || label}\r\n </Badge>\r\n );\r\n }\r\n\r\n if (schemaProperty?.format === \"badge\") {\r\n const variant = BADGE_VARIANT_MAP[String(value).toLowerCase()] || \"outline\";\r\n const label = String(value);\r\n return (\r\n <Badge variant={variant} className={className}>\r\n {t?.[`column.${fieldName}.${label}`] || label}\r\n </Badge>\r\n );\r\n }\r\n\r\n if (schemaProperty?.format === \"uri\") {\r\n return (\r\n <a\r\n href={String(value)}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className={cn(\"text-primary hover:underline\", className)}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {String(value)}\r\n </a>\r\n );\r\n }\r\n\r\n if (schemaProperty?.format === \"uuid\") {\r\n const uuid = String(value);\r\n return (\r\n <code className={cn(\"text-xs bg-muted 5 rounded\", className)}>\r\n {uuid.slice(0, 8)}...\r\n </code>\r\n );\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n const arrayString = value.map((item) => String(item)).join(\", \");\r\n return <span className={className}>{arrayString}</span>;\r\n }\r\n\r\n if (typeof value === \"object\") {\r\n return (\r\n <code className={cn(\"text-xs bg-muted rounded\", className)}>\r\n {JSON.stringify(value)}\r\n </code>\r\n );\r\n }\r\n\r\n const strValue = String(value);\r\n\r\n if (strValue.length > MAX_STRING_LENGTH) {\r\n return (\r\n <span title={strValue} className={className}>\r\n {strValue.slice(0, MAX_STRING_LENGTH)}...\r\n </span>\r\n );\r\n }\r\n\r\n return <span className={className}>{strValue}</span>;\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/custom/master-data-grid/components/table/cell-renderer.tsx"],"sourcesContent":["import { Switch } from \"@ayasofyazilim/ui/components/switch\";\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { z } from \"zod\";\r\nimport { Badge } from \"../../../../components/badge\";\r\nimport { Input } from \"../../../../components/input\";\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"../../../../components/select\";\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"../../../../components/tooltip\";\r\nimport { DatePicker } from \"../../../date-picker\";\r\nimport DateTooltip from \"../../../date-tooltip\";\r\nimport { cn } from \"../../../../lib/utils\";\r\nimport type {\r\n CellRendererProps,\r\n JSONSchemaProperty,\r\n MasterDataGridResources,\r\n} from \"../../types\";\r\nimport { getTranslations } from \"../../utils/translation-utils\";\r\n\r\nconst DEBOUNCE_DELAY = 150;\r\nconst MAX_STRING_LENGTH = 100;\r\n\r\nconst BADGE_VARIANT_MAP: Record<\r\n string,\r\n \"default\" | \"secondary\" | \"outline\" | \"destructive\"\r\n> = {\r\n active: \"default\",\r\n inactive: \"secondary\",\r\n pending: \"outline\",\r\n success: \"default\",\r\n warning: \"destructive\",\r\n error: \"destructive\",\r\n};\r\n\r\nfunction createZodSchema(\r\n schemaProperty?: JSONSchemaProperty,\r\n t?: MasterDataGridResources,\r\n): z.ZodType {\r\n if (!schemaProperty) return z.unknown();\r\n\r\n let schema: z.ZodType;\r\n\r\n switch (schemaProperty.type) {\r\n case \"string\":\r\n schema = z.string({\r\n message: getTranslations(\"validation.invalidString\", t),\r\n });\r\n\r\n if (schemaProperty.minLength !== undefined) {\r\n schema = (schema as z.ZodString).min(\r\n schemaProperty.minLength,\r\n t?.[\"validation.min_length\"]\r\n ? (t[\"validation.min_length\"] ?? \"\").replace(\r\n \"{min}\",\r\n String(schemaProperty.minLength),\r\n )\r\n : `Must be at least ${schemaProperty.minLength} characters`,\r\n );\r\n }\r\n if (schemaProperty.maxLength !== undefined) {\r\n schema = (schema as z.ZodString).max(\r\n schemaProperty.maxLength,\r\n t?.[\"validation.max_length\"]\r\n ? (t[\"validation.max_length\"] ?? \"\").replace(\r\n \"{max}\",\r\n String(schemaProperty.maxLength),\r\n )\r\n : `Must be at most ${schemaProperty.maxLength} characters`,\r\n );\r\n }\r\n\r\n if (schemaProperty.format === \"email\") {\r\n schema = (schema as z.ZodString).email(\r\n t?.[\"validation.invalid_email\"] || \"Must be a valid email address\",\r\n );\r\n }\r\n if (schemaProperty.format === \"uri\" || schemaProperty.format === \"url\") {\r\n schema = z.url(t?.[\"validation.invalid_url\"] || \"Must be a valid URL\");\r\n }\r\n if (schemaProperty.format === \"uuid\") {\r\n schema = z.uuid(\r\n t?.[\"validation.invalid_uuid\"] || \"Must be a valid UUID\",\r\n );\r\n }\r\n break;\r\n\r\n case \"number\":\r\n schema = z.number({\r\n message: t?.[\"validation.invalid_number\"] || \"Must be a valid number\",\r\n });\r\n\r\n if (schemaProperty.minimum !== undefined) {\r\n schema = (schema as z.ZodNumber).min(\r\n schemaProperty.minimum,\r\n t?.[\"validation.min_value\"]\r\n ? (t[\"validation.min_value\"] ?? \"\").replace(\r\n \"{min}\",\r\n String(schemaProperty.minimum),\r\n )\r\n : `Must be at least ${schemaProperty.minimum}`,\r\n );\r\n }\r\n if (schemaProperty.maximum !== undefined) {\r\n schema = (schema as z.ZodNumber).max(\r\n schemaProperty.maximum,\r\n t?.[\"validation.max_value\"]\r\n ? (t[\"validation.max_value\"] ?? \"\").replace(\r\n \"{max}\",\r\n String(schemaProperty.maximum),\r\n )\r\n : `Must be at most ${schemaProperty.maximum}`,\r\n );\r\n }\r\n break;\r\n\r\n case \"integer\":\r\n schema = z\r\n .number({\r\n message:\r\n t?.[\"validation.invalid_integer\"] || \"Must be a valid integer\",\r\n })\r\n .int(t?.[\"validation.must_be_integer\"] || \"Must be an integer\");\r\n\r\n if (schemaProperty.minimum !== undefined) {\r\n schema = (schema as z.ZodNumber).min(\r\n schemaProperty.minimum,\r\n t?.[\"validation.min_value\"]\r\n ? (t[\"validation.min_value\"] ?? \"\").replace(\r\n \"{min}\",\r\n String(schemaProperty.minimum),\r\n )\r\n : `Must be at least ${schemaProperty.minimum}`,\r\n );\r\n }\r\n if (schemaProperty.maximum !== undefined) {\r\n schema = (schema as z.ZodNumber).max(\r\n schemaProperty.maximum,\r\n t?.[\"validation.max_value\"]\r\n ? (t[\"validation.max_value\"] ?? \"\").replace(\r\n \"{max}\",\r\n String(schemaProperty.maximum),\r\n )\r\n : `Must be at most ${schemaProperty.maximum}`,\r\n );\r\n }\r\n break;\r\n\r\n case \"boolean\":\r\n schema = z.boolean({\r\n message: t?.[\"validation.invalid_boolean\"] || \"Must be true or false\",\r\n });\r\n break;\r\n\r\n default:\r\n schema = z.unknown();\r\n }\r\n\r\n if (schemaProperty.enum && Array.isArray(schemaProperty.enum)) {\r\n schema = z.enum(\r\n schemaProperty.enum as [string, ...string[]],\r\n t?.[\"validation.invalid_enum\"] || \"Invalid value\",\r\n );\r\n }\r\n\r\n if (!schemaProperty.required) {\r\n schema = schema.optional().nullable();\r\n }\r\n\r\n return schema;\r\n}\r\n\r\ninterface ErrorWrapperProps {\r\n error: string | null;\r\n mode: \"tooltip\" | \"inline\" | \"both\";\r\n children: React.ReactNode;\r\n}\r\n\r\nfunction ErrorWrapper({ error, mode, children }: ErrorWrapperProps) {\r\n if (!error) return <>{children}</>;\r\n\r\n const showTooltip = mode === \"tooltip\" || mode === \"both\";\r\n const showInline = mode === \"inline\" || mode === \"both\";\r\n\r\n const inlineError = showInline && (\r\n <span className=\"text-[10px] text-destructive px-2 py-0.5 leading-tight animate-in fade-in slide-in-from-top-1\">\r\n {error}\r\n </span>\r\n );\r\n\r\n if (showTooltip && !showInline) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{children}</TooltipTrigger>\r\n <TooltipContent side=\"bottom\" className=\"max-w-xs\">\r\n {error}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n if (showInline && !showTooltip) {\r\n return (\r\n <div className=\"flex flex-col w-full h-full\">\r\n {children}\r\n {inlineError}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <div className=\"flex flex-col w-full h-full\">\r\n {children}\r\n {inlineError}\r\n </div>\r\n </TooltipTrigger>\r\n <TooltipContent side=\"bottom\" className=\"max-w-xs\">\r\n {error}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n}\r\n\r\nexport function CellRenderer<TData = unknown>({\r\n value,\r\n row,\r\n column,\r\n schemaProperty,\r\n editable = false,\r\n onUpdate,\r\n t,\r\n error,\r\n className,\r\n dateOptions,\r\n localization,\r\n fieldName,\r\n customRenderers,\r\n errorDisplayMode = \"tooltip\",\r\n}: CellRendererProps<TData>) {\r\n const [localValue, setLocalValue] = useState(value);\r\n const [validationError, setValidationError] = useState<string | null>(\r\n error || null,\r\n );\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const updateTimeoutRef = useRef<NodeJS.Timeout>(null);\r\n const datePickerIdRef = useRef<string>(\r\n `date-${schemaProperty?.title || \"field\"}-${Date.now()}`,\r\n );\r\n const datePickerMountedRef = useRef<boolean>(false);\r\n const handleDateChangeRef = useRef<((date: Date) => void) | null>(null);\r\n\r\n const validationSchema = useMemo(\r\n () => (schemaProperty ? createZodSchema(schemaProperty, t) : null),\r\n [schemaProperty, t],\r\n );\r\n\r\n useEffect(() => {\r\n if (!editable) {\r\n setLocalValue(value);\r\n datePickerMountedRef.current = false;\r\n }\r\n }, [value, editable]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (updateTimeoutRef.current) {\r\n clearTimeout(updateTimeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedUpdate = useCallback(\r\n (newValue: unknown) => {\r\n if (updateTimeoutRef.current) {\r\n clearTimeout(updateTimeoutRef.current);\r\n }\r\n updateTimeoutRef.current = setTimeout(() => {\r\n if (onUpdate) {\r\n onUpdate(newValue);\r\n }\r\n }, DEBOUNCE_DELAY);\r\n },\r\n [onUpdate],\r\n );\r\n\r\n const handleChange = useCallback(\r\n (newValue: unknown) => {\r\n setLocalValue(newValue);\r\n\r\n const err = validationSchema\r\n ? (() => {\r\n const result = validationSchema.safeParse(newValue);\r\n return result.success\r\n ? null\r\n : result.error.issues[0]?.message || \"Invalid value\";\r\n })()\r\n : null;\r\n\r\n setValidationError(err);\r\n\r\n if (!err) {\r\n debouncedUpdate(newValue);\r\n }\r\n },\r\n [validationSchema, debouncedUpdate],\r\n );\r\n\r\n const inputClassName = useMemo(\r\n () =>\r\n cn(\r\n \"h-full px-2 shadow-none border-0 rounded-none focus-visible:ring-0 focus-visible:ring-offset-0\",\r\n validationError && \"border border-destructive\",\r\n ),\r\n [validationError],\r\n );\r\n\r\n if (editable && !schemaProperty?.readOnly) {\r\n if (fieldName && customRenderers?.[fieldName]) {\r\n const customRenderer = customRenderers?.[fieldName]!;\r\n return (\r\n <>\r\n {customRenderer({\r\n value: localValue,\r\n row,\r\n column,\r\n onUpdate: handleChange,\r\n error: validationError || undefined,\r\n schemaProperty,\r\n t,\r\n })}\r\n </>\r\n );\r\n }\r\n\r\n if (schemaProperty?.type === \"boolean\" || typeof value === \"boolean\") {\r\n return (\r\n <ErrorWrapper error={validationError} mode={errorDisplayMode}>\r\n <div className=\"flex items-center px-2\">\r\n <Switch\r\n checked={!!localValue}\r\n onCheckedChange={handleChange}\r\n className={validationError ? \"border-destructive\" : \"\"}\r\n />\r\n </div>\r\n </ErrorWrapper>\r\n );\r\n }\r\n\r\n if (schemaProperty?.enum && Array.isArray(schemaProperty.enum)) {\r\n return (\r\n <ErrorWrapper error={validationError} mode={errorDisplayMode}>\r\n <div className=\"w-full h-full flex items-center\">\r\n <Select value={String(localValue)} onValueChange={handleChange}>\r\n <SelectTrigger\r\n size=\"sm\"\r\n className={cn(\r\n \"h-[35px]! px-2 w-full shadow-none border-0 rounded-none focus:ring-0 focus:ring-offset-0\",\r\n validationError && \"border border-destructive\",\r\n )}\r\n >\r\n <SelectValue />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {schemaProperty.enum.map((option) => (\r\n <SelectItem key={String(option)} value={String(option)}>\r\n {String(option)}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n </ErrorWrapper>\r\n );\r\n }\r\n\r\n if (\r\n schemaProperty?.type === \"number\" ||\r\n schemaProperty?.type === \"integer\"\r\n ) {\r\n const handleNumberChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val =\r\n schemaProperty.type === \"integer\"\r\n ? parseInt(e.target.value)\r\n : parseFloat(e.target.value);\r\n handleChange(isNaN(val) ? e.target.value : val);\r\n };\r\n\r\n return (\r\n <ErrorWrapper error={validationError} mode={errorDisplayMode}>\r\n <div className=\"w-full h-full flex items-center\">\r\n <Input\r\n ref={inputRef}\r\n type=\"number\"\r\n value={String(localValue ?? \"\")}\r\n onChange={handleNumberChange}\r\n className={inputClassName}\r\n />\r\n </div>\r\n </ErrorWrapper>\r\n );\r\n }\r\n\r\n if (\r\n schemaProperty?.format === \"date\" ||\r\n schemaProperty?.format === \"date-time\"\r\n ) {\r\n const dateValue =\r\n localValue instanceof Date\r\n ? localValue\r\n : localValue\r\n ? new Date(String(localValue))\r\n : undefined;\r\n\r\n const isDateTime = schemaProperty?.format === \"date-time\";\r\n\r\n if (!handleDateChangeRef.current) {\r\n handleDateChangeRef.current = (date: Date) => {\r\n if (!datePickerMountedRef.current) {\r\n datePickerMountedRef.current = true;\r\n return;\r\n }\r\n\r\n if (schemaProperty?.format === \"date-time\") {\r\n handleChange(date?.toISOString());\r\n } else {\r\n const isoDate = date?.toISOString().split(\"T\")[0];\r\n handleChange(isoDate);\r\n }\r\n };\r\n }\r\n\r\n return (\r\n <ErrorWrapper error={validationError} mode={errorDisplayMode}>\r\n <DatePicker\r\n id={datePickerIdRef.current}\r\n showIcon={false}\r\n defaultValue={\r\n dateValue instanceof Date && !Number.isNaN(dateValue.getTime())\r\n ? dateValue\r\n : undefined\r\n }\r\n onChange={handleDateChangeRef.current}\r\n classNames={{\r\n dateInput: cn(\r\n \"shadow-none border-0 h-8! rounded-none\",\r\n validationError && \"border border-destructive\",\r\n ),\r\n }}\r\n useTime={isDateTime}\r\n />\r\n </ErrorWrapper>\r\n );\r\n }\r\n\r\n const inputType = schemaProperty?.format === \"email\" ? \"email\" : \"text\";\r\n\r\n return (\r\n <ErrorWrapper error={validationError} mode={errorDisplayMode}>\r\n <div className=\"w-full h-full flex items-center\">\r\n <Input\r\n ref={inputRef}\r\n type={inputType}\r\n value={String(localValue ?? \"\")}\r\n onChange={(e) => handleChange(e.target.value)}\r\n className={inputClassName}\r\n />\r\n </div>\r\n </ErrorWrapper>\r\n );\r\n }\r\n\r\n if (fieldName && customRenderers?.[fieldName]) {\r\n const customRenderer = customRenderers?.[fieldName]!;\r\n return (\r\n <>\r\n {customRenderer({\r\n value: localValue,\r\n row,\r\n column,\r\n onUpdate: handleChange,\r\n error: validationError || undefined,\r\n schemaProperty,\r\n t,\r\n })}\r\n </>\r\n );\r\n }\r\n if (value === null || value === undefined) {\r\n return (\r\n <span className={cn(\"text-muted-foreground italic\", className)}>—</span>\r\n );\r\n }\r\n\r\n if (schemaProperty?.type === \"boolean\" || typeof value === \"boolean\") {\r\n const yesLabel = t?.[\"cell.boolean.yes\"] ?? \"Yes\";\r\n const noLabel = t?.[\"cell.boolean.no\"] ?? \"No\";\r\n return (\r\n <Badge variant={value ? \"default\" : \"secondary\"} className={className}>\r\n {value ? yesLabel : noLabel}\r\n </Badge>\r\n );\r\n }\r\n\r\n if (\r\n schemaProperty?.format === \"date\" ||\r\n schemaProperty?.format === \"date-time\"\r\n ) {\r\n try {\r\n const date = value instanceof Date ? value : new Date(value as string);\r\n\r\n const defaultLocalization = localization || {\r\n locale: \"en-US\",\r\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\r\n lang: \"en\",\r\n };\r\n\r\n const defaultDateOptions =\r\n dateOptions ||\r\n (schemaProperty.format === \"date\"\r\n ? {\r\n day: \"2-digit\",\r\n month: \"short\",\r\n year: \"numeric\",\r\n }\r\n : {\r\n day: \"2-digit\",\r\n month: \"short\",\r\n year: \"numeric\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n hour12: false,\r\n });\r\n\r\n return (\r\n <DateTooltip\r\n date={date}\r\n localization={defaultLocalization}\r\n dateOptions={defaultDateOptions}\r\n />\r\n );\r\n } catch {\r\n return <span className={className}>{String(value)}</span>;\r\n }\r\n }\r\n\r\n if (schemaProperty?.enum && Array.isArray(schemaProperty.enum)) {\r\n const label = String(value);\r\n return (\r\n <Badge variant=\"outline\" className={cn(\"font-normal\", className)}>\r\n {t?.[`column.${fieldName}.${label}`] || label}\r\n </Badge>\r\n );\r\n }\r\n\r\n if (schemaProperty?.format === \"badge\") {\r\n const variant = BADGE_VARIANT_MAP[String(value).toLowerCase()] || \"outline\";\r\n const label = String(value);\r\n return (\r\n <Badge variant={variant} className={className}>\r\n {t?.[`column.${fieldName}.${label}`] || label}\r\n </Badge>\r\n );\r\n }\r\n\r\n if (schemaProperty?.format === \"uri\") {\r\n return (\r\n <a\r\n href={String(value)}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className={cn(\"text-primary hover:underline\", className)}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {String(value)}\r\n </a>\r\n );\r\n }\r\n\r\n if (schemaProperty?.format === \"uuid\") {\r\n const uuid = String(value);\r\n return (\r\n <code className={cn(\"text-xs bg-muted 5 rounded\", className)}>\r\n {uuid.slice(0, 8)}...\r\n </code>\r\n );\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n const arrayString = value.map((item) => String(item)).join(\", \");\r\n return <span className={className}>{arrayString}</span>;\r\n }\r\n\r\n if (typeof value === \"object\") {\r\n return (\r\n <code className={cn(\"text-xs bg-muted rounded\", className)}>\r\n {JSON.stringify(value)}\r\n </code>\r\n );\r\n }\r\n\r\n const strValue = String(value);\r\n\r\n if (strValue.length > MAX_STRING_LENGTH) {\r\n return (\r\n <span title={strValue} className={className}>\r\n {strValue.slice(0, MAX_STRING_LENGTH)}...\r\n </span>\r\n );\r\n }\r\n\r\n return <span className={className}>{strValue}</span>;\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { cn } from "@repo/ayasofyazilim-ui/lib/utils";
2
+ import { cn } from "@ayasofyazilim/ui/lib/utils";
3
3
  import { MoreHorizontal, Pencil, Save, X } from "lucide-react";
4
4
  import { useMemo } from "react";
5
5
  import { Button } from "../../../components/button";