@raystack/apsara 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -31652,49 +31652,188 @@ const TextField = React.forwardRef(({ leading, className, src, size, state, styl
31652
31652
  });
31653
31653
  TextField.displayName = "TextField";
31654
31654
 
31655
- var styles$4 = {"wrapper":"datatable-module_wrapper__Sxg2d","datatable":"datatable-module_datatable__z-Th2","table":"datatable-module_table__x2IkY","head":"datatable-module_head__zCfCW","toolbar":"datatable-module_toolbar__lO-aI","chip":"datatable-module_chip__IiwTD","chipWrapper":"datatable-module_chipWrapper__iz69x"};
31655
+ var styles$4 = {"wrapper":"datatable-module_wrapper__Sxg2d","datatable":"datatable-module_datatable__z-Th2","table":"datatable-module_table__x2IkY","head":"datatable-module_head__zCfCW","toolbar":"datatable-module_toolbar__lO-aI","chip":"datatable-module_chip__IiwTD","chipWrapper":"datatable-module_chipWrapper__iz69x","filterOperator":"datatable-module_filterOperator__qtDsH"};
31656
31656
 
31657
- const FilteredChip = ({ column }) => {
31657
+ const columnTypesMap = {
31658
+ select: "select",
31659
+ number: "number",
31660
+ text: "text",
31661
+ };
31662
+ const filterValueTypeMap = {
31663
+ select: "select",
31664
+ text: "text",
31665
+ };
31666
+
31667
+ const operationsOptions = {
31668
+ [columnTypesMap.select]: [
31669
+ {
31670
+ label: "is",
31671
+ value: "is",
31672
+ fn: (row, columnId, filterValue) => {
31673
+ return row.getValue(columnId) === filterValue.value;
31674
+ },
31675
+ },
31676
+ {
31677
+ label: "is not",
31678
+ value: "is not",
31679
+ fn: (row, columnId, filterValue) => {
31680
+ return row.getValue(columnId) !== filterValue.value;
31681
+ },
31682
+ },
31683
+ ],
31684
+ [columnTypesMap.number]: [
31685
+ {
31686
+ label: "=",
31687
+ value: "=",
31688
+ fn: (row, columnId, filterValue) => {
31689
+ return Number(row.getValue(columnId)) === Number(filterValue.value);
31690
+ },
31691
+ },
31692
+ {
31693
+ label: "!=",
31694
+ value: "!=",
31695
+ fn: (row, columnId, filterValue) => {
31696
+ return Number(row.getValue(columnId)) !== Number(filterValue.value);
31697
+ },
31698
+ },
31699
+ {
31700
+ label: ">",
31701
+ value: ">",
31702
+ fn: (row, columnId, filterValue) => {
31703
+ return Number(row.getValue(columnId)) > Number(filterValue.value);
31704
+ },
31705
+ },
31706
+ {
31707
+ label: ">=",
31708
+ value: ">=",
31709
+ fn: (row, columnId, filterValue) => {
31710
+ return Number(row.getValue(columnId)) >= Number(filterValue.value);
31711
+ },
31712
+ },
31713
+ {
31714
+ label: "<",
31715
+ value: "<",
31716
+ fn: (row, columnId, filterValue) => {
31717
+ return Number(row.getValue(columnId)) < Number(filterValue.value);
31718
+ },
31719
+ },
31720
+ {
31721
+ label: "<=",
31722
+ value: "<=",
31723
+ fn: (row, columnId, filterValue) => {
31724
+ return Number(row.getValue(columnId)) <= Number(filterValue.value);
31725
+ },
31726
+ },
31727
+ ],
31728
+ [columnTypesMap.text]: [
31729
+ {
31730
+ label: "contains",
31731
+ value: "contains",
31732
+ fn: (row, columnId, filterValue) => {
31733
+ const columnValue = row.getValue(columnId).toLowerCase();
31734
+ const filterStr = filterValue.value.toLowerCase();
31735
+ return columnValue.includes(filterStr);
31736
+ },
31737
+ },
31738
+ {
31739
+ label: "does not contains",
31740
+ value: "does not contains",
31741
+ fn: (row, columnId, filterValue) => {
31742
+ const columnValue = row.getValue(columnId).toLowerCase();
31743
+ const filterStr = filterValue.value.toLowerCase();
31744
+ return !columnValue.includes(filterStr);
31745
+ },
31746
+ },
31747
+ {
31748
+ label: "starts with",
31749
+ value: "starts with",
31750
+ fn: (row, columnId, filterValue) => {
31751
+ const columnValue = row.getValue(columnId).toLowerCase();
31752
+ const filterStr = filterValue.value.toLowerCase();
31753
+ return columnValue.startsWith(filterStr);
31754
+ },
31755
+ },
31756
+ {
31757
+ label: "ends with",
31758
+ value: "ends with",
31759
+ fn: (row, columnId, filterValue) => {
31760
+ const columnValue = row.getValue(columnId).toLowerCase();
31761
+ const filterStr = filterValue.value.toLowerCase();
31762
+ return columnValue.endsWith(filterStr);
31763
+ },
31764
+ },
31765
+ {
31766
+ label: "is empty",
31767
+ value: "is empty",
31768
+ fn: (row, columnId, filterValue) => {
31769
+ return row.getValue(columnId).length === 0;
31770
+ },
31771
+ hideValueField: true,
31772
+ },
31773
+ {
31774
+ label: "is not empty",
31775
+ value: "is not empty",
31776
+ fn: (row, columnId, filterValue) => {
31777
+ return row.getValue(columnId).length > 0;
31778
+ },
31779
+ hideValueField: true,
31780
+ },
31781
+ ],
31782
+ };
31783
+
31784
+ const FilterValues = ({ columnType = filterValueTypeMap.text, options = [], onValueChange, }) => {
31785
+ const [value, setValue] = React.useState("");
31786
+ const valueType = columnType === columnTypesMap.select
31787
+ ? filterValueTypeMap.select
31788
+ : filterValueTypeMap.text;
31789
+ React.useEffect(() => {
31790
+ if (value && onValueChange) {
31791
+ onValueChange({ value });
31792
+ }
31793
+ }, [value]);
31794
+ return valueType === filterValueTypeMap.select ? (jsxRuntimeExports$1.jsxs(Select, { value: value, onValueChange: setValue, children: [jsxRuntimeExports$1.jsx(Select.Trigger, { children: jsxRuntimeExports$1.jsx(Select.Value, { placeholder: "Select value" }) }), jsxRuntimeExports$1.jsx(Select.Content, { children: options.map((opt) => {
31795
+ return (jsxRuntimeExports$1.jsx(Select.Item, { value: opt.value, children: opt.label || opt.value }, opt.key));
31796
+ }) })] })) : (jsxRuntimeExports$1.jsx(TextField, { value: value, onChange: (e) => setValue(e.target.value) }));
31797
+ };
31798
+ const Operation = ({ columnType = columnTypesMap.text, onOperationSelect, }) => {
31799
+ const options = operationsOptions[columnType] || [];
31800
+ const [value, setValue] = React.useState(options?.[0].value);
31801
+ React.useEffect(() => {
31802
+ const selectedOption = options.find((o) => o.value === value);
31803
+ if (selectedOption) {
31804
+ onOperationSelect(selectedOption);
31805
+ }
31806
+ }, [value]);
31807
+ return (jsxRuntimeExports$1.jsxs(Select, { defaultValue: value, onValueChange: setValue, children: [jsxRuntimeExports$1.jsx(Select.Trigger, { className: styles$4.filterOperator, children: jsxRuntimeExports$1.jsx(Select.Value, { placeholder: "Select operation" }) }), jsxRuntimeExports$1.jsx(Select.Content, { children: options.map((opt) => {
31808
+ return (jsxRuntimeExports$1.jsx(Select.Item, { value: opt.label, children: opt.label }, opt.label));
31809
+ }) })] }));
31810
+ };
31811
+ const FilteredChip = ({ column, updateColumnCustomFilter, }) => {
31812
+ const [filterOperation, setFilterOperation] = React.useState();
31813
+ const [filterValue, setFilterValue] = React.useState();
31658
31814
  const { table, removeFilterColumn } = useTable();
31659
31815
  const { filterVariant } = column?.columnDef;
31660
31816
  const options = column?.columnDef?.meta?.data || [];
31661
- const facets = column?.getFacetedUniqueValues();
31662
- const renderInputs = () => {
31663
- switch (filterVariant) {
31664
- case "text": {
31665
- return (jsxRuntimeExports$1.jsx(TextField, { onChange: (e) => column.setFilterValue(e.target.value) }));
31666
- }
31667
- case "select": {
31668
- new Set(column?.getFilterValue());
31669
- return (jsxRuntimeExports$1.jsxs(Select, { children: [jsxRuntimeExports$1.jsx(Select.Trigger, { children: jsxRuntimeExports$1.jsx(Select.Value, { placeholder: "Select a value" }) }), jsxRuntimeExports$1.jsx(Select.Content, { children: jsxRuntimeExports$1.jsx(Select.Group, { children: options.map((option) => (jsxRuntimeExports$1.jsx(Select.Item, { value: option.value, children: option?.label || option?.value }, option.value))) }) })] }));
31670
- }
31671
- default: {
31672
- const selectedValues = new Set(column?.getFilterValue());
31673
- return (jsxRuntimeExports$1.jsxs(Popover, { children: [jsxRuntimeExports$1.jsx(Popover.Trigger, { asChild: true, children: jsxRuntimeExports$1.jsxs(Button$1, { children: [selectedValues.size, " selected"] }) }), jsxRuntimeExports$1.jsx(Popover.Content, { align: "start", style: { padding: 0 }, children: jsxRuntimeExports$1.jsxs(Command, { children: [jsxRuntimeExports$1.jsx(Command.Input, {}), jsxRuntimeExports$1.jsxs(Command.List, { children: [jsxRuntimeExports$1.jsx(Command.Empty, { children: "No results found." }), jsxRuntimeExports$1.jsx(Command.Group, { children: options.map((option) => {
31674
- const isSelected = selectedValues.has(option.value);
31675
- return (jsxRuntimeExports$1.jsx(Command.Item, { onSelect: () => {
31676
- if (isSelected) {
31677
- selectedValues.delete(option.value);
31678
- }
31679
- else {
31680
- selectedValues.add(option.value);
31681
- }
31682
- const filterValues = Array.from(selectedValues);
31683
- console.log(selectedValues, filterValues);
31684
- column?.setFilterValue(filterValues.length ? filterValues : undefined);
31685
- }, children: jsxRuntimeExports$1.jsxs(Flex, { justify: "between", gap: "small", children: [jsxRuntimeExports$1.jsxs(Flex, { align: "center", gap: "small", children: [jsxRuntimeExports$1.jsx(Checkbox, { checked: isSelected }), option.icon && (jsxRuntimeExports$1.jsx(option.icon, { className: "mr-2 h-4 w-4 text-muted-foreground" })), jsxRuntimeExports$1.jsx("span", { children: option.label })] }), facets?.get(option.value) && (jsxRuntimeExports$1.jsx("span", { children: facets.get(option.value) }))] }) }, option.value));
31686
- }) }), selectedValues.size > 0 && (jsxRuntimeExports$1.jsxs(jsxRuntimeExports$1.Fragment, { children: [jsxRuntimeExports$1.jsx(Command.Separator, {}), jsxRuntimeExports$1.jsx(Command.Group, { children: jsxRuntimeExports$1.jsx(Command.Item, { onSelect: () => column?.setFilterValue(undefined), className: "justify-center text-center", children: "Clear filters" }) })] }))] })] }) })] }));
31687
- }
31817
+ column?.getFacetedUniqueValues();
31818
+ const columnHeader = column?.columnDef?.header;
31819
+ const columnName = (typeof columnHeader === "string" && columnHeader) || column.id;
31820
+ React.useEffect(() => {
31821
+ if (filterOperation?.fn && filterValue) {
31822
+ updateColumnCustomFilter(column.id, filterOperation?.fn);
31823
+ column.setFilterValue(filterValue);
31688
31824
  }
31689
- };
31690
- return (jsxRuntimeExports$1.jsxs(Box, { className: styles$4.chip, children: [jsxRuntimeExports$1.jsx(Text, { children: column.id }), jsxRuntimeExports$1.jsx(Text, { children: "is" }), renderInputs(), jsxRuntimeExports$1.jsx(Flex, { children: jsxRuntimeExports$1.jsx(Cross1Icon, { height: "12", width: "12", onClick: () => {
31691
- column.setFilterValue(undefined);
31692
- removeFilterColumn(column.id);
31693
- } }) })] }));
31825
+ }, [filterOperation, filterValue]);
31826
+ function removeFilter() {
31827
+ column.setFilterValue(undefined);
31828
+ removeFilterColumn(column.id);
31829
+ setFilterOperation(undefined);
31830
+ setFilterValue({});
31831
+ }
31832
+ return (jsxRuntimeExports$1.jsxs(Box, { className: styles$4.chip, children: [jsxRuntimeExports$1.jsx(Text, { children: columnName }), jsxRuntimeExports$1.jsx(Operation, { columnType: filterVariant, onOperationSelect: setFilterOperation }), filterOperation?.hideValueField ? null : (jsxRuntimeExports$1.jsx(FilterValues, { columnType: filterVariant, options: options, onValueChange: setFilterValue })), jsxRuntimeExports$1.jsx(Flex, { children: jsxRuntimeExports$1.jsx(Cross1Icon, { height: "12", width: "12", onClick: removeFilter }) })] }));
31694
31833
  };
31695
31834
 
31696
31835
  function DataTableFilterChips(props) {
31697
- const { filteredColumns, table } = useTable();
31836
+ const { filteredColumns, table, updateColumnCustomFilter } = useTable();
31698
31837
  const tableColumns = table
31699
31838
  .getAllColumns()
31700
31839
  .filter((column) => typeof column.accessorFn !== "undefined" && column.getCanHide());
@@ -31702,7 +31841,7 @@ function DataTableFilterChips(props) {
31702
31841
  return null;
31703
31842
  return (jsxRuntimeExports$1.jsxs(Flex, { gap: "small", align: "center", className: styles$4.chipWrapper, ...props, children: [filteredColumns.map((filter, index) => {
31704
31843
  const filteredColumn = table.getColumn(filter);
31705
- return jsxRuntimeExports$1.jsx(FilteredChip, { column: filteredColumn }, index);
31844
+ return (jsxRuntimeExports$1.jsx(FilteredChip, { column: filteredColumn, updateColumnCustomFilter: updateColumnCustomFilter }, index));
31706
31845
  }), filteredColumns.length < tableColumns.length && (jsxRuntimeExports$1.jsx(DataTableFilterOptions, { variant: "ghost", style: { border: "none", background: "none" }, children: jsxRuntimeExports$1.jsx(PlusIcon, { width: 16, height: 16 }) }))] }));
31707
31846
  }
31708
31847
 
@@ -31797,6 +31936,7 @@ const Table = Object.assign(TableRoot, {
31797
31936
  });
31798
31937
 
31799
31938
  function DataTableRoot({ columns, data, emptyState, children, parentStyle, ShouldShowHeader = true, ...props }) {
31939
+ const [tableCustomFilter, setTableCustomFilter] = React.useState({});
31800
31940
  const convertedChildren = React.Children.toArray(children);
31801
31941
  const header = convertedChildren.find((child) => child.type === DataTableToolbar) || null;
31802
31942
  const footer = convertedChildren.find((child) => child.type === DataTableFooter) || null;
@@ -31808,9 +31948,20 @@ function DataTableRoot({ columns, data, emptyState, children, parentStyle, Shoul
31808
31948
  const [rowSelection, setRowSelection] = React.useState({});
31809
31949
  const [globalFilter, setGlobalFilter] = React.useState("");
31810
31950
  const { filteredColumns, addFilterColumn, removeFilterColumn, resetColumns } = useTableColumn();
31951
+ const columnWithCustomFilter = columns.map((col) => {
31952
+ // @ts-ignore;
31953
+ const colId = col.id || col?.accessorKey;
31954
+ if (colId && tableCustomFilter.hasOwnProperty(colId)) {
31955
+ col.filterFn = tableCustomFilter[colId];
31956
+ }
31957
+ return col;
31958
+ });
31959
+ const updateColumnCustomFilter = (id, filterFn) => {
31960
+ setTableCustomFilter((old) => ({ ...old, [id]: filterFn }));
31961
+ };
31811
31962
  const table = useReactTable({
31812
31963
  data,
31813
- columns,
31964
+ columns: columnWithCustomFilter,
31814
31965
  globalFilterFn: "auto",
31815
31966
  enableRowSelection: true,
31816
31967
  manualPagination: true,
@@ -31846,6 +31997,8 @@ function DataTableRoot({ columns, data, emptyState, children, parentStyle, Shoul
31846
31997
  resetColumns,
31847
31998
  onGlobalFilterChange: setGlobalFilter,
31848
31999
  onChange: () => ({}),
32000
+ tableCustomFilter,
32001
+ updateColumnCustomFilter,
31849
32002
  }, children: [jsxRuntimeExports$1.jsxs(Flex, { direction: "column", className: styles$4.datatable, children: [header, jsxRuntimeExports$1.jsxs(Flex, { className: styles$4.tableContainer, style: parentStyle, children: [jsxRuntimeExports$1.jsxs(Table, { ...props, style: tableStyle, children: [jsxRuntimeExports$1.jsx(Table.Header, { children: ShouldShowHeader
31850
32003
  ? table.getHeaderGroups().map((headerGroup) => (jsxRuntimeExports$1.jsx(Table.Row, { children: headerGroup.headers.map((header, index) => {
31851
32004
  return (jsxRuntimeExports$1.jsx(Table.Head, { style: {