@bsol-oss/react-datatable5 12.0.0-beta.20 → 12.0.0-beta.22

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.
package/dist/index.d.ts CHANGED
@@ -3,17 +3,17 @@ import { Row, RowData, OnChangeFn, Updater, FilterFn, ColumnDef, RowSelectionSta
3
3
  import * as React$1 from 'react';
4
4
  import React__default, { ReactNode, Dispatch, SetStateAction } from 'react';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
6
- import { ImageProps, TableRootProps, TableHeaderProps as TableHeaderProps$1, TableRowProps, GridProps, CardBodyProps, FlexProps, TextProps, BoxProps } from '@chakra-ui/react';
6
+ import { ImageProps, GridProps, TableRootProps, TableHeaderProps as TableHeaderProps$1, TableRowProps, CardBodyProps, FlexProps, TextProps, BoxProps } from '@chakra-ui/react';
7
7
  import { IconType } from 'react-icons';
8
8
  import * as react_i18next from 'react-i18next';
9
9
  import { UseTranslationResponse } from 'react-i18next';
10
10
  import { RankingInfo } from '@tanstack/match-sorter-utils';
11
11
  import { UseQueryResult } from '@tanstack/react-query';
12
12
  import { JSONSchema7 } from 'json-schema';
13
- import { ForeignKeyProps } from '@/components/Form/components/fields/StringInputField';
13
+ import { ForeignKeyProps as ForeignKeyProps$1 } from '@/components/Form/components/fields/StringInputField';
14
14
  import { AxiosRequestConfig } from 'axios';
15
15
  import * as react_hook_form from 'react-hook-form';
16
- import { FieldValues, UseFormReturn, SubmitHandler } from 'react-hook-form';
16
+ import { UseFormReturn, FieldValues, SubmitHandler } from 'react-hook-form';
17
17
  import { RenderProps, Props } from '@bsol-oss/dayzed-react19';
18
18
 
19
19
  interface DensityToggleButtonProps {
@@ -308,8 +308,9 @@ interface TableControlsProps {
308
308
  extraItems?: ReactNode;
309
309
  loading?: boolean;
310
310
  hasError?: boolean;
311
+ gridProps?: GridProps;
311
312
  }
312
- declare const TableControls: ({ fitTableWidth, fitTableHeight, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, showView, filterOptions, extraItems, loading, hasError, }: TableControlsProps) => react_jsx_runtime.JSX.Element;
313
+ declare const TableControls: ({ fitTableWidth, fitTableHeight, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, showView, filterOptions, extraItems, loading, hasError, gridProps, }: TableControlsProps) => react_jsx_runtime.JSX.Element;
313
314
 
314
315
  interface TableProps extends TableRootProps {
315
316
  showLoading?: boolean;
@@ -342,14 +343,10 @@ interface TableRowSelectorProps<TData> {
342
343
  declare const TableBody: ({ showSelector, alwaysShowSelector, canResize, }: TableBodyProps) => react_jsx_runtime.JSX.Element;
343
344
 
344
345
  interface TableFooterProps {
345
- pinnedBgColor?: {
346
- light: string;
347
- dark: string;
348
- };
349
346
  showSelector?: boolean;
350
347
  alwaysShowSelector?: boolean;
351
348
  }
352
- declare const TableFooter: ({ pinnedBgColor, showSelector, alwaysShowSelector, }: TableFooterProps) => react_jsx_runtime.JSX.Element;
349
+ declare const TableFooter: ({ showSelector, alwaysShowSelector, }: TableFooterProps) => react_jsx_runtime.JSX.Element;
353
350
 
354
351
  interface TableHeaderProps {
355
352
  canResize?: boolean;
@@ -448,8 +445,34 @@ declare const FilterOptions: ({ column }: FilterOptionsProps) => react_jsx_runti
448
445
 
449
446
  declare const GlobalFilter: () => react_jsx_runtime.JSX.Element;
450
447
 
448
+ interface ForeignKeyProps {
449
+ column: string;
450
+ table: string;
451
+ display_column: string;
452
+ }
453
+
454
+ interface CustomJSONSchema7 extends JSONSchema7 {
455
+ gridColumn?: string;
456
+ gridRow?: string;
457
+ foreign_key?: ForeignKeyProps;
458
+ variant?: string;
459
+ renderDisplay?: (item: unknown) => ReactNode;
460
+ inputRender?: (props: {
461
+ column: string;
462
+ schema: CustomJSONSchema7;
463
+ prefix: string;
464
+ formContext: UseFormReturn;
465
+ }) => ReactNode;
466
+ inputViewerRender?: (props: {
467
+ column: string;
468
+ schema: CustomJSONSchema7;
469
+ prefix: string;
470
+ formContext: UseFormReturn;
471
+ }) => ReactNode;
472
+ }
473
+
451
474
  interface FormRootProps<TData extends FieldValues> {
452
- schema: JSONSchema7;
475
+ schema: CustomJSONSchema7;
453
476
  serverUrl: string;
454
477
  requestUrl?: string;
455
478
  idMap: Record<string, object>;
@@ -472,7 +495,7 @@ interface CustomJSONSchema7Definition extends JSONSchema7 {
472
495
  display_column: string;
473
496
  gridColumn: string;
474
497
  gridRow: string;
475
- foreign_key: ForeignKeyProps;
498
+ foreign_key: ForeignKeyProps$1;
476
499
  children: ReactNode;
477
500
  }
478
501
  declare const idPickerSanityCheck: (column: string, foreign_key?: {
package/dist/index.js CHANGED
@@ -2457,7 +2457,7 @@ function ColumnCard({ columnId }) {
2457
2457
  onDrop: () => setDragging(false), // NEW
2458
2458
  });
2459
2459
  }, [columnId, table]);
2460
- return (jsxRuntime.jsxs(react.Grid, { ref: ref, templateColumns: "auto 1fr", gap: "0.5rem", alignItems: "center", style: dragging ? { opacity: 0.4 } : {}, children: [jsxRuntime.jsx(react.Flex, { alignItems: "center", padding: "0", cursor: "grab", children: jsxRuntime.jsx(fa6.FaGripLinesVertical, { color: "gray.400" }) }), jsxRuntime.jsx(react.Flex, { justifyContent: "space-between", alignItems: "center", children: jsxRuntime.jsx(CheckboxCard, { variant: "surface", label: displayName, checked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() }) })] }));
2460
+ return (jsxRuntime.jsxs(react.Grid, { ref: ref, templateColumns: "auto 1fr", gap: "0.5rem", alignItems: "center", style: dragging ? { opacity: 0.4 } : {}, children: [jsxRuntime.jsx(react.Flex, { alignItems: "center", padding: "0", cursor: "grab", children: jsxRuntime.jsx(fa6.FaGripLinesVertical, { color: "colorPalette.400" }) }), jsxRuntime.jsx(react.Flex, { justifyContent: "space-between", alignItems: "center", children: jsxRuntime.jsx(CheckboxCard, { variant: "surface", label: displayName, checked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() }) })] }));
2461
2461
  }
2462
2462
  function CardContainer({ location, children }) {
2463
2463
  const ref = React.useRef(null);
@@ -2589,7 +2589,7 @@ const RecordDisplay = ({ object, boxProps, translate, prefix = "", }) => {
2589
2589
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: "null" });
2590
2590
  }
2591
2591
  return (jsxRuntime.jsx(react.Grid, { rowGap: 1, padding: 1, overflow: "auto", ...boxProps, children: Object.entries(object).map(([field, value]) => {
2592
- return (jsxRuntime.jsxs(react.Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsxRuntime.jsx(react.Text, { color: "gray.400", children: getColumn({ field }) }), typeof value === "object" ? (jsxRuntime.jsx(RecordDisplay, { object: value, prefix: `${prefix}${field}.`, translate: translate })) : (jsxRuntime.jsx(react.Text, { children: JSON.stringify(value) }))] }, field));
2592
+ return (jsxRuntime.jsxs(react.Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsxRuntime.jsx(react.Text, { color: "colorPalette.400", children: getColumn({ field }) }), typeof value === "object" ? (jsxRuntime.jsx(RecordDisplay, { object: value, prefix: `${prefix}${field}.`, translate: translate })) : (jsxRuntime.jsx(react.Text, { children: JSON.stringify(value) }))] }, field));
2593
2593
  }) }));
2594
2594
  };
2595
2595
 
@@ -2639,7 +2639,7 @@ const CellRenderer = ({ cell }) => {
2639
2639
  paddingY: 2,
2640
2640
  }, object: value })] }, cell.id));
2641
2641
  }
2642
- return (jsxRuntime.jsxs(react.Box, { gridColumn, gridRow, children: [jsxRuntime.jsx(react.Box, { color: 'gray.400', children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(react.Box, { wordBreak: "break-word", textOverflow: "ellipsis", overflow: "hidden", children: `${formatValue(cell.getValue())}` })] }, cell.id));
2642
+ return (jsxRuntime.jsxs(react.Box, { gridColumn, gridRow, children: [jsxRuntime.jsx(react.Box, { color: "colorPalette.400", children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(react.Box, { wordBreak: "break-word", textOverflow: "ellipsis", overflow: "hidden", children: `${formatValue(cell.getValue())}` })] }, cell.id));
2643
2643
  };
2644
2644
  const DataDisplay = ({ variant = "" }) => {
2645
2645
  const { table, translate } = useDataTableContext();
@@ -2995,13 +2995,11 @@ const TableFilterTags = () => {
2995
2995
  }) }));
2996
2996
  };
2997
2997
 
2998
- const TableControls = ({ fitTableWidth = false, fitTableHeight = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, showView = true, filterOptions = [], extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), loading = false, hasError = false, }) => {
2998
+ const TableControls = ({ fitTableWidth = false, fitTableHeight = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, showView = true, filterOptions = [], extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), loading = false, hasError = false, gridProps = {}, }) => {
2999
2999
  const { translate } = useDataTableContext();
3000
- return (jsxRuntime.jsxs(react.Grid, { templateRows: "auto 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", children: [jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 2, children: [jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsx(react.Box, { children: showView && jsxRuntime.jsx(ViewDialog, { icon: jsxRuntime.jsx(md.MdOutlineViewColumn, {}) }) }), jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsxRuntime.jsx(react.Spinner, { size: "sm" }), hasError && (jsxRuntime.jsx(Tooltip, { content: translate.t("has_error"), children: jsxRuntime.jsx(react.Icon, { as: bs.BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsxRuntime.jsx(GlobalFilter, {}), showFilter && jsxRuntime.jsx(FilterDialog, {}), showReload && jsxRuntime.jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
3000
+ return (jsxRuntime.jsxs(react.Grid, { templateRows: "auto 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", ...gridProps, children: [jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 2, children: [jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsx(react.Box, { children: showView && jsxRuntime.jsx(ViewDialog, { icon: jsxRuntime.jsx(md.MdOutlineViewColumn, {}) }) }), jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsxRuntime.jsx(react.Spinner, { size: "sm" }), hasError && (jsxRuntime.jsx(Tooltip, { content: translate.t("has_error"), children: jsxRuntime.jsx(react.Icon, { as: bs.BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsxRuntime.jsx(GlobalFilter, {}), showFilter && jsxRuntime.jsx(FilterDialog, {}), showReload && jsxRuntime.jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
3001
3001
  return (jsxRuntime.jsxs(react.Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxRuntime.jsxs(react.Text, { children: [column, ":"] }), jsxRuntime.jsx(FilterOptions, { column: column })] }, column));
3002
- }) })), showFilterTags && (jsxRuntime.jsx(react.Flex, { children: jsxRuntime.jsx(TableFilterTags, {}) }))] }), jsxRuntime.jsx(react.Grid, { overflow: "auto", backgroundColor: "gray.50", _dark: {
3003
- backgroundColor: "gray.900",
3004
- }, children: children }), (showPageSizeControl || showPageCountText || showPagination) && (jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsxs(react.Flex, { gap: "1rem", alignItems: "center", children: [showPageSizeControl && jsxRuntime.jsx(PageSizeControl, {}), showPageCountText && (jsxRuntime.jsxs(react.Flex, { children: [jsxRuntime.jsx(react.Text, { paddingRight: "0.5rem", children: translate.t("rowcount.total") }), jsxRuntime.jsx(RowCountText, {})] }))] }), jsxRuntime.jsx(react.Box, { justifySelf: "end", children: showPagination && jsxRuntime.jsx(Pagination, {}) })] }))] }));
3002
+ }) })), showFilterTags && (jsxRuntime.jsx(react.Flex, { children: jsxRuntime.jsx(TableFilterTags, {}) }))] }), jsxRuntime.jsx(react.Grid, { overflow: "auto", bg: { base: "colorPalette.50", _dark: "colorPalette.950" }, children: children }), (showPageSizeControl || showPageCountText || showPagination) && (jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsxs(react.Flex, { gap: "1rem", alignItems: "center", children: [showPageSizeControl && jsxRuntime.jsx(PageSizeControl, {}), showPageCountText && (jsxRuntime.jsxs(react.Flex, { children: [jsxRuntime.jsx(react.Text, { paddingRight: "0.5rem", children: translate.t("rowcount.total") }), jsxRuntime.jsx(RowCountText, {})] }))] }), jsxRuntime.jsx(react.Box, { justifySelf: "end", children: showPagination && jsxRuntime.jsx(Pagination, {}) })] }))] }));
3005
3003
  };
3006
3004
 
3007
3005
  const EmptyState = React__namespace.forwardRef(function EmptyState(props, ref) {
@@ -3015,7 +3013,7 @@ const Table = ({ children, emptyComponent = EmptyResult, canResize = true, ...pr
3015
3013
  if (table.getRowModel().rows.length <= 0) {
3016
3014
  return emptyComponent;
3017
3015
  }
3018
- return (jsxRuntime.jsx(react.Table.Root, { stickyHeader: true, variant: "outline", width: canResize ? table.getCenterTotalSize() : undefined, display: "grid", alignContent: "start", overflowY: "auto", ...props, children: children }));
3016
+ return (jsxRuntime.jsx(react.Table.Root, { stickyHeader: true, variant: "outline", width: canResize ? table.getCenterTotalSize() : undefined, display: "grid", alignContent: "start", overflowY: "auto", bg: { base: "colorPalette.50", _dark: "colorPalette.950" }, ...props, children: children }));
3019
3017
  };
3020
3018
 
3021
3019
  const Checkbox = React__namespace.forwardRef(function Checkbox(props, ref) {
@@ -3079,7 +3077,7 @@ const TableRowSelector = ({ index, row, }) => {
3079
3077
  onCheckedChange: row.getToggleSelectedHandler() }) }));
3080
3078
  };
3081
3079
 
3082
- const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector = false, alwaysShowSelector = true, }) => {
3080
+ const TableFooter = ({ showSelector = false, alwaysShowSelector = true, }) => {
3083
3081
  const table = useDataTableContext().table;
3084
3082
  const SELECTION_BOX_WIDTH = 20;
3085
3083
  const [hoveredCheckBox, setHoveredCheckBox] = React.useState(false);
@@ -3098,41 +3096,11 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, s
3098
3096
  }
3099
3097
  return false;
3100
3098
  };
3101
- const getThProps = (header) => {
3102
- const thProps = header.column.getIsPinned()
3103
- ? {
3104
- left: showSelector
3105
- ? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
3106
- : `${header.getStart("left") + table.getDensityValue() * 2}px`,
3107
- background: pinnedBgColor.light,
3108
- position: "sticky",
3109
- zIndex: 1,
3110
- _dark: {
3111
- backgroundColor: pinnedBgColor.dark,
3112
- },
3113
- }
3114
- : {};
3115
- return thProps;
3116
- };
3117
- return (jsxRuntime.jsx(react.Table.Footer, { children: table.getFooterGroups().map((footerGroup) => (jsxRuntime.jsxs(react.Table.Row, { display: "flex", children: [showSelector && (jsxRuntime.jsxs(react.Table.Header
3118
- // styling resize and pinning start
3119
- , {
3120
- // styling resize and pinning start
3121
- padding: `${table.getDensityValue()}px`, ...(table.getIsSomeColumnsPinned("left")
3122
- ? {
3123
- left: `0px`,
3124
- backgroundColor: pinnedBgColor.light,
3125
- position: "sticky",
3126
- zIndex: 1,
3127
- _dark: { backgroundColor: pinnedBgColor.dark },
3128
- }
3129
- : {}),
3130
- // styling resize and pinning end
3131
- onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (jsxRuntime.jsx(react.Box, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: table.getIsAllRowsSelected(),
3099
+ return (jsxRuntime.jsx(react.Table.Footer, { children: table.getFooterGroups().map((footerGroup) => (jsxRuntime.jsxs(react.Table.Row, { display: "flex", children: [showSelector && (jsxRuntime.jsxs(react.Table.Header, { padding: `${table.getDensityValue()}px`, onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (jsxRuntime.jsx(react.Box, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: table.getIsAllRowsSelected(),
3132
3100
  // indeterminate: table.getIsSomeRowsSelected(),
3133
3101
  onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsxRuntime.jsx(react.Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] })), footerGroup.headers.map((header) => (jsxRuntime.jsx(react.Table.Cell, { padding: "0", columnSpan: `${header.colSpan}`,
3134
3102
  // styling resize and pinning start
3135
- maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: "grid", ...getThProps(header), children: jsxRuntime.jsx(react.MenuRoot, { children: jsxRuntime.jsx(react.MenuTrigger, { asChild: true, children: jsxRuntime.jsx(react.Box, { padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
3103
+ maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: "grid", children: jsxRuntime.jsx(react.MenuRoot, { children: jsxRuntime.jsx(react.MenuTrigger, { asChild: true, children: jsxRuntime.jsx(react.Box, { padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
3136
3104
  ? null
3137
3105
  : reactTable.flexRender(header.column.columnDef.footer, header.getContext()), jsxRuntime.jsx(react.Box, { children: header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.column.getIsSorted() === false && (
3138
3106
  // <UpDownIcon />
@@ -3158,7 +3126,7 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
3158
3126
  position: "sticky",
3159
3127
  top: 0,
3160
3128
  };
3161
- return (jsxRuntime.jsx(react.Table.Header, { ...(isSticky ? stickyProps : {}), ...tableHeaderProps, children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsxs(react.Table.Row, { display: "flex", ...tableRowProps, children: [showSelector && (jsxRuntime.jsx(react.Table.ColumnHeader, { padding: `${table.getDensityValue()}px`, display: "grid", color: {
3129
+ return (jsxRuntime.jsx(react.Table.Header, { ...(isSticky ? stickyProps : {}), bgColor: "transparent", ...tableHeaderProps, children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsxs(react.Table.Row, { display: "flex", bgColor: "transparent", ...tableRowProps, children: [showSelector && (jsxRuntime.jsx(react.Table.ColumnHeader, { padding: `${table.getDensityValue()}px`, display: "grid", color: {
3162
3130
  base: "colorPalette.900",
3163
3131
  _dark: "colorPalette.100",
3164
3132
  },
@@ -3176,10 +3144,20 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
3176
3144
  base: "colorPalette.800",
3177
3145
  _dark: "colorPalette.200",
3178
3146
  },
3179
- bg: { base: "colorPalette.100", _dark: "colorPalette.900" }, ...getThProps(header), children: [jsxRuntime.jsxs(MenuRoot, { children: [jsxRuntime.jsx(MenuTrigger, { asChild: true, children: jsxRuntime.jsx(react.Flex, { padding: `${table.getDensityValue()}px`, alignItems: "center", justifyContent: "start", borderRadius: "0rem", overflow: "auto", _hover: {
3180
- backgroundColor: "gray.100",
3181
- _dark: {
3182
- backgroundColor: "gray.700",
3147
+ bg: { base: "colorPalette.100", _dark: "colorPalette.900" }, ...getThProps(header), children: [jsxRuntime.jsxs(MenuRoot, { children: [jsxRuntime.jsx(MenuTrigger, { asChild: true, children: jsxRuntime.jsx(react.Flex, { padding: `${table.getDensityValue()}px`, alignItems: "center", justifyContent: "start", borderRadius: "0rem", overflow: "auto", color: {
3148
+ base: "colorPalette.800",
3149
+ _dark: "colorPalette.200",
3150
+ _hover: {
3151
+ base: "colorPalette.700",
3152
+ _dark: "colorPalette.300",
3153
+ },
3154
+ },
3155
+ bg: {
3156
+ base: "colorPalette.100",
3157
+ _dark: "colorPalette.900",
3158
+ _hover: {
3159
+ base: "colorPalette.200",
3160
+ _dark: "colorPalette.800",
3183
3161
  },
3184
3162
  }, children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
3185
3163
  ? null
@@ -3207,10 +3185,12 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
3207
3185
  });
3208
3186
  }, children: [jsxRuntime.jsx(gr.GrDescend, {}), "Sort Descending"] }) }), header.column.getIsSorted() && (jsxRuntime.jsx(MenuItem, { asChild: true, value: "sort-descend", children: jsxRuntime.jsxs(Button, { variant: "ghost", onClick: () => {
3209
3187
  header.column.clearSorting();
3210
- }, children: [jsxRuntime.jsx(md.MdClear, {}), "Clear Sorting"] }) }))] }))] })] }), canResize && (jsxRuntime.jsx(react.Box, { borderRight: "0.2rem solid", borderRightColor: header.column.getIsResizing() ? "gray.700" : "transparent", position: "relative", right: "0.1rem", width: "2px", height: "100%", userSelect: "none", style: { touchAction: "none" }, _hover: {
3188
+ }, children: [jsxRuntime.jsx(md.MdClear, {}), "Clear Sorting"] }) }))] }))] })] }), canResize && (jsxRuntime.jsx(react.Box, { borderRight: "0.2rem solid", borderRightColor: header.column.getIsResizing()
3189
+ ? "colorPalette.700"
3190
+ : "transparent", position: "relative", right: "0.1rem", width: "2px", height: "100%", userSelect: "none", style: { touchAction: "none" }, _hover: {
3211
3191
  borderRightColor: header.column.getIsResizing()
3212
- ? "gray.700"
3213
- : "gray.400",
3192
+ ? "colorPalette.700"
3193
+ : "colorPalette.400",
3214
3194
  }, ...resizeProps }))] }, `chakra-table-header-${header.id}`));
3215
3195
  })] }, `chakra-table-headergroup-${headerGroup.id}`))) }));
3216
3196
  };
@@ -3678,6 +3658,18 @@ const BooleanPicker = ({ schema, column, prefix }) => {
3678
3658
  } }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
3679
3659
  };
3680
3660
 
3661
+ const CustomInput = ({ column, schema, prefix }) => {
3662
+ const formContext = reactHookForm.useFormContext();
3663
+ const { inputRender } = schema;
3664
+ return (inputRender &&
3665
+ inputRender({
3666
+ column,
3667
+ schema,
3668
+ prefix,
3669
+ formContext,
3670
+ }));
3671
+ };
3672
+
3681
3673
  const monthNamesShort = [
3682
3674
  "Jan",
3683
3675
  "Feb",
@@ -3775,9 +3767,9 @@ const DatePicker = ({ column, schema, prefix }) => {
3775
3767
  const selectedDate = watch(colLabel);
3776
3768
  const formatedDate = dayjs(selectedDate).format("YYYY-MM-DD");
3777
3769
  return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
3778
- gridRow, children: [jsxRuntime.jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: jsxRuntime.jsx(Button, { size: "sm", variant: "outline", onClick: () => {
3770
+ gridRow, children: [jsxRuntime.jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: jsxRuntime.jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
3779
3771
  setOpen(true);
3780
- }, children: selectedDate !== undefined ? `${formatedDate}` : "" }) }), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsx(DatePicker$1
3772
+ }, justifyContent: "start", children: [jsxRuntime.jsx(md.MdDateRange, {}), selectedDate !== undefined ? `${formatedDate}` : ""] }) }), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsx(DatePicker$1
3781
3773
  // @ts-expect-error TODO: find appropriate types
3782
3774
  , {
3783
3775
  // @ts-expect-error TODO: find appropriate types
@@ -3802,7 +3794,7 @@ function filterArray(array, searchTerm) {
3802
3794
  const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
3803
3795
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
3804
3796
  const { translate } = useSchemaContext();
3805
- const { required } = schema;
3797
+ const { required, variant } = schema;
3806
3798
  const isRequired = required?.some((columnId) => columnId === column);
3807
3799
  const { gridColumn, gridRow, renderDisplay } = schema;
3808
3800
  const [searchText, setSearchText] = React.useState();
@@ -3819,6 +3811,22 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
3819
3811
  setSearchText(event.target.value);
3820
3812
  setLimit(10);
3821
3813
  };
3814
+ if (variant === "radio") {
3815
+ return (jsxRuntime.jsx(Field, { label: `${translate.t(removeIndex(`${column}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
3816
+ gridRow, children: jsxRuntime.jsx(react.RadioGroup.Root, { defaultValue: "1", children: jsxRuntime.jsx(react.HStack, { gap: "6", children: filterArray(dataList, searchText ?? "").map((item) => {
3817
+ return (jsxRuntime.jsxs(react.RadioGroup.Item, { onClick: () => {
3818
+ if (!isMultiple) {
3819
+ setOpenSearchResult(false);
3820
+ setValue(colLabel, item);
3821
+ return;
3822
+ }
3823
+ const newSet = new Set([...(watchEnums ?? []), item]);
3824
+ setValue(colLabel, [...newSet]);
3825
+ }, value: item, children: [jsxRuntime.jsx(react.RadioGroup.ItemHiddenInput, {}), jsxRuntime.jsx(react.RadioGroup.ItemIndicator, {}), jsxRuntime.jsx(react.RadioGroup.ItemText, { children: !!renderDisplay === true
3826
+ ? renderDisplay(item)
3827
+ : translate.t(removeIndex(`${colLabel}.${item}`)) })] }, `${colLabel}-${item}`));
3828
+ }) }) }) }));
3829
+ }
3822
3830
  return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
3823
3831
  gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
3824
3832
  const item = enumValue;
@@ -3834,7 +3842,7 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
3834
3842
  setOpenSearchResult(true);
3835
3843
  }, children: translate.t(removeIndex(`${colLabel}.add_more`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
3836
3844
  setOpenSearchResult(true);
3837
- }, children: watchEnum === undefined
3845
+ }, justifyContent: "start", children: watchEnum === undefined
3838
3846
  ? ""
3839
3847
  : translate.t(removeIndex(`${colLabel}.${watchEnum}`)) })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsxRuntime.jsx(react.Input, { placeholder: translate.t(`${column}.type_to_search`), onChange: (event) => {
3840
3848
  onSearchChange(event);
@@ -3851,7 +3859,7 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
3851
3859
  }
3852
3860
  const newSet = new Set([...(watchEnums ?? []), item]);
3853
3861
  setValue(colLabel, [...newSet]);
3854
- }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
3862
+ }, ...(selected ? { color: "colorPalette.400/50" } : {}), children: !!renderDisplay === true
3855
3863
  ? renderDisplay(item)
3856
3864
  : translate.t(removeIndex(`${colLabel}.${item}`)) }, `${colLabel}-${item}`));
3857
3865
  }) }), isDirty && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: dataList.length <= 0 && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: translate.t(removeIndex(`${colLabel}.empty_search_result`)) })) }))] })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
@@ -4206,7 +4214,7 @@ const FileDropzone = ({ children = undefined, gridProps = {}, onDrop = () => { }
4206
4214
  const filesArray = [...event.target.files];
4207
4215
  onDrop({ files: filesArray });
4208
4216
  };
4209
- return (jsxRuntime.jsxs(react.Grid, { ...getColor(isDraggedOver), ref: ref, cursor: "pointer", onClick: handleClick, borderStyle: "dashed", borderColor: "gray.400", alignContent: "center", justifyContent: "center", borderWidth: 1, borderRadius: 4, ...gridProps, children: [children, !!children === false && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(react.Flex, { children: placeholder }), jsxRuntime.jsx(react.Input, { type: "file", multiple: true, style: { display: "none" }, ref: fileInput, onChange: handleChange })] }))] }));
4217
+ return (jsxRuntime.jsxs(react.Grid, { ...getColor(isDraggedOver), ref: ref, cursor: "pointer", onClick: handleClick, borderStyle: "dashed", borderColor: "colorPalette.400", alignContent: "center", justifyContent: "center", borderWidth: 1, borderRadius: 4, ...gridProps, children: [children, !!children === false && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(react.Flex, { children: placeholder }), jsxRuntime.jsx(react.Input, { type: "file", multiple: true, style: { display: "none" }, ref: fileInput, onChange: handleChange })] }))] }));
4210
4218
  };
4211
4219
 
4212
4220
  const FilePicker = ({ column, schema, prefix }) => {
@@ -4224,7 +4232,7 @@ const FilePicker = ({ column, schema, prefix }) => {
4224
4232
  setValue(column, currentFiles.filter(({ name }) => {
4225
4233
  return name !== file.name;
4226
4234
  }));
4227
- }, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
4235
+ }, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [file.type.startsWith("image/") && (jsxRuntime.jsx(react.Image, { src: URL.createObjectURL(file), alt: file.name, boxSize: "50px", objectFit: "cover", borderRadius: "md", marginRight: "2" })), jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
4228
4236
  }) }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
4229
4237
  };
4230
4238
 
@@ -4357,7 +4365,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
4357
4365
  setOpenSearchResult(true);
4358
4366
  }, children: translate.t(removeIndex(`${colLabel}.add_more`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
4359
4367
  setOpenSearchResult(true);
4360
- }, children: getPickedValue() })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsxRuntime.jsx(react.Input, { placeholder: translate.t(removeIndex(`${colLabel}.typeToSearch`)), onChange: (event) => {
4368
+ }, justifyContent: "start", children: getPickedValue() })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsxRuntime.jsx(react.Input, { placeholder: translate.t(removeIndex(`${colLabel}.typeToSearch`)), onChange: (event) => {
4361
4369
  onSearchChange(event);
4362
4370
  setOpenSearchResult(true);
4363
4371
  }, autoComplete: "off", ref: ref }), jsxRuntime.jsx(PopoverTitle, {}), (searchText?.length ?? 0) > 0 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [isFetching && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isFetching" }), isLoading && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isLoading" }), isPending && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isPending" }), (isFetching || isLoading || isPending) && jsxRuntime.jsx(react.Spinner, {}), isError && (jsxRuntime.jsx(react.Icon, { color: "red.400", children: jsxRuntime.jsx(bi.BiError, {}) })), jsxRuntime.jsx(react.Text, { justifySelf: "center", children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit}` }), jsxRuntime.jsxs(react.Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsxRuntime.jsx(react.Flex, { flexFlow: "column wrap", children:
@@ -4377,7 +4385,9 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
4377
4385
  item[column_ref],
4378
4386
  ]);
4379
4387
  setValue(colLabel, [...newSet]);
4380
- }, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
4388
+ }, opacity: 0.7, _hover: { opacity: 1 }, ...(selected
4389
+ ? { color: "colorPalette.400/50" }
4390
+ : {}), children: !!renderDisplay === true
4381
4391
  ? renderDisplay(item)
4382
4392
  : item[display_column] }, item[column_ref]));
4383
4393
  }) }), isDirty && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: dataList.length <= 0 && (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.empty_search_result`)) })) }))] }), jsxRuntime.jsx(PaginationRoot, { justifySelf: "center", count: count, pageSize: 10, defaultPage: 1, page: page + 1, onPageChange: (e) => setPage(e.page - 1), children: jsxRuntime.jsxs(react.HStack, { gap: "4", children: [jsxRuntime.jsx(PaginationPrevTrigger, {}), count > 0 && jsxRuntime.jsx(PaginationPageText, {}), jsxRuntime.jsx(PaginationNextTrigger, {})] }) })] }))] }) })] }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
@@ -4577,9 +4587,115 @@ const TagPicker = ({ column, schema, prefix }) => {
4577
4587
  }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
4578
4588
  };
4579
4589
 
4590
+ function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem, meridiemLabel = {
4591
+ am: "am",
4592
+ pm: "pm",
4593
+ }, onChange = () => { }, }) {
4594
+ const hours = Array.from({ length: 12 }, (_, i) => {
4595
+ const hour = i + 1;
4596
+ return hour.toString().padStart(2, "0");
4597
+ });
4598
+ const minutes = Array.from({ length: 60 }, (_, i) => {
4599
+ return i.toString().padStart(2, "0");
4600
+ });
4601
+ const hoursCollection = react.createListCollection({
4602
+ items: hours.map((hour) => ({
4603
+ value: hour,
4604
+ label: hour,
4605
+ })),
4606
+ });
4607
+ const minutesCollection = react.createListCollection({
4608
+ items: minutes.map((hour) => ({
4609
+ value: hour,
4610
+ label: hour,
4611
+ })),
4612
+ });
4613
+ const meridiemsCollection = react.createListCollection({
4614
+ items: ["am", "pm"].map((hour) => ({
4615
+ value: hour,
4616
+ label: meridiemLabel[hour] ?? hour,
4617
+ })),
4618
+ });
4619
+ return (jsxRuntime.jsxs(react.Grid, { templateColumns: "auto auto", gap: "4", children: [jsxRuntime.jsxs(react.Flex, { justifyContent: "center", alignItems: "center", gap: "2", children: [jsxRuntime.jsxs(react.Select.Root, { value: [`${hour.toString().padStart(2, "0")}`], onValueChange: (e) => {
4620
+ setHour(parseInt(e.value[0]));
4621
+ onChange({ hour: parseInt(e.value[0]), minute, meridiem });
4622
+ }, collection: hoursCollection, positioning: { sameWidth: true, placement: "bottom" }, children: [jsxRuntime.jsx(react.Select.HiddenSelect, {}), jsxRuntime.jsx(react.Select.Control, { children: jsxRuntime.jsx(react.Select.Trigger, { children: jsxRuntime.jsx(react.Select.ValueText, { placeholder: "Hour" }) }) }), jsxRuntime.jsx(react.Select.Positioner, { children: jsxRuntime.jsx(react.Select.Content, { width: "full", children: hoursCollection.items.map(({ value: hour }) => (jsxRuntime.jsxs(react.Select.Item, { item: hour, children: [hour, jsxRuntime.jsx(react.Select.ItemIndicator, {})] }, hour))) }) })] }), jsxRuntime.jsx(react.Text, { children: ":" }), jsxRuntime.jsxs(react.Select.Root, { value: [`${minute.toString().padStart(2, "0")}`], onValueChange: (e) => {
4623
+ setMinute(parseInt(e.value[0]));
4624
+ onChange({ hour, minute: parseInt(e.value[0]), meridiem });
4625
+ }, collection: minutesCollection, positioning: { sameWidth: true, placement: "bottom" }, children: [jsxRuntime.jsx(react.Select.HiddenSelect, {}), jsxRuntime.jsx(react.Select.Control, { children: jsxRuntime.jsx(react.Select.Trigger, { children: jsxRuntime.jsx(react.Select.ValueText, { placeholder: "Minute" }) }) }), jsxRuntime.jsx(react.Select.Positioner, { children: jsxRuntime.jsx(react.Select.Content, { width: "full", children: minutes.map((minute) => (jsxRuntime.jsxs(react.Select.Item, { item: minute, children: [minute, jsxRuntime.jsx(react.Select.ItemIndicator, {})] }, minute))) }) })] })] }), jsxRuntime.jsxs(react.Select.Root, { value: [meridiem], onValueChange: (e) => {
4626
+ setMeridiem(e.value[0]);
4627
+ onChange({ hour, minute, meridiem: e.value[0] });
4628
+ }, collection: meridiemsCollection, positioning: { sameWidth: true, placement: "bottom" }, children: [jsxRuntime.jsx(react.Select.HiddenSelect, {}), jsxRuntime.jsx(react.Select.Control, { children: jsxRuntime.jsx(react.Select.Trigger, { children: jsxRuntime.jsx(react.Select.ValueText, { placeholder: "am/pm" }) }) }), jsxRuntime.jsx(react.Select.Positioner, { children: jsxRuntime.jsx(react.Select.Content, { width: "full", children: meridiemsCollection.items.map(({ value: hour, label }) => (jsxRuntime.jsxs(react.Select.Item, { item: hour, children: [label, jsxRuntime.jsx(react.Select.ItemIndicator, {})] }, hour))) }) })] })] }));
4629
+ }
4630
+
4631
+ const TimePicker = ({ column, schema, prefix }) => {
4632
+ const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
4633
+ const { translate } = useSchemaContext();
4634
+ const { required, gridColumn, gridRow } = schema;
4635
+ const isRequired = required?.some((columnId) => columnId === column);
4636
+ const colLabel = `${prefix}${column}`;
4637
+ const [open, setOpen] = React.useState(false);
4638
+ const value = watch(colLabel);
4639
+ const formatedTime = dayjs(value).format("hh:mm A");
4640
+ // Parse the initial time parts from the ISO time string (HH:mm:ss)
4641
+ const parseTime = (isoTime) => {
4642
+ if (!isoTime)
4643
+ return { hour: 12, minute: 0, meridiem: "am" };
4644
+ const parsed = dayjs(isoTime);
4645
+ if (!parsed.isValid())
4646
+ return { hour: 12, minute: 0, meridiem: "am" };
4647
+ let hour = parsed.hour();
4648
+ const minute = parsed.minute();
4649
+ const meridiem = hour >= 12 ? "pm" : "am";
4650
+ if (hour === 0)
4651
+ hour = 12;
4652
+ else if (hour > 12)
4653
+ hour -= 12;
4654
+ return { hour, minute, meridiem };
4655
+ };
4656
+ const initialTime = parseTime(value);
4657
+ const [hour, setHour] = React.useState(initialTime.hour);
4658
+ const [minute, setMinute] = React.useState(initialTime.minute);
4659
+ const [meridiem, setMeridiem] = React.useState(initialTime.meridiem);
4660
+ React.useEffect(() => {
4661
+ const { hour, minute, meridiem } = parseTime(value);
4662
+ setHour(hour);
4663
+ setMinute(minute);
4664
+ setMeridiem(meridiem);
4665
+ }, [value]);
4666
+ // Convert hour, minute, meridiem to 24-hour ISO time string
4667
+ const toIsoTime = (hour, minute, meridiem) => {
4668
+ let h = hour;
4669
+ if (meridiem === "am" && hour === 12)
4670
+ h = 0;
4671
+ else if (meridiem === "pm" && hour < 12)
4672
+ h = hour + 12;
4673
+ return dayjs().hour(h).minute(minute).second(0).toISOString();
4674
+ };
4675
+ // Handle changes to time parts
4676
+ const handleTimeChange = ({ hour: newHour, minute: newMinute, meridiem: newMeridiem, }) => {
4677
+ setHour(newHour);
4678
+ setMinute(newMinute);
4679
+ setMeridiem(newMeridiem);
4680
+ const isoTime = toIsoTime(newHour, newMinute, newMeridiem);
4681
+ setValue(colLabel, isoTime, { shouldValidate: true, shouldDirty: true });
4682
+ };
4683
+ const containerRef = React.useRef(null);
4684
+ return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
4685
+ gridRow, children: [jsxRuntime.jsxs(react.Popover.Root, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsxRuntime.jsx(react.Popover.Trigger, { asChild: true, children: jsxRuntime.jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
4686
+ setOpen(true);
4687
+ }, justifyContent: "start", children: [jsxRuntime.jsx(io.IoMdClock, {}), value !== undefined ? `${formatedTime}` : ""] }) }), jsxRuntime.jsx(react.Portal, { children: jsxRuntime.jsx(react.Popover.Positioner, { children: jsxRuntime.jsx(react.Popover.Content, { ref: containerRef, children: jsxRuntime.jsx(react.Popover.Body, { children: jsxRuntime.jsx(TimePicker$1, { hour: hour, setHour: setHour, minute: minute, setMinute: setMinute, meridiem: meridiem, setMeridiem: setMeridiem, onChange: handleTimeChange, meridiemLabel: {
4688
+ am: translate.t(removeIndex(`${colLabel}.am`)),
4689
+ pm: translate.t(removeIndex(`${colLabel}.pm`)),
4690
+ } }) }) }) }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
4691
+ };
4692
+
4580
4693
  const SchemaRenderer = ({ schema, prefix, column, }) => {
4581
4694
  const colSchema = schema;
4582
4695
  const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
4696
+ if (variant === "custom-input") {
4697
+ return jsxRuntime.jsx(CustomInput, { schema: colSchema, prefix, column });
4698
+ }
4583
4699
  if (type === "string") {
4584
4700
  if ((schema.enum ?? []).length > 0) {
4585
4701
  return jsxRuntime.jsx(EnumPicker, { schema: colSchema, prefix, column });
@@ -4591,6 +4707,9 @@ const SchemaRenderer = ({ schema, prefix, column, }) => {
4591
4707
  if (variant === "date-picker") {
4592
4708
  return jsxRuntime.jsx(DatePicker, { schema: colSchema, prefix, column });
4593
4709
  }
4710
+ if (variant === "time-picker") {
4711
+ return jsxRuntime.jsx(TimePicker, { schema: colSchema, prefix, column });
4712
+ }
4594
4713
  return jsxRuntime.jsx(StringInputField, { schema: colSchema, prefix, column });
4595
4714
  }
4596
4715
  if (type === "number" || type === "integer") {
@@ -4694,22 +4813,15 @@ const EnumViewer = ({ column, isMultiple = false, schema, prefix, }) => {
4694
4813
  };
4695
4814
 
4696
4815
  const FileViewer = ({ column, schema, prefix }) => {
4697
- const { setValue, formState: { errors }, watch, } = reactHookForm.useFormContext();
4816
+ const { watch } = reactHookForm.useFormContext();
4698
4817
  const { translate } = useSchemaContext();
4699
4818
  const { required, gridColumn, gridRow } = schema;
4700
4819
  const isRequired = required?.some((columnId) => columnId === column);
4701
4820
  const currentFiles = (watch(column) ?? []);
4702
4821
  const colLabel = `${prefix}${column}`;
4703
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${colLabel}.field_label`)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", display: "grid", gridTemplateRows: "auto 1fr auto", alignItems: "stretch", children: [jsxRuntime.jsx(FileDropzone, { onDrop: ({ files }) => {
4704
- const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
4705
- setValue(colLabel, [...currentFiles, ...newFiles]);
4706
- }, placeholder: translate.t(`${colLabel}.fileDropzone`) }), jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
4707
- return (jsxRuntime.jsx(react.Card.Root, { variant: "subtle", children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", cursor: "pointer", onClick: () => {
4708
- setValue(column, currentFiles.filter(({ name }) => {
4709
- return name !== file.name;
4710
- }));
4711
- }, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
4712
- }) }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
4822
+ return (jsxRuntime.jsx(Field, { label: `${translate.t(`${colLabel}.field_label`)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", display: "grid", gridTemplateRows: "auto 1fr auto", alignItems: "stretch", children: jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
4823
+ return (jsxRuntime.jsx(react.Card.Root, { variant: "subtle", children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [file.type.startsWith("image/") && (jsxRuntime.jsx(react.Image, { src: URL.createObjectURL(file), alt: file.name, boxSize: "50px", objectFit: "cover", borderRadius: "md", marginRight: "2" })), jsxRuntime.jsx(react.Box, { children: file.name })] }) }, file.name));
4824
+ }) }) }));
4713
4825
  };
4714
4826
 
4715
4827
  const IdViewer = ({ column, schema, prefix, isMultiple = false, }) => {
@@ -4918,9 +5030,24 @@ const StringViewer = ({ column, schema, prefix, }) => {
4918
5030
  return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsxRuntime.jsx(react.Text, { children: value }), errors[colLabel] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }) }));
4919
5031
  };
4920
5032
 
5033
+ const CustomViewer = ({ column, schema, prefix }) => {
5034
+ const formContext = reactHookForm.useFormContext();
5035
+ const { inputViewerRender } = schema;
5036
+ return (inputViewerRender &&
5037
+ inputViewerRender({
5038
+ column,
5039
+ schema,
5040
+ prefix,
5041
+ formContext,
5042
+ }));
5043
+ };
5044
+
4921
5045
  const SchemaViewer = ({ schema, prefix, column, }) => {
4922
5046
  const colSchema = schema;
4923
5047
  const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
5048
+ if (variant === "custom-input") {
5049
+ return jsxRuntime.jsx(CustomViewer, { schema: colSchema, prefix, column });
5050
+ }
4924
5051
  if (type === "string") {
4925
5052
  if ((schema.enum ?? []).length > 0) {
4926
5053
  return jsxRuntime.jsx(EnumViewer, { schema: colSchema, prefix, column });
package/dist/index.mjs CHANGED
@@ -1,16 +1,16 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, Flex, Text, useDisclosure, DialogBackdrop, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Tag as Tag$1, Input, Menu, createRecipeContext, createContext as createContext$1, Pagination as Pagination$1, usePaginationContext, CheckboxCard as CheckboxCard$1, Image, EmptyState as EmptyState$2, VStack, Alert, Card, Tooltip as Tooltip$1, Group, InputElement, Icon, List, Table as Table$1, Checkbox as Checkbox$1, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, Accordion, Field as Field$1, Popover, NumberInput, Show, RadioCard, CheckboxGroup, Center, Heading } from '@chakra-ui/react';
2
+ import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, Flex, Text, useDisclosure, DialogBackdrop, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Tag as Tag$1, Input, Menu, createRecipeContext, createContext as createContext$1, Pagination as Pagination$1, usePaginationContext, CheckboxCard as CheckboxCard$1, Image, EmptyState as EmptyState$2, VStack, Alert, Card, Tooltip as Tooltip$1, Group, InputElement, Icon, List, Table as Table$1, Checkbox as Checkbox$1, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, Accordion, Field as Field$1, Popover, NumberInput, Show, RadioCard, CheckboxGroup, createListCollection, Select, Center, Heading } from '@chakra-ui/react';
3
3
  import { AiOutlineColumnWidth } from 'react-icons/ai';
4
4
  import * as React from 'react';
5
5
  import React__default, { createContext, useContext, useState, useEffect, useRef } from 'react';
6
6
  import { LuX, LuCheck, LuChevronRight, LuChevronDown } from 'react-icons/lu';
7
- import { MdOutlineSort, MdFilterAlt, MdSearch, MdClose, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdOutlineChecklist } from 'react-icons/md';
7
+ import { MdOutlineSort, MdFilterAlt, MdSearch, MdClose, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdOutlineChecklist, MdDateRange } from 'react-icons/md';
8
8
  import { FaUpDown, FaGripLinesVertical } from 'react-icons/fa6';
9
9
  import { BiDownArrow, BiUpArrow, BiError } from 'react-icons/bi';
10
10
  import { CgClose } from 'react-icons/cg';
11
11
  import Dayzed from '@bsol-oss/dayzed-react19';
12
12
  import { HiMiniEllipsisHorizontal, HiChevronLeft, HiChevronRight } from 'react-icons/hi2';
13
- import { IoMdEye, IoMdCheckbox } from 'react-icons/io';
13
+ import { IoMdEye, IoMdCheckbox, IoMdClock } from 'react-icons/io';
14
14
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
15
15
  import { bind, bindAll } from 'bind-event-listener';
16
16
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
@@ -2437,7 +2437,7 @@ function ColumnCard({ columnId }) {
2437
2437
  onDrop: () => setDragging(false), // NEW
2438
2438
  });
2439
2439
  }, [columnId, table]);
2440
- return (jsxs(Grid, { ref: ref, templateColumns: "auto 1fr", gap: "0.5rem", alignItems: "center", style: dragging ? { opacity: 0.4 } : {}, children: [jsx(Flex, { alignItems: "center", padding: "0", cursor: "grab", children: jsx(FaGripLinesVertical, { color: "gray.400" }) }), jsx(Flex, { justifyContent: "space-between", alignItems: "center", children: jsx(CheckboxCard, { variant: "surface", label: displayName, checked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() }) })] }));
2440
+ return (jsxs(Grid, { ref: ref, templateColumns: "auto 1fr", gap: "0.5rem", alignItems: "center", style: dragging ? { opacity: 0.4 } : {}, children: [jsx(Flex, { alignItems: "center", padding: "0", cursor: "grab", children: jsx(FaGripLinesVertical, { color: "colorPalette.400" }) }), jsx(Flex, { justifyContent: "space-between", alignItems: "center", children: jsx(CheckboxCard, { variant: "surface", label: displayName, checked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() }) })] }));
2441
2441
  }
2442
2442
  function CardContainer({ location, children }) {
2443
2443
  const ref = useRef(null);
@@ -2569,7 +2569,7 @@ const RecordDisplay = ({ object, boxProps, translate, prefix = "", }) => {
2569
2569
  return jsx(Fragment, { children: "null" });
2570
2570
  }
2571
2571
  return (jsx(Grid, { rowGap: 1, padding: 1, overflow: "auto", ...boxProps, children: Object.entries(object).map(([field, value]) => {
2572
- return (jsxs(Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsx(Text, { color: "gray.400", children: getColumn({ field }) }), typeof value === "object" ? (jsx(RecordDisplay, { object: value, prefix: `${prefix}${field}.`, translate: translate })) : (jsx(Text, { children: JSON.stringify(value) }))] }, field));
2572
+ return (jsxs(Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsx(Text, { color: "colorPalette.400", children: getColumn({ field }) }), typeof value === "object" ? (jsx(RecordDisplay, { object: value, prefix: `${prefix}${field}.`, translate: translate })) : (jsx(Text, { children: JSON.stringify(value) }))] }, field));
2573
2573
  }) }));
2574
2574
  };
2575
2575
 
@@ -2619,7 +2619,7 @@ const CellRenderer = ({ cell }) => {
2619
2619
  paddingY: 2,
2620
2620
  }, object: value })] }, cell.id));
2621
2621
  }
2622
- return (jsxs(Box, { gridColumn, gridRow, children: [jsx(Box, { color: 'gray.400', children: getLabel({ columnId: cell.column.id }) }), jsx(Box, { wordBreak: "break-word", textOverflow: "ellipsis", overflow: "hidden", children: `${formatValue(cell.getValue())}` })] }, cell.id));
2622
+ return (jsxs(Box, { gridColumn, gridRow, children: [jsx(Box, { color: "colorPalette.400", children: getLabel({ columnId: cell.column.id }) }), jsx(Box, { wordBreak: "break-word", textOverflow: "ellipsis", overflow: "hidden", children: `${formatValue(cell.getValue())}` })] }, cell.id));
2623
2623
  };
2624
2624
  const DataDisplay = ({ variant = "" }) => {
2625
2625
  const { table, translate } = useDataTableContext();
@@ -2975,13 +2975,11 @@ const TableFilterTags = () => {
2975
2975
  }) }));
2976
2976
  };
2977
2977
 
2978
- const TableControls = ({ fitTableWidth = false, fitTableHeight = false, children = jsx(Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, showView = true, filterOptions = [], extraItems = jsx(Fragment, {}), loading = false, hasError = false, }) => {
2978
+ const TableControls = ({ fitTableWidth = false, fitTableHeight = false, children = jsx(Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, showView = true, filterOptions = [], extraItems = jsx(Fragment, {}), loading = false, hasError = false, gridProps = {}, }) => {
2979
2979
  const { translate } = useDataTableContext();
2980
- return (jsxs(Grid, { templateRows: "auto 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", children: [jsxs(Flex, { flexFlow: "column", gap: 2, children: [jsxs(Flex, { justifyContent: "space-between", children: [jsx(Box, { children: showView && jsx(ViewDialog, { icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { content: translate.t("has_error"), children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsx(GlobalFilter, {}), showFilter && jsx(FilterDialog, {}), showReload && jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsx(Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
2980
+ return (jsxs(Grid, { templateRows: "auto 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", ...gridProps, children: [jsxs(Flex, { flexFlow: "column", gap: 2, children: [jsxs(Flex, { justifyContent: "space-between", children: [jsx(Box, { children: showView && jsx(ViewDialog, { icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { content: translate.t("has_error"), children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsx(GlobalFilter, {}), showFilter && jsx(FilterDialog, {}), showReload && jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsx(Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
2981
2981
  return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(FilterOptions, { column: column })] }, column));
2982
- }) })), showFilterTags && (jsx(Flex, { children: jsx(TableFilterTags, {}) }))] }), jsx(Grid, { overflow: "auto", backgroundColor: "gray.50", _dark: {
2983
- backgroundColor: "gray.900",
2984
- }, children: children }), (showPageSizeControl || showPageCountText || showPagination) && (jsxs(Flex, { justifyContent: "space-between", children: [jsxs(Flex, { gap: "1rem", alignItems: "center", children: [showPageSizeControl && jsx(PageSizeControl, {}), showPageCountText && (jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: translate.t("rowcount.total") }), jsx(RowCountText, {})] }))] }), jsx(Box, { justifySelf: "end", children: showPagination && jsx(Pagination, {}) })] }))] }));
2982
+ }) })), showFilterTags && (jsx(Flex, { children: jsx(TableFilterTags, {}) }))] }), jsx(Grid, { overflow: "auto", bg: { base: "colorPalette.50", _dark: "colorPalette.950" }, children: children }), (showPageSizeControl || showPageCountText || showPagination) && (jsxs(Flex, { justifyContent: "space-between", children: [jsxs(Flex, { gap: "1rem", alignItems: "center", children: [showPageSizeControl && jsx(PageSizeControl, {}), showPageCountText && (jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: translate.t("rowcount.total") }), jsx(RowCountText, {})] }))] }), jsx(Box, { justifySelf: "end", children: showPagination && jsx(Pagination, {}) })] }))] }));
2985
2983
  };
2986
2984
 
2987
2985
  const EmptyState = React.forwardRef(function EmptyState(props, ref) {
@@ -2995,7 +2993,7 @@ const Table = ({ children, emptyComponent = EmptyResult, canResize = true, ...pr
2995
2993
  if (table.getRowModel().rows.length <= 0) {
2996
2994
  return emptyComponent;
2997
2995
  }
2998
- return (jsx(Table$1.Root, { stickyHeader: true, variant: "outline", width: canResize ? table.getCenterTotalSize() : undefined, display: "grid", alignContent: "start", overflowY: "auto", ...props, children: children }));
2996
+ return (jsx(Table$1.Root, { stickyHeader: true, variant: "outline", width: canResize ? table.getCenterTotalSize() : undefined, display: "grid", alignContent: "start", overflowY: "auto", bg: { base: "colorPalette.50", _dark: "colorPalette.950" }, ...props, children: children }));
2999
2997
  };
3000
2998
 
3001
2999
  const Checkbox = React.forwardRef(function Checkbox(props, ref) {
@@ -3059,7 +3057,7 @@ const TableRowSelector = ({ index, row, }) => {
3059
3057
  onCheckedChange: row.getToggleSelectedHandler() }) }));
3060
3058
  };
3061
3059
 
3062
- const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector = false, alwaysShowSelector = true, }) => {
3060
+ const TableFooter = ({ showSelector = false, alwaysShowSelector = true, }) => {
3063
3061
  const table = useDataTableContext().table;
3064
3062
  const SELECTION_BOX_WIDTH = 20;
3065
3063
  const [hoveredCheckBox, setHoveredCheckBox] = useState(false);
@@ -3078,41 +3076,11 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, s
3078
3076
  }
3079
3077
  return false;
3080
3078
  };
3081
- const getThProps = (header) => {
3082
- const thProps = header.column.getIsPinned()
3083
- ? {
3084
- left: showSelector
3085
- ? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
3086
- : `${header.getStart("left") + table.getDensityValue() * 2}px`,
3087
- background: pinnedBgColor.light,
3088
- position: "sticky",
3089
- zIndex: 1,
3090
- _dark: {
3091
- backgroundColor: pinnedBgColor.dark,
3092
- },
3093
- }
3094
- : {};
3095
- return thProps;
3096
- };
3097
- return (jsx(Table$1.Footer, { children: table.getFooterGroups().map((footerGroup) => (jsxs(Table$1.Row, { display: "flex", children: [showSelector && (jsxs(Table$1.Header
3098
- // styling resize and pinning start
3099
- , {
3100
- // styling resize and pinning start
3101
- padding: `${table.getDensityValue()}px`, ...(table.getIsSomeColumnsPinned("left")
3102
- ? {
3103
- left: `0px`,
3104
- backgroundColor: pinnedBgColor.light,
3105
- position: "sticky",
3106
- zIndex: 1,
3107
- _dark: { backgroundColor: pinnedBgColor.dark },
3108
- }
3109
- : {}),
3110
- // styling resize and pinning end
3111
- onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (jsx(Box, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: table.getIsAllRowsSelected(),
3079
+ return (jsx(Table$1.Footer, { children: table.getFooterGroups().map((footerGroup) => (jsxs(Table$1.Row, { display: "flex", children: [showSelector && (jsxs(Table$1.Header, { padding: `${table.getDensityValue()}px`, onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (jsx(Box, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: table.getIsAllRowsSelected(),
3112
3080
  // indeterminate: table.getIsSomeRowsSelected(),
3113
3081
  onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] })), footerGroup.headers.map((header) => (jsx(Table$1.Cell, { padding: "0", columnSpan: `${header.colSpan}`,
3114
3082
  // styling resize and pinning start
3115
- maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: "grid", ...getThProps(header), children: jsx(MenuRoot$1, { children: jsx(MenuTrigger$1, { asChild: true, children: jsx(Box, { padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxs(Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
3083
+ maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: "grid", children: jsx(MenuRoot$1, { children: jsx(MenuTrigger$1, { asChild: true, children: jsx(Box, { padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", children: jsxs(Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
3116
3084
  ? null
3117
3085
  : flexRender(header.column.columnDef.footer, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false && (
3118
3086
  // <UpDownIcon />
@@ -3138,7 +3106,7 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
3138
3106
  position: "sticky",
3139
3107
  top: 0,
3140
3108
  };
3141
- return (jsx(Table$1.Header, { ...(isSticky ? stickyProps : {}), ...tableHeaderProps, children: table.getHeaderGroups().map((headerGroup) => (jsxs(Table$1.Row, { display: "flex", ...tableRowProps, children: [showSelector && (jsx(Table$1.ColumnHeader, { padding: `${table.getDensityValue()}px`, display: "grid", color: {
3109
+ return (jsx(Table$1.Header, { ...(isSticky ? stickyProps : {}), bgColor: "transparent", ...tableHeaderProps, children: table.getHeaderGroups().map((headerGroup) => (jsxs(Table$1.Row, { display: "flex", bgColor: "transparent", ...tableRowProps, children: [showSelector && (jsx(Table$1.ColumnHeader, { padding: `${table.getDensityValue()}px`, display: "grid", color: {
3142
3110
  base: "colorPalette.900",
3143
3111
  _dark: "colorPalette.100",
3144
3112
  },
@@ -3156,10 +3124,20 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
3156
3124
  base: "colorPalette.800",
3157
3125
  _dark: "colorPalette.200",
3158
3126
  },
3159
- bg: { base: "colorPalette.100", _dark: "colorPalette.900" }, ...getThProps(header), children: [jsxs(MenuRoot, { children: [jsx(MenuTrigger, { asChild: true, children: jsx(Flex, { padding: `${table.getDensityValue()}px`, alignItems: "center", justifyContent: "start", borderRadius: "0rem", overflow: "auto", _hover: {
3160
- backgroundColor: "gray.100",
3161
- _dark: {
3162
- backgroundColor: "gray.700",
3127
+ bg: { base: "colorPalette.100", _dark: "colorPalette.900" }, ...getThProps(header), children: [jsxs(MenuRoot, { children: [jsx(MenuTrigger, { asChild: true, children: jsx(Flex, { padding: `${table.getDensityValue()}px`, alignItems: "center", justifyContent: "start", borderRadius: "0rem", overflow: "auto", color: {
3128
+ base: "colorPalette.800",
3129
+ _dark: "colorPalette.200",
3130
+ _hover: {
3131
+ base: "colorPalette.700",
3132
+ _dark: "colorPalette.300",
3133
+ },
3134
+ },
3135
+ bg: {
3136
+ base: "colorPalette.100",
3137
+ _dark: "colorPalette.900",
3138
+ _hover: {
3139
+ base: "colorPalette.200",
3140
+ _dark: "colorPalette.800",
3163
3141
  },
3164
3142
  }, children: jsxs(Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
3165
3143
  ? null
@@ -3187,10 +3165,12 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
3187
3165
  });
3188
3166
  }, children: [jsx(GrDescend, {}), "Sort Descending"] }) }), header.column.getIsSorted() && (jsx(MenuItem, { asChild: true, value: "sort-descend", children: jsxs(Button, { variant: "ghost", onClick: () => {
3189
3167
  header.column.clearSorting();
3190
- }, children: [jsx(MdClear, {}), "Clear Sorting"] }) }))] }))] })] }), canResize && (jsx(Box, { borderRight: "0.2rem solid", borderRightColor: header.column.getIsResizing() ? "gray.700" : "transparent", position: "relative", right: "0.1rem", width: "2px", height: "100%", userSelect: "none", style: { touchAction: "none" }, _hover: {
3168
+ }, children: [jsx(MdClear, {}), "Clear Sorting"] }) }))] }))] })] }), canResize && (jsx(Box, { borderRight: "0.2rem solid", borderRightColor: header.column.getIsResizing()
3169
+ ? "colorPalette.700"
3170
+ : "transparent", position: "relative", right: "0.1rem", width: "2px", height: "100%", userSelect: "none", style: { touchAction: "none" }, _hover: {
3191
3171
  borderRightColor: header.column.getIsResizing()
3192
- ? "gray.700"
3193
- : "gray.400",
3172
+ ? "colorPalette.700"
3173
+ : "colorPalette.400",
3194
3174
  }, ...resizeProps }))] }, `chakra-table-header-${header.id}`));
3195
3175
  })] }, `chakra-table-headergroup-${headerGroup.id}`))) }));
3196
3176
  };
@@ -3658,6 +3638,18 @@ const BooleanPicker = ({ schema, column, prefix }) => {
3658
3638
  } }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
3659
3639
  };
3660
3640
 
3641
+ const CustomInput = ({ column, schema, prefix }) => {
3642
+ const formContext = useFormContext();
3643
+ const { inputRender } = schema;
3644
+ return (inputRender &&
3645
+ inputRender({
3646
+ column,
3647
+ schema,
3648
+ prefix,
3649
+ formContext,
3650
+ }));
3651
+ };
3652
+
3661
3653
  const monthNamesShort = [
3662
3654
  "Jan",
3663
3655
  "Feb",
@@ -3755,9 +3747,9 @@ const DatePicker = ({ column, schema, prefix }) => {
3755
3747
  const selectedDate = watch(colLabel);
3756
3748
  const formatedDate = dayjs(selectedDate).format("YYYY-MM-DD");
3757
3749
  return (jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
3758
- gridRow, children: [jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsx(PopoverTrigger, { asChild: true, children: jsx(Button, { size: "sm", variant: "outline", onClick: () => {
3750
+ gridRow, children: [jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsx(PopoverTrigger, { asChild: true, children: jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
3759
3751
  setOpen(true);
3760
- }, children: selectedDate !== undefined ? `${formatedDate}` : "" }) }), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DatePicker$1
3752
+ }, justifyContent: "start", children: [jsx(MdDateRange, {}), selectedDate !== undefined ? `${formatedDate}` : ""] }) }), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DatePicker$1
3761
3753
  // @ts-expect-error TODO: find appropriate types
3762
3754
  , {
3763
3755
  // @ts-expect-error TODO: find appropriate types
@@ -3782,7 +3774,7 @@ function filterArray(array, searchTerm) {
3782
3774
  const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
3783
3775
  const { watch, formState: { errors }, setValue, } = useFormContext();
3784
3776
  const { translate } = useSchemaContext();
3785
- const { required } = schema;
3777
+ const { required, variant } = schema;
3786
3778
  const isRequired = required?.some((columnId) => columnId === column);
3787
3779
  const { gridColumn, gridRow, renderDisplay } = schema;
3788
3780
  const [searchText, setSearchText] = useState();
@@ -3799,6 +3791,22 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
3799
3791
  setSearchText(event.target.value);
3800
3792
  setLimit(10);
3801
3793
  };
3794
+ if (variant === "radio") {
3795
+ return (jsx(Field, { label: `${translate.t(removeIndex(`${column}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
3796
+ gridRow, children: jsx(RadioGroup$1.Root, { defaultValue: "1", children: jsx(HStack, { gap: "6", children: filterArray(dataList, searchText ?? "").map((item) => {
3797
+ return (jsxs(RadioGroup$1.Item, { onClick: () => {
3798
+ if (!isMultiple) {
3799
+ setOpenSearchResult(false);
3800
+ setValue(colLabel, item);
3801
+ return;
3802
+ }
3803
+ const newSet = new Set([...(watchEnums ?? []), item]);
3804
+ setValue(colLabel, [...newSet]);
3805
+ }, value: item, children: [jsx(RadioGroup$1.ItemHiddenInput, {}), jsx(RadioGroup$1.ItemIndicator, {}), jsx(RadioGroup$1.ItemText, { children: !!renderDisplay === true
3806
+ ? renderDisplay(item)
3807
+ : translate.t(removeIndex(`${colLabel}.${item}`)) })] }, `${colLabel}-${item}`));
3808
+ }) }) }) }));
3809
+ }
3802
3810
  return (jsxs(Field, { label: `${translate.t(removeIndex(`${column}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
3803
3811
  gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
3804
3812
  const item = enumValue;
@@ -3814,7 +3822,7 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
3814
3822
  setOpenSearchResult(true);
3815
3823
  }, children: translate.t(removeIndex(`${colLabel}.add_more`)) })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
3816
3824
  setOpenSearchResult(true);
3817
- }, children: watchEnum === undefined
3825
+ }, justifyContent: "start", children: watchEnum === undefined
3818
3826
  ? ""
3819
3827
  : translate.t(removeIndex(`${colLabel}.${watchEnum}`)) })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(`${column}.type_to_search`), onChange: (event) => {
3820
3828
  onSearchChange(event);
@@ -3831,7 +3839,7 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
3831
3839
  }
3832
3840
  const newSet = new Set([...(watchEnums ?? []), item]);
3833
3841
  setValue(colLabel, [...newSet]);
3834
- }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
3842
+ }, ...(selected ? { color: "colorPalette.400/50" } : {}), children: !!renderDisplay === true
3835
3843
  ? renderDisplay(item)
3836
3844
  : translate.t(removeIndex(`${colLabel}.${item}`)) }, `${colLabel}-${item}`));
3837
3845
  }) }), isDirty && (jsx(Fragment, { children: dataList.length <= 0 && (jsx(Fragment, { children: translate.t(removeIndex(`${colLabel}.empty_search_result`)) })) }))] })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
@@ -4186,7 +4194,7 @@ const FileDropzone = ({ children = undefined, gridProps = {}, onDrop = () => { }
4186
4194
  const filesArray = [...event.target.files];
4187
4195
  onDrop({ files: filesArray });
4188
4196
  };
4189
- return (jsxs(Grid, { ...getColor(isDraggedOver), ref: ref, cursor: "pointer", onClick: handleClick, borderStyle: "dashed", borderColor: "gray.400", alignContent: "center", justifyContent: "center", borderWidth: 1, borderRadius: 4, ...gridProps, children: [children, !!children === false && (jsxs(Fragment, { children: [jsx(Flex, { children: placeholder }), jsx(Input, { type: "file", multiple: true, style: { display: "none" }, ref: fileInput, onChange: handleChange })] }))] }));
4197
+ return (jsxs(Grid, { ...getColor(isDraggedOver), ref: ref, cursor: "pointer", onClick: handleClick, borderStyle: "dashed", borderColor: "colorPalette.400", alignContent: "center", justifyContent: "center", borderWidth: 1, borderRadius: 4, ...gridProps, children: [children, !!children === false && (jsxs(Fragment, { children: [jsx(Flex, { children: placeholder }), jsx(Input, { type: "file", multiple: true, style: { display: "none" }, ref: fileInput, onChange: handleChange })] }))] }));
4190
4198
  };
4191
4199
 
4192
4200
  const FilePicker = ({ column, schema, prefix }) => {
@@ -4204,7 +4212,7 @@ const FilePicker = ({ column, schema, prefix }) => {
4204
4212
  setValue(column, currentFiles.filter(({ name }) => {
4205
4213
  return name !== file.name;
4206
4214
  }));
4207
- }, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsx(Box, { children: file.name }), jsx(TiDeleteOutline, {})] }) }, file.name));
4215
+ }, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [file.type.startsWith("image/") && (jsx(Image, { src: URL.createObjectURL(file), alt: file.name, boxSize: "50px", objectFit: "cover", borderRadius: "md", marginRight: "2" })), jsx(Box, { children: file.name }), jsx(TiDeleteOutline, {})] }) }, file.name));
4208
4216
  }) }), errors[`${colLabel}`] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
4209
4217
  };
4210
4218
 
@@ -4337,7 +4345,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
4337
4345
  setOpenSearchResult(true);
4338
4346
  }, children: translate.t(removeIndex(`${colLabel}.add_more`)) })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
4339
4347
  setOpenSearchResult(true);
4340
- }, children: getPickedValue() })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(removeIndex(`${colLabel}.typeToSearch`)), onChange: (event) => {
4348
+ }, justifyContent: "start", children: getPickedValue() })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(removeIndex(`${colLabel}.typeToSearch`)), onChange: (event) => {
4341
4349
  onSearchChange(event);
4342
4350
  setOpenSearchResult(true);
4343
4351
  }, autoComplete: "off", ref: ref }), jsx(PopoverTitle, {}), (searchText?.length ?? 0) > 0 && (jsxs(Fragment, { children: [isFetching && jsx(Fragment, { children: "isFetching" }), isLoading && jsx(Fragment, { children: "isLoading" }), isPending && jsx(Fragment, { children: "isPending" }), (isFetching || isLoading || isPending) && jsx(Spinner, {}), isError && (jsx(Icon, { color: "red.400", children: jsx(BiError, {}) })), jsx(Text, { justifySelf: "center", children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit}` }), jsxs(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsx(Flex, { flexFlow: "column wrap", children:
@@ -4357,7 +4365,9 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
4357
4365
  item[column_ref],
4358
4366
  ]);
4359
4367
  setValue(colLabel, [...newSet]);
4360
- }, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
4368
+ }, opacity: 0.7, _hover: { opacity: 1 }, ...(selected
4369
+ ? { color: "colorPalette.400/50" }
4370
+ : {}), children: !!renderDisplay === true
4361
4371
  ? renderDisplay(item)
4362
4372
  : item[display_column] }, item[column_ref]));
4363
4373
  }) }), isDirty && (jsx(Fragment, { children: dataList.length <= 0 && (jsx(Text, { children: translate.t(removeIndex(`${colLabel}.empty_search_result`)) })) }))] }), jsx(PaginationRoot, { justifySelf: "center", count: count, pageSize: 10, defaultPage: 1, page: page + 1, onPageChange: (e) => setPage(e.page - 1), children: jsxs(HStack, { gap: "4", children: [jsx(PaginationPrevTrigger, {}), count > 0 && jsx(PaginationPageText, {}), jsx(PaginationNextTrigger, {})] }) })] }))] }) })] }), errors[`${colLabel}`] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
@@ -4557,9 +4567,115 @@ const TagPicker = ({ column, schema, prefix }) => {
4557
4567
  }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
4558
4568
  };
4559
4569
 
4570
+ function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem, meridiemLabel = {
4571
+ am: "am",
4572
+ pm: "pm",
4573
+ }, onChange = () => { }, }) {
4574
+ const hours = Array.from({ length: 12 }, (_, i) => {
4575
+ const hour = i + 1;
4576
+ return hour.toString().padStart(2, "0");
4577
+ });
4578
+ const minutes = Array.from({ length: 60 }, (_, i) => {
4579
+ return i.toString().padStart(2, "0");
4580
+ });
4581
+ const hoursCollection = createListCollection({
4582
+ items: hours.map((hour) => ({
4583
+ value: hour,
4584
+ label: hour,
4585
+ })),
4586
+ });
4587
+ const minutesCollection = createListCollection({
4588
+ items: minutes.map((hour) => ({
4589
+ value: hour,
4590
+ label: hour,
4591
+ })),
4592
+ });
4593
+ const meridiemsCollection = createListCollection({
4594
+ items: ["am", "pm"].map((hour) => ({
4595
+ value: hour,
4596
+ label: meridiemLabel[hour] ?? hour,
4597
+ })),
4598
+ });
4599
+ return (jsxs(Grid, { templateColumns: "auto auto", gap: "4", children: [jsxs(Flex, { justifyContent: "center", alignItems: "center", gap: "2", children: [jsxs(Select.Root, { value: [`${hour.toString().padStart(2, "0")}`], onValueChange: (e) => {
4600
+ setHour(parseInt(e.value[0]));
4601
+ onChange({ hour: parseInt(e.value[0]), minute, meridiem });
4602
+ }, collection: hoursCollection, positioning: { sameWidth: true, placement: "bottom" }, children: [jsx(Select.HiddenSelect, {}), jsx(Select.Control, { children: jsx(Select.Trigger, { children: jsx(Select.ValueText, { placeholder: "Hour" }) }) }), jsx(Select.Positioner, { children: jsx(Select.Content, { width: "full", children: hoursCollection.items.map(({ value: hour }) => (jsxs(Select.Item, { item: hour, children: [hour, jsx(Select.ItemIndicator, {})] }, hour))) }) })] }), jsx(Text, { children: ":" }), jsxs(Select.Root, { value: [`${minute.toString().padStart(2, "0")}`], onValueChange: (e) => {
4603
+ setMinute(parseInt(e.value[0]));
4604
+ onChange({ hour, minute: parseInt(e.value[0]), meridiem });
4605
+ }, collection: minutesCollection, positioning: { sameWidth: true, placement: "bottom" }, children: [jsx(Select.HiddenSelect, {}), jsx(Select.Control, { children: jsx(Select.Trigger, { children: jsx(Select.ValueText, { placeholder: "Minute" }) }) }), jsx(Select.Positioner, { children: jsx(Select.Content, { width: "full", children: minutes.map((minute) => (jsxs(Select.Item, { item: minute, children: [minute, jsx(Select.ItemIndicator, {})] }, minute))) }) })] })] }), jsxs(Select.Root, { value: [meridiem], onValueChange: (e) => {
4606
+ setMeridiem(e.value[0]);
4607
+ onChange({ hour, minute, meridiem: e.value[0] });
4608
+ }, collection: meridiemsCollection, positioning: { sameWidth: true, placement: "bottom" }, children: [jsx(Select.HiddenSelect, {}), jsx(Select.Control, { children: jsx(Select.Trigger, { children: jsx(Select.ValueText, { placeholder: "am/pm" }) }) }), jsx(Select.Positioner, { children: jsx(Select.Content, { width: "full", children: meridiemsCollection.items.map(({ value: hour, label }) => (jsxs(Select.Item, { item: hour, children: [label, jsx(Select.ItemIndicator, {})] }, hour))) }) })] })] }));
4609
+ }
4610
+
4611
+ const TimePicker = ({ column, schema, prefix }) => {
4612
+ const { watch, formState: { errors }, setValue, } = useFormContext();
4613
+ const { translate } = useSchemaContext();
4614
+ const { required, gridColumn, gridRow } = schema;
4615
+ const isRequired = required?.some((columnId) => columnId === column);
4616
+ const colLabel = `${prefix}${column}`;
4617
+ const [open, setOpen] = useState(false);
4618
+ const value = watch(colLabel);
4619
+ const formatedTime = dayjs(value).format("hh:mm A");
4620
+ // Parse the initial time parts from the ISO time string (HH:mm:ss)
4621
+ const parseTime = (isoTime) => {
4622
+ if (!isoTime)
4623
+ return { hour: 12, minute: 0, meridiem: "am" };
4624
+ const parsed = dayjs(isoTime);
4625
+ if (!parsed.isValid())
4626
+ return { hour: 12, minute: 0, meridiem: "am" };
4627
+ let hour = parsed.hour();
4628
+ const minute = parsed.minute();
4629
+ const meridiem = hour >= 12 ? "pm" : "am";
4630
+ if (hour === 0)
4631
+ hour = 12;
4632
+ else if (hour > 12)
4633
+ hour -= 12;
4634
+ return { hour, minute, meridiem };
4635
+ };
4636
+ const initialTime = parseTime(value);
4637
+ const [hour, setHour] = useState(initialTime.hour);
4638
+ const [minute, setMinute] = useState(initialTime.minute);
4639
+ const [meridiem, setMeridiem] = useState(initialTime.meridiem);
4640
+ useEffect(() => {
4641
+ const { hour, minute, meridiem } = parseTime(value);
4642
+ setHour(hour);
4643
+ setMinute(minute);
4644
+ setMeridiem(meridiem);
4645
+ }, [value]);
4646
+ // Convert hour, minute, meridiem to 24-hour ISO time string
4647
+ const toIsoTime = (hour, minute, meridiem) => {
4648
+ let h = hour;
4649
+ if (meridiem === "am" && hour === 12)
4650
+ h = 0;
4651
+ else if (meridiem === "pm" && hour < 12)
4652
+ h = hour + 12;
4653
+ return dayjs().hour(h).minute(minute).second(0).toISOString();
4654
+ };
4655
+ // Handle changes to time parts
4656
+ const handleTimeChange = ({ hour: newHour, minute: newMinute, meridiem: newMeridiem, }) => {
4657
+ setHour(newHour);
4658
+ setMinute(newMinute);
4659
+ setMeridiem(newMeridiem);
4660
+ const isoTime = toIsoTime(newHour, newMinute, newMeridiem);
4661
+ setValue(colLabel, isoTime, { shouldValidate: true, shouldDirty: true });
4662
+ };
4663
+ const containerRef = useRef(null);
4664
+ return (jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
4665
+ gridRow, children: [jsxs(Popover.Root, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsx(Popover.Trigger, { asChild: true, children: jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
4666
+ setOpen(true);
4667
+ }, justifyContent: "start", children: [jsx(IoMdClock, {}), value !== undefined ? `${formatedTime}` : ""] }) }), jsx(Portal, { children: jsx(Popover.Positioner, { children: jsx(Popover.Content, { ref: containerRef, children: jsx(Popover.Body, { children: jsx(TimePicker$1, { hour: hour, setHour: setHour, minute: minute, setMinute: setMinute, meridiem: meridiem, setMeridiem: setMeridiem, onChange: handleTimeChange, meridiemLabel: {
4668
+ am: translate.t(removeIndex(`${colLabel}.am`)),
4669
+ pm: translate.t(removeIndex(`${colLabel}.pm`)),
4670
+ } }) }) }) }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
4671
+ };
4672
+
4560
4673
  const SchemaRenderer = ({ schema, prefix, column, }) => {
4561
4674
  const colSchema = schema;
4562
4675
  const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
4676
+ if (variant === "custom-input") {
4677
+ return jsx(CustomInput, { schema: colSchema, prefix, column });
4678
+ }
4563
4679
  if (type === "string") {
4564
4680
  if ((schema.enum ?? []).length > 0) {
4565
4681
  return jsx(EnumPicker, { schema: colSchema, prefix, column });
@@ -4571,6 +4687,9 @@ const SchemaRenderer = ({ schema, prefix, column, }) => {
4571
4687
  if (variant === "date-picker") {
4572
4688
  return jsx(DatePicker, { schema: colSchema, prefix, column });
4573
4689
  }
4690
+ if (variant === "time-picker") {
4691
+ return jsx(TimePicker, { schema: colSchema, prefix, column });
4692
+ }
4574
4693
  return jsx(StringInputField, { schema: colSchema, prefix, column });
4575
4694
  }
4576
4695
  if (type === "number" || type === "integer") {
@@ -4674,22 +4793,15 @@ const EnumViewer = ({ column, isMultiple = false, schema, prefix, }) => {
4674
4793
  };
4675
4794
 
4676
4795
  const FileViewer = ({ column, schema, prefix }) => {
4677
- const { setValue, formState: { errors }, watch, } = useFormContext();
4796
+ const { watch } = useFormContext();
4678
4797
  const { translate } = useSchemaContext();
4679
4798
  const { required, gridColumn, gridRow } = schema;
4680
4799
  const isRequired = required?.some((columnId) => columnId === column);
4681
4800
  const currentFiles = (watch(column) ?? []);
4682
4801
  const colLabel = `${prefix}${column}`;
4683
- return (jsxs(Field, { label: `${translate.t(`${colLabel}.field_label`)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", display: "grid", gridTemplateRows: "auto 1fr auto", alignItems: "stretch", children: [jsx(FileDropzone, { onDrop: ({ files }) => {
4684
- const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
4685
- setValue(colLabel, [...currentFiles, ...newFiles]);
4686
- }, placeholder: translate.t(`${colLabel}.fileDropzone`) }), jsx(Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
4687
- return (jsx(Card.Root, { variant: "subtle", children: jsxs(Card.Body, { gap: "2", cursor: "pointer", onClick: () => {
4688
- setValue(column, currentFiles.filter(({ name }) => {
4689
- return name !== file.name;
4690
- }));
4691
- }, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsx(Box, { children: file.name }), jsx(TiDeleteOutline, {})] }) }, file.name));
4692
- }) }), errors[`${colLabel}`] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
4802
+ return (jsx(Field, { label: `${translate.t(`${colLabel}.field_label`)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", display: "grid", gridTemplateRows: "auto 1fr auto", alignItems: "stretch", children: jsx(Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
4803
+ return (jsx(Card.Root, { variant: "subtle", children: jsxs(Card.Body, { gap: "2", display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [file.type.startsWith("image/") && (jsx(Image, { src: URL.createObjectURL(file), alt: file.name, boxSize: "50px", objectFit: "cover", borderRadius: "md", marginRight: "2" })), jsx(Box, { children: file.name })] }) }, file.name));
4804
+ }) }) }));
4693
4805
  };
4694
4806
 
4695
4807
  const IdViewer = ({ column, schema, prefix, isMultiple = false, }) => {
@@ -4898,9 +5010,24 @@ const StringViewer = ({ column, schema, prefix, }) => {
4898
5010
  return (jsx(Fragment, { children: jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsx(Text, { children: value }), errors[colLabel] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }) }));
4899
5011
  };
4900
5012
 
5013
+ const CustomViewer = ({ column, schema, prefix }) => {
5014
+ const formContext = useFormContext();
5015
+ const { inputViewerRender } = schema;
5016
+ return (inputViewerRender &&
5017
+ inputViewerRender({
5018
+ column,
5019
+ schema,
5020
+ prefix,
5021
+ formContext,
5022
+ }));
5023
+ };
5024
+
4901
5025
  const SchemaViewer = ({ schema, prefix, column, }) => {
4902
5026
  const colSchema = schema;
4903
5027
  const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
5028
+ if (variant === "custom-input") {
5029
+ return jsx(CustomViewer, { schema: colSchema, prefix, column });
5030
+ }
4904
5031
  if (type === "string") {
4905
5032
  if ((schema.enum ?? []).length > 0) {
4906
5033
  return jsx(EnumViewer, { schema: colSchema, prefix, column });
@@ -1,3 +1,4 @@
1
+ import { GridProps } from "@chakra-ui/react";
1
2
  import { ReactNode } from "react";
2
3
  export interface TableControlsProps {
3
4
  totalText?: string;
@@ -17,5 +18,6 @@ export interface TableControlsProps {
17
18
  extraItems?: ReactNode;
18
19
  loading?: boolean;
19
20
  hasError?: boolean;
21
+ gridProps?: GridProps;
20
22
  }
21
- export declare const TableControls: ({ fitTableWidth, fitTableHeight, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, showView, filterOptions, extraItems, loading, hasError, }: TableControlsProps) => import("react/jsx-runtime").JSX.Element;
23
+ export declare const TableControls: ({ fitTableWidth, fitTableHeight, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, showView, filterOptions, extraItems, loading, hasError, gridProps, }: TableControlsProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,9 +1,5 @@
1
1
  export interface TableFooterProps {
2
- pinnedBgColor?: {
3
- light: string;
4
- dark: string;
5
- };
6
2
  showSelector?: boolean;
7
3
  alwaysShowSelector?: boolean;
8
4
  }
9
- export declare const TableFooter: ({ pinnedBgColor, showSelector, alwaysShowSelector, }: TableFooterProps) => import("react/jsx-runtime").JSX.Element;
5
+ export declare const TableFooter: ({ showSelector, alwaysShowSelector, }: TableFooterProps) => import("react/jsx-runtime").JSX.Element;
@@ -4,8 +4,9 @@ import { JSONSchema7 } from "json-schema";
4
4
  import { Dispatch, ReactNode, SetStateAction } from "react";
5
5
  import { FieldValues, SubmitHandler, UseFormReturn } from "react-hook-form";
6
6
  import { UseTranslationResponse } from "react-i18next";
7
+ import { CustomJSONSchema7 } from "../types/CustomJSONSchema7";
7
8
  export interface FormRootProps<TData extends FieldValues> {
8
- schema: JSONSchema7;
9
+ schema: CustomJSONSchema7;
9
10
  serverUrl: string;
10
11
  requestUrl?: string;
11
12
  idMap: Record<string, object>;
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { CustomJSONSchema7 } from "../types/CustomJSONSchema7";
3
+ export interface DatePickerProps {
4
+ column: string;
5
+ schema: CustomJSONSchema7;
6
+ prefix: string;
7
+ }
8
+ export declare const CustomInput: ({ column, schema, prefix }: DatePickerProps) => import("react").ReactNode;
@@ -0,0 +1,7 @@
1
+ import { CustomJSONSchema7 } from "../types/CustomJSONSchema7";
2
+ export interface DatePickerProps {
3
+ column: string;
4
+ schema: CustomJSONSchema7;
5
+ prefix: string;
6
+ }
7
+ export declare const TimePicker: ({ column, schema, prefix }: DatePickerProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,12 +1,25 @@
1
1
  import { JSONSchema7 } from "json-schema";
2
2
  import { ReactNode } from "react";
3
3
  import { ForeignKeyProps } from "../fields/StringInputField";
4
+ import { UseFormReturn } from "react-hook-form";
4
5
  export interface CustomJSONSchema7 extends JSONSchema7 {
5
6
  gridColumn?: string;
6
7
  gridRow?: string;
7
8
  foreign_key?: ForeignKeyProps;
8
9
  variant?: string;
9
- renderDisplay: (item: unknown) => ReactNode;
10
+ renderDisplay?: (item: unknown) => ReactNode;
11
+ inputRender?: (props: {
12
+ column: string;
13
+ schema: CustomJSONSchema7;
14
+ prefix: string;
15
+ formContext: UseFormReturn;
16
+ }) => ReactNode;
17
+ inputViewerRender?: (props: {
18
+ column: string;
19
+ schema: CustomJSONSchema7;
20
+ prefix: string;
21
+ formContext: UseFormReturn;
22
+ }) => ReactNode;
10
23
  }
11
24
  export interface TagPickerProps {
12
25
  column: string;
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { CustomJSONSchema7 } from "../types/CustomJSONSchema7";
3
+ export interface DatePickerProps {
4
+ column: string;
5
+ schema: CustomJSONSchema7;
6
+ prefix: string;
7
+ }
8
+ export declare const CustomViewer: ({ column, schema, prefix }: DatePickerProps) => import("react").ReactNode;
@@ -0,0 +1,19 @@
1
+ interface TimePickerProps {
2
+ hour: number;
3
+ setHour: (hour: number) => void;
4
+ minute: number;
5
+ setMinute: (minute: number) => void;
6
+ meridiem: "am" | "pm";
7
+ setMeridiem: (meridiem: "am" | "pm") => void;
8
+ onChange?: (newValue: {
9
+ hour: number;
10
+ minute: number;
11
+ meridiem: "am" | "pm";
12
+ }) => void;
13
+ meridiemLabel?: {
14
+ am: string;
15
+ pm: string;
16
+ };
17
+ }
18
+ export declare function TimePicker({ hour, setHour, minute, setMinute, meridiem, setMeridiem, meridiemLabel, onChange, }: TimePickerProps): import("react/jsx-runtime").JSX.Element;
19
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "12.0.0-beta.20",
3
+ "version": "12.0.0-beta.22",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",