{"mappings":"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","sources":["packages/react-aria/src/table/useTableRow.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 {AriaButtonProps} from '../button/useButton';\n\nimport {Collection, FocusableElement, Node, RefObject} from '@react-types/shared';\nimport {getRowLabelledBy} from './utils';\nimport {GridRowAria, GridRowProps, useGridRow} from '../grid/useGridRow';\nimport {HTMLAttributes} from 'react';\nimport intlMessages from '../../intl/table/*.json';\nimport {ITableCollection} from 'react-stately/private/table/TableCollection';\nimport {mergeProps} from '../utils/mergeProps';\nimport {TableState} from 'react-stately/useTableState';\nimport {TreeGridState} from 'react-stately/private/table/useTreeGridState';\nimport {useLabels} from '../utils/useLabels';\nimport {useLocale} from '../i18n/I18nProvider';\nimport {useLocalizedStringFormatter} from '../i18n/useLocalizedStringFormatter';\nimport {useSyntheticLinkProps} from '../utils/openLink';\n\nconst EXPANSION_KEYS = {\n  expand: {\n    ltr: 'ArrowRight',\n    rtl: 'ArrowLeft'\n  },\n  collapse: {\n    ltr: 'ArrowLeft',\n    rtl: 'ArrowRight'\n  }\n};\n\nexport interface TableRowAria extends GridRowAria {\n  expandButtonProps: AriaButtonProps;\n}\n\n/**\n * Provides the behavior and accessibility implementation for a row in a table.\n *\n * @param props - Props for the row.\n * @param state - State of the table, as returned by `useTableState`.\n */\nexport function useTableRow<T>(\n  props: GridRowProps<T>,\n  state: TableState<T> | TreeGridState<T>,\n  ref: RefObject<FocusableElement | null>\n): TableRowAria {\n  let {node, isVirtualized} = props;\n  let {rowProps, ...states} = useGridRow<T, ITableCollection<T>, TableState<T>>(\n    props,\n    state as TableState<T>,\n    ref\n  );\n  let {direction} = useLocale();\n\n  if (isVirtualized && state.treeColumn == null) {\n    rowProps['aria-rowindex'] = node.index + 1 + state.collection.headerRows.length; // aria-rowindex is 1 based\n  } else {\n    delete rowProps['aria-rowindex'];\n  }\n\n  let isExpanded =\n    state.treeColumn != null && (state.expandedKeys === 'all' || state.expandedKeys.has(node.key));\n  let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-aria/table');\n  let labelProps = useLabels({\n    'aria-label': isExpanded\n      ? stringFormatter.format('collapse')\n      : stringFormatter.format('expand'),\n    'aria-labelledby': getRowLabelledBy(state as TableState<T>, node.key)\n  });\n\n  let treeGridRowProps: HTMLAttributes<HTMLElement> = {};\n  let expandButtonProps: AriaButtonProps = {};\n  if (state.treeColumn != null) {\n    let treeNode = state.collection.getItem(node.key);\n    if (treeNode != null) {\n      let lastChild = getLastChild(state.collection, node);\n      let hasChildRows =\n        treeNode.props?.hasChildRows ||\n        treeNode.props?.UNSTABLE_childItems ||\n        lastChild?.type !== 'cell';\n      let parent = state.collection.getItem(node.parentKey!)!;\n      let isParentBody = parent.type === 'tablebody' || parent.type === 'body';\n      let lastSibling = getLastChild(state.collection, parent)!;\n      while (lastSibling && lastSibling.type !== 'item' && lastSibling.prevKey != null) {\n        lastSibling = state.collection.getItem(lastSibling.prevKey)!;\n      }\n\n      treeGridRowProps = {\n        onKeyDown: e => {\n          if (\n            e.key === EXPANSION_KEYS['expand'][direction] &&\n            state.selectionManager.focusedKey === treeNode.key &&\n            hasChildRows &&\n            state.expandedKeys !== 'all' &&\n            !state.expandedKeys.has(treeNode.key)\n          ) {\n            state.toggleKey(treeNode.key);\n            e.stopPropagation();\n          } else if (\n            e.key === EXPANSION_KEYS['collapse'][direction] &&\n            state.selectionManager.focusedKey === treeNode.key\n          ) {\n            if (state.expandedKeys !== 'all') {\n              if (hasChildRows && state.expandedKeys.has(treeNode.key)) {\n                state.toggleKey(treeNode.key);\n                e.stopPropagation();\n              } else if (\n                !state.expandedKeys.has(treeNode.key) &&\n                treeNode.parentKey != null &&\n                treeNode.level > 0\n              ) {\n                // Item is a leaf or already collapsed, move focus to parent\n                state.selectionManager.setFocusedKey(treeNode.parentKey);\n                e.stopPropagation();\n              }\n            } else if (state.expandedKeys === 'all') {\n              state.toggleKey(treeNode.key);\n              e.stopPropagation();\n            }\n          }\n        },\n        'aria-expanded': hasChildRows\n          ? state.expandedKeys === 'all' || state.expandedKeys.has(node.key)\n          : undefined,\n        'aria-level': treeNode.level + 1,\n        'aria-posinset': treeNode.index - (isParentBody ? 0 : state.collection.columnCount) + 1,\n        'aria-setsize': lastSibling.index - (isParentBody ? 0 : state.collection.columnCount) + 1\n      };\n\n      expandButtonProps = {\n        isDisabled: states.isDisabled,\n        onPress: () => {\n          if (!states.isDisabled) {\n            state.toggleKey(node.key);\n            state.selectionManager.setFocused(true);\n            state.selectionManager.setFocusedKey(node.key);\n          }\n        },\n        excludeFromTabOrder: true,\n        preventFocusOnPress: true,\n        // @ts-ignore\n        'data-react-aria-prevent-focus': true,\n        ...labelProps\n      };\n    }\n  }\n\n  let syntheticLinkProps = useSyntheticLinkProps(node.props);\n  let linkProps = states.hasAction ? syntheticLinkProps : {};\n  return {\n    rowProps: {\n      ...mergeProps(rowProps, treeGridRowProps, linkProps),\n      'aria-labelledby': getRowLabelledBy(state as TableState<T>, node.key)\n    },\n    expandButtonProps,\n    ...states\n  };\n}\n\nfunction getLastChild(collection: Collection<Node<unknown>>, node: Node<unknown>) {\n  if ('lastChildKey' in node) {\n    return node.lastChildKey != null ? collection.getItem(node.lastChildKey) : null;\n  } else {\n    return Array.from(node.childNodes).findLast(item => item.parentKey === node.key);\n  }\n}\n"],"names":[],"version":3,"file":"useTableRow.mjs.map"}