{"mappings":";;;;;;;;;;;;;AAAA;;;;;;;;;;CAUC;;;;;AAgGD,MAAM,gDAA0B;IAC9B,WAAW;IACX,YAAY;AACd;AAMO,SAAS,0CAAgC,KAAyB;IACvE,IAAI,CAAC,8BAA8B,8BAA8B,GAAG,CAAA,GAAA,qBAAO,EAAE;IAC7E,IAAI,iBAAC,gBAAgB,iCAAQ,uBAAuB,mBAAE,eAAe,cAAE,aAAa,MAAK,GAAG;IAE5F,IAAI,UAAU,CAAA,GAAA,oBAAM,EAClB,IAAO,CAAA;YACL,yBAAyB,2BAA2B,kBAAkB;YACtE,iBAAiB;2BACjB;YACA,SAAS,EAAE;QACb,CAAA,GACA,uDAAuD;IACvD;QAAC,MAAM,QAAQ;QAAE;QAAyB;QAAe;KAAgB;IAG3E,IAAI,aAAa,CAAA,GAAA,uCAAY,EAC3B,OACA,CAAA,GAAA,wBAAU,EAAE,CAAA,QAAS,IAAI,CAAA,GAAA,yCAAc,EAAE,OAAO,MAAM,UAAU;QAAC;KAAQ,GACzE;IAEF,IAAI,gBAAC,YAAY,oBAAE,gBAAgB,EAAC,GAAG,CAAA,GAAA,sCAAW,EAAE;QAClD,GAAG,KAAK;oBACR;QACA,kBAAkB,MAAM,gBAAgB,IAAI;IAC9C;IAEA,IAAI,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,4CAAiB,EACrD,MAAM,YAAY,GAAG,IAAI,IAAI,MAAM,YAAY,IAAI,WACnD,MAAM,mBAAmB,GAAG,IAAI,IAAI,MAAM,mBAAmB,IAAI,IAAI,OACrE,MAAM,gBAAgB;IAGxB,OAAO;oBACL;sBACA;0BACA;QACA,yBAAyB,MAAM,uBAAuB,IAAI;QAC1D,gBAAgB,MAAM,cAAc,IAAI;QACxC,8BAA8B,WAAW,IAAI,KAAK,KAAK;uCACvD;QACA,MAAK,SAAc,EAAE,SAAsC;YACzD,MAAM,YAAY,GAAG;gBACnB,QAAQ;gBACR,WACE,aACC,CAAA,MAAM,cAAc,EAAE,WAAW,YAC9B,6CAAuB,CAAC,MAAM,cAAc,CAAC,SAAS,CAAC,GACvD,WAAU;YAClB;QACF;sBACA;QACA,WAAU,GAAG;YACX,gBAAgB,CAAA;gBACd,IAAI,UAAU,IAAI,IAAI;gBACtB,IAAI,QAAQ,GAAG,CAAC,MACd,QAAQ,MAAM,CAAC;qBAEf,QAAQ,GAAG,CAAC;gBAGd,OAAO;YACT;QACF;oBACA;IACF;AACF;AAKO,SAAS,0CACd,KAAoB,EACpB,QAA4E;IAE5E,IAAI,aAAa,CAAA,GAAA,oBAAM,EACrB,IAAO,WAAW,MAAM,UAAU,CAAC,MAAM,CAAE,YAAY,MAAM,UAAU,EACvE;QAAC,MAAM,UAAU;QAAE;KAAS;IAE9B,IAAI,mBAAmB,MAAM,gBAAgB,CAAC,cAAc,CAAC;IAC7D,8DAA8D;IAE9D,OAAO;QACL,GAAG,KAAK;oBACR;0BACA;IACF;AACF","sources":["packages/react-stately/src/table/useTableState.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n  Expandable,\n  Key,\n  MultipleSelection,\n  Node,\n  SelectionMode,\n  Sortable,\n  SortDescriptor,\n  SortDirection\n} from '@react-types/shared';\nimport {GridState, useGridState} from '../grid/useGridState';\nimport {ITableCollection, TableCollection} from './TableCollection';\nimport {MultipleSelectionState} from '../selection/types';\nimport {MultipleSelectionStateProps} from '../selection/useMultipleSelectionState';\nimport {ReactElement, useCallback, useMemo, useState} from 'react';\nimport {TableBodyProps} from './TableBody';\nimport {TableHeaderProps} from './TableHeader';\nimport {useCollection} from '../collections/useCollection';\nimport {useControlledState} from '../utils/useControlledState';\n\nexport interface TableProps<T> extends MultipleSelection, Sortable, Expandable {\n  /** The elements that make up the table. Includes the TableHeader, TableBody, Columns, and Rows. */\n  children: [ReactElement<TableHeaderProps<T>>, ReactElement<TableBodyProps<T>>];\n  /** A list of row keys to disable. */\n  disabledKeys?: Iterable<Key>;\n  /**\n   * Whether pressing the escape key should clear selection in the table or not.\n   *\n   * Most experiences should not modify this option as it eliminates a keyboard user's ability to\n   * easily clear selection. Only use if the escape key is being handled externally or should not\n   * trigger selection clearing contextually.\n   *\n   * @default 'clearSelection'\n   */\n  escapeKeyBehavior?: 'clearSelection' | 'none';\n  /** Whether selection should occur on press up instead of press down. */\n  shouldSelectOnPressUp?: boolean;\n  /** The id of the column that displays hierarchical data. */\n  treeColumn?: Key;\n}\n\nexport interface TableState<T> extends GridState<T, ITableCollection<T>> {\n  /** A collection of rows and columns in the table. */\n  collection: ITableCollection<T>;\n  /** Whether the row selection checkboxes should be displayed. */\n  showSelectionCheckboxes: boolean;\n  /** The current sorted column and direction. */\n  sortDescriptor: SortDescriptor | null;\n  /** Calls the provided onSortChange handler with the provided column key and sort direction. */\n  sort(columnKey: Key, direction?: 'ascending' | 'descending'): void;\n  /**\n   * Whether keyboard navigation is disabled, such as when the arrow keys should be handled by a\n   * component within a cell.\n   */\n  isKeyboardNavigationDisabled: boolean;\n  /**\n   * Set whether keyboard navigation is disabled, such as when the arrow keys should be handled by a\n   * component within a cell.\n   */\n  setKeyboardNavigationDisabled: (val: boolean) => void;\n  /** A set of keys for items that are expanded. */\n  expandedKeys: Set<Key>;\n  /** Toggles the expanded state for a row by its key. */\n  toggleKey(key: Key): void;\n  /** The id of the column that displays hierarchical data. */\n  treeColumn: Key | null;\n}\n\nexport interface CollectionBuilderContext<T> {\n  showSelectionCheckboxes: boolean;\n  showDragButtons: boolean;\n  selectionMode: SelectionMode;\n  columns: Node<T>[];\n}\n\nexport interface TableStateProps<T> extends MultipleSelectionStateProps, Expandable, Sortable {\n  /** The elements that make up the table. Includes the TableHeader, TableBody, Columns, and Rows. */\n  children?: [ReactElement<TableHeaderProps<T>>, ReactElement<TableBodyProps<T>>];\n  /** A pre-constructed collection to use instead of building one from items and children. */\n  collection?: ITableCollection<T>;\n  /** Whether the row selection checkboxes should be displayed. */\n  showSelectionCheckboxes?: boolean;\n  /**\n   * Whether the row drag button should be displayed.\n   *\n   * @private\n   */\n  showDragButtons?: boolean;\n  /** @private - Do not use unless you know what you're doing. */\n  UNSAFE_selectionState?: MultipleSelectionState;\n  /** The id of the column that displays hierarchical data. */\n  treeColumn?: Key;\n}\n\nconst OPPOSITE_SORT_DIRECTION = {\n  ascending: 'descending' as SortDirection,\n  descending: 'ascending' as SortDirection\n};\n\n/**\n * Provides state management for a table component. Handles building a collection of columns and\n * rows from props. In addition, it tracks row selection and manages sort order changes.\n */\nexport function useTableState<T extends object>(props: TableStateProps<T>): TableState<T> {\n  let [isKeyboardNavigationDisabled, setKeyboardNavigationDisabled] = useState(false);\n  let {selectionMode = 'none', showSelectionCheckboxes, showDragButtons, treeColumn = null} = props;\n\n  let context = useMemo(\n    () => ({\n      showSelectionCheckboxes: showSelectionCheckboxes && selectionMode !== 'none',\n      showDragButtons: showDragButtons,\n      selectionMode,\n      columns: []\n    }),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [props.children, showSelectionCheckboxes, selectionMode, showDragButtons]\n  );\n\n  let collection = useCollection<T, ITableCollection<T>>(\n    props,\n    useCallback(nodes => new TableCollection(nodes, null, context), [context]),\n    context\n  );\n  let {disabledKeys, selectionManager} = useGridState({\n    ...props,\n    collection,\n    disabledBehavior: props.disabledBehavior || 'selection'\n  });\n\n  let [expandedKeys, setExpandedKeys] = useControlledState(\n    props.expandedKeys ? new Set(props.expandedKeys) : undefined,\n    props.defaultExpandedKeys ? new Set(props.defaultExpandedKeys) : new Set(),\n    props.onExpandedChange\n  );\n\n  return {\n    collection,\n    disabledKeys,\n    selectionManager,\n    showSelectionCheckboxes: props.showSelectionCheckboxes || false,\n    sortDescriptor: props.sortDescriptor ?? null,\n    isKeyboardNavigationDisabled: collection.size === 0 || isKeyboardNavigationDisabled,\n    setKeyboardNavigationDisabled,\n    sort(columnKey: Key, direction?: 'ascending' | 'descending') {\n      props.onSortChange?.({\n        column: columnKey,\n        direction:\n          direction ??\n          (props.sortDescriptor?.column === columnKey\n            ? OPPOSITE_SORT_DIRECTION[props.sortDescriptor.direction]\n            : 'ascending')\n      });\n    },\n    expandedKeys,\n    toggleKey(key) {\n      setExpandedKeys(keys => {\n        let newKeys = new Set(keys);\n        if (newKeys.has(key)) {\n          newKeys.delete(key);\n        } else {\n          newKeys.add(key);\n        }\n\n        return newKeys;\n      });\n    },\n    treeColumn\n  };\n}\n\n/**\n * Filters a collection using the provided filter function and returns a new TableState.\n */\nexport function UNSTABLE_useFilteredTableState<T extends object>(\n  state: TableState<T>,\n  filterFn: ((nodeValue: string, node: Node<T>) => boolean) | null | undefined\n): TableState<T> {\n  let collection = useMemo(\n    () => (filterFn ? state.collection.filter!(filterFn) : state.collection),\n    [state.collection, filterFn]\n  ) as ITableCollection<T>;\n  let selectionManager = state.selectionManager.withCollection(collection);\n  // TODO: handle focus key reset? That logic is in useGridState\n\n  return {\n    ...state,\n    collection,\n    selectionManager\n  };\n}\n"],"names":[],"version":3,"file":"useTableState.cjs.map"}