@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.css CHANGED
@@ -1993,6 +1993,10 @@ html[data-theme="dark"] {
1993
1993
  border-top: 1px solid var(--border-base);
1994
1994
  }
1995
1995
 
1996
+ .datatable-module_filterOperator__qtDsH {
1997
+ min-width: fit-content;
1998
+ }
1999
+
1996
2000
  .table-module_table__mqnXB {
1997
2001
  width: 100%;
1998
2002
  font-size: 12px;
package/dist/index.js CHANGED
@@ -31632,49 +31632,188 @@ const TextField = forwardRef(({ leading, className, src, size, state, style, ...
31632
31632
  });
31633
31633
  TextField.displayName = "TextField";
31634
31634
 
31635
- 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"};
31635
+ 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"};
31636
31636
 
31637
- const FilteredChip = ({ column }) => {
31637
+ const columnTypesMap = {
31638
+ select: "select",
31639
+ number: "number",
31640
+ text: "text",
31641
+ };
31642
+ const filterValueTypeMap = {
31643
+ select: "select",
31644
+ text: "text",
31645
+ };
31646
+
31647
+ const operationsOptions = {
31648
+ [columnTypesMap.select]: [
31649
+ {
31650
+ label: "is",
31651
+ value: "is",
31652
+ fn: (row, columnId, filterValue) => {
31653
+ return row.getValue(columnId) === filterValue.value;
31654
+ },
31655
+ },
31656
+ {
31657
+ label: "is not",
31658
+ value: "is not",
31659
+ fn: (row, columnId, filterValue) => {
31660
+ return row.getValue(columnId) !== filterValue.value;
31661
+ },
31662
+ },
31663
+ ],
31664
+ [columnTypesMap.number]: [
31665
+ {
31666
+ label: "=",
31667
+ value: "=",
31668
+ fn: (row, columnId, filterValue) => {
31669
+ return Number(row.getValue(columnId)) === Number(filterValue.value);
31670
+ },
31671
+ },
31672
+ {
31673
+ label: "!=",
31674
+ value: "!=",
31675
+ fn: (row, columnId, filterValue) => {
31676
+ return Number(row.getValue(columnId)) !== Number(filterValue.value);
31677
+ },
31678
+ },
31679
+ {
31680
+ label: ">",
31681
+ value: ">",
31682
+ fn: (row, columnId, filterValue) => {
31683
+ return Number(row.getValue(columnId)) > Number(filterValue.value);
31684
+ },
31685
+ },
31686
+ {
31687
+ label: ">=",
31688
+ value: ">=",
31689
+ fn: (row, columnId, filterValue) => {
31690
+ return Number(row.getValue(columnId)) >= Number(filterValue.value);
31691
+ },
31692
+ },
31693
+ {
31694
+ label: "<",
31695
+ value: "<",
31696
+ fn: (row, columnId, filterValue) => {
31697
+ return Number(row.getValue(columnId)) < Number(filterValue.value);
31698
+ },
31699
+ },
31700
+ {
31701
+ label: "<=",
31702
+ value: "<=",
31703
+ fn: (row, columnId, filterValue) => {
31704
+ return Number(row.getValue(columnId)) <= Number(filterValue.value);
31705
+ },
31706
+ },
31707
+ ],
31708
+ [columnTypesMap.text]: [
31709
+ {
31710
+ label: "contains",
31711
+ value: "contains",
31712
+ fn: (row, columnId, filterValue) => {
31713
+ const columnValue = row.getValue(columnId).toLowerCase();
31714
+ const filterStr = filterValue.value.toLowerCase();
31715
+ return columnValue.includes(filterStr);
31716
+ },
31717
+ },
31718
+ {
31719
+ label: "does not contains",
31720
+ value: "does not contains",
31721
+ fn: (row, columnId, filterValue) => {
31722
+ const columnValue = row.getValue(columnId).toLowerCase();
31723
+ const filterStr = filterValue.value.toLowerCase();
31724
+ return !columnValue.includes(filterStr);
31725
+ },
31726
+ },
31727
+ {
31728
+ label: "starts with",
31729
+ value: "starts with",
31730
+ fn: (row, columnId, filterValue) => {
31731
+ const columnValue = row.getValue(columnId).toLowerCase();
31732
+ const filterStr = filterValue.value.toLowerCase();
31733
+ return columnValue.startsWith(filterStr);
31734
+ },
31735
+ },
31736
+ {
31737
+ label: "ends with",
31738
+ value: "ends with",
31739
+ fn: (row, columnId, filterValue) => {
31740
+ const columnValue = row.getValue(columnId).toLowerCase();
31741
+ const filterStr = filterValue.value.toLowerCase();
31742
+ return columnValue.endsWith(filterStr);
31743
+ },
31744
+ },
31745
+ {
31746
+ label: "is empty",
31747
+ value: "is empty",
31748
+ fn: (row, columnId, filterValue) => {
31749
+ return row.getValue(columnId).length === 0;
31750
+ },
31751
+ hideValueField: true,
31752
+ },
31753
+ {
31754
+ label: "is not empty",
31755
+ value: "is not empty",
31756
+ fn: (row, columnId, filterValue) => {
31757
+ return row.getValue(columnId).length > 0;
31758
+ },
31759
+ hideValueField: true,
31760
+ },
31761
+ ],
31762
+ };
31763
+
31764
+ const FilterValues = ({ columnType = filterValueTypeMap.text, options = [], onValueChange, }) => {
31765
+ const [value, setValue] = useState("");
31766
+ const valueType = columnType === columnTypesMap.select
31767
+ ? filterValueTypeMap.select
31768
+ : filterValueTypeMap.text;
31769
+ useEffect(() => {
31770
+ if (value && onValueChange) {
31771
+ onValueChange({ value });
31772
+ }
31773
+ }, [value]);
31774
+ 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) => {
31775
+ return (jsxRuntimeExports$1.jsx(Select.Item, { value: opt.value, children: opt.label || opt.value }, opt.key));
31776
+ }) })] })) : (jsxRuntimeExports$1.jsx(TextField, { value: value, onChange: (e) => setValue(e.target.value) }));
31777
+ };
31778
+ const Operation = ({ columnType = columnTypesMap.text, onOperationSelect, }) => {
31779
+ const options = operationsOptions[columnType] || [];
31780
+ const [value, setValue] = useState(options?.[0].value);
31781
+ useEffect(() => {
31782
+ const selectedOption = options.find((o) => o.value === value);
31783
+ if (selectedOption) {
31784
+ onOperationSelect(selectedOption);
31785
+ }
31786
+ }, [value]);
31787
+ 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) => {
31788
+ return (jsxRuntimeExports$1.jsx(Select.Item, { value: opt.label, children: opt.label }, opt.label));
31789
+ }) })] }));
31790
+ };
31791
+ const FilteredChip = ({ column, updateColumnCustomFilter, }) => {
31792
+ const [filterOperation, setFilterOperation] = useState();
31793
+ const [filterValue, setFilterValue] = useState();
31638
31794
  const { table, removeFilterColumn } = useTable();
31639
31795
  const { filterVariant } = column?.columnDef;
31640
31796
  const options = column?.columnDef?.meta?.data || [];
31641
- const facets = column?.getFacetedUniqueValues();
31642
- const renderInputs = () => {
31643
- switch (filterVariant) {
31644
- case "text": {
31645
- return (jsxRuntimeExports$1.jsx(TextField, { onChange: (e) => column.setFilterValue(e.target.value) }));
31646
- }
31647
- case "select": {
31648
- new Set(column?.getFilterValue());
31649
- 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))) }) })] }));
31650
- }
31651
- default: {
31652
- const selectedValues = new Set(column?.getFilterValue());
31653
- 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) => {
31654
- const isSelected = selectedValues.has(option.value);
31655
- return (jsxRuntimeExports$1.jsx(Command.Item, { onSelect: () => {
31656
- if (isSelected) {
31657
- selectedValues.delete(option.value);
31658
- }
31659
- else {
31660
- selectedValues.add(option.value);
31661
- }
31662
- const filterValues = Array.from(selectedValues);
31663
- console.log(selectedValues, filterValues);
31664
- column?.setFilterValue(filterValues.length ? filterValues : undefined);
31665
- }, 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));
31666
- }) }), 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" }) })] }))] })] }) })] }));
31667
- }
31797
+ column?.getFacetedUniqueValues();
31798
+ const columnHeader = column?.columnDef?.header;
31799
+ const columnName = (typeof columnHeader === "string" && columnHeader) || column.id;
31800
+ useEffect(() => {
31801
+ if (filterOperation?.fn && filterValue) {
31802
+ updateColumnCustomFilter(column.id, filterOperation?.fn);
31803
+ column.setFilterValue(filterValue);
31668
31804
  }
31669
- };
31670
- 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: () => {
31671
- column.setFilterValue(undefined);
31672
- removeFilterColumn(column.id);
31673
- } }) })] }));
31805
+ }, [filterOperation, filterValue]);
31806
+ function removeFilter() {
31807
+ column.setFilterValue(undefined);
31808
+ removeFilterColumn(column.id);
31809
+ setFilterOperation(undefined);
31810
+ setFilterValue({});
31811
+ }
31812
+ 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 }) })] }));
31674
31813
  };
31675
31814
 
31676
31815
  function DataTableFilterChips(props) {
31677
- const { filteredColumns, table } = useTable();
31816
+ const { filteredColumns, table, updateColumnCustomFilter } = useTable();
31678
31817
  const tableColumns = table
31679
31818
  .getAllColumns()
31680
31819
  .filter((column) => typeof column.accessorFn !== "undefined" && column.getCanHide());
@@ -31682,7 +31821,7 @@ function DataTableFilterChips(props) {
31682
31821
  return null;
31683
31822
  return (jsxRuntimeExports$1.jsxs(Flex, { gap: "small", align: "center", className: styles$4.chipWrapper, ...props, children: [filteredColumns.map((filter, index) => {
31684
31823
  const filteredColumn = table.getColumn(filter);
31685
- return jsxRuntimeExports$1.jsx(FilteredChip, { column: filteredColumn }, index);
31824
+ return (jsxRuntimeExports$1.jsx(FilteredChip, { column: filteredColumn, updateColumnCustomFilter: updateColumnCustomFilter }, index));
31686
31825
  }), filteredColumns.length < tableColumns.length && (jsxRuntimeExports$1.jsx(DataTableFilterOptions, { variant: "ghost", style: { border: "none", background: "none" }, children: jsxRuntimeExports$1.jsx(PlusIcon, { width: 16, height: 16 }) }))] }));
31687
31826
  }
31688
31827
 
@@ -31777,6 +31916,7 @@ const Table = Object.assign(TableRoot, {
31777
31916
  });
31778
31917
 
31779
31918
  function DataTableRoot({ columns, data, emptyState, children, parentStyle, ShouldShowHeader = true, ...props }) {
31919
+ const [tableCustomFilter, setTableCustomFilter] = React__default.useState({});
31780
31920
  const convertedChildren = Children.toArray(children);
31781
31921
  const header = convertedChildren.find((child) => child.type === DataTableToolbar) || null;
31782
31922
  const footer = convertedChildren.find((child) => child.type === DataTableFooter) || null;
@@ -31788,9 +31928,20 @@ function DataTableRoot({ columns, data, emptyState, children, parentStyle, Shoul
31788
31928
  const [rowSelection, setRowSelection] = React__default.useState({});
31789
31929
  const [globalFilter, setGlobalFilter] = React__default.useState("");
31790
31930
  const { filteredColumns, addFilterColumn, removeFilterColumn, resetColumns } = useTableColumn();
31931
+ const columnWithCustomFilter = columns.map((col) => {
31932
+ // @ts-ignore;
31933
+ const colId = col.id || col?.accessorKey;
31934
+ if (colId && tableCustomFilter.hasOwnProperty(colId)) {
31935
+ col.filterFn = tableCustomFilter[colId];
31936
+ }
31937
+ return col;
31938
+ });
31939
+ const updateColumnCustomFilter = (id, filterFn) => {
31940
+ setTableCustomFilter((old) => ({ ...old, [id]: filterFn }));
31941
+ };
31791
31942
  const table = useReactTable({
31792
31943
  data,
31793
- columns,
31944
+ columns: columnWithCustomFilter,
31794
31945
  globalFilterFn: "auto",
31795
31946
  enableRowSelection: true,
31796
31947
  manualPagination: true,
@@ -31826,6 +31977,8 @@ function DataTableRoot({ columns, data, emptyState, children, parentStyle, Shoul
31826
31977
  resetColumns,
31827
31978
  onGlobalFilterChange: setGlobalFilter,
31828
31979
  onChange: () => ({}),
31980
+ tableCustomFilter,
31981
+ updateColumnCustomFilter,
31829
31982
  }, 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
31830
31983
  ? table.getHeaderGroups().map((headerGroup) => (jsxRuntimeExports$1.jsx(Table.Row, { children: headerGroup.headers.map((header, index) => {
31831
31984
  return (jsxRuntimeExports$1.jsx(Table.Head, { style: {