UNPKG

primereact

Version:

PrimeReact is an open source UI library for React featuring a rich set of 90+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with Prime

1,302 lines (1,276 loc) 150 kB
'use client'; import * as React from 'react'; import PrimeReact, { FilterMatchMode, PrimeReactContext, ariaLabel, localeOption, FilterService } from 'primereact/api'; import { ComponentBase, useHandleStyle } from 'primereact/componentbase'; import { ObjectUtils, classNames, DomHandler, IconUtils } from 'primereact/utils'; import { useMergeProps, useUpdateEffect, useMountEffect, useEventListener, useUnmountEffect } from 'primereact/hooks'; import { ArrowDownIcon } from 'primereact/icons/arrowdown'; import { ArrowUpIcon } from 'primereact/icons/arrowup'; import { SpinnerIcon } from 'primereact/icons/spinner'; import { Paginator } from 'primereact/paginator'; import { CheckIcon } from 'primereact/icons/check'; import { Tooltip } from 'primereact/tooltip'; import { ChevronDownIcon } from 'primereact/icons/chevrondown'; import { ChevronRightIcon } from 'primereact/icons/chevronright'; import { MinusIcon } from 'primereact/icons/minus'; import { Ripple } from 'primereact/ripple'; import { OverlayService } from 'primereact/overlayservice'; import { SortAltIcon } from 'primereact/icons/sortalt'; import { SortAmountDownIcon } from 'primereact/icons/sortamountdown'; import { SortAmountUpAltIcon } from 'primereact/icons/sortamountupalt'; import { InputText } from 'primereact/inputtext'; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function toPropertyKey(t) { var i = toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _defineProperty(e, r, t) { return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _arrayLikeToArray$4(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray$4(r); } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _unsupportedIterableToArray$4(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$4(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$4(r, a) : void 0; } } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray$4(r) || _nonIterableSpread(); } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray$4(r, e) || _nonIterableRest(); } var getStorage = function getStorage(stateStorageProp) { switch (stateStorageProp) { case 'local': return window.localStorage; case 'session': return window.sessionStorage; case 'custom': return null; default: throw new Error(stateStorageProp + ' is not a valid value for the state storage, supported values are "local", "session" and "custom".'); } }; var ColumnBase = ComponentBase.extend({ defaultProps: { __TYPE: 'Column', align: null, alignFrozen: 'left', alignHeader: null, body: null, bodyClassName: null, bodyStyle: null, cellEditValidateOnClose: false, cellEditValidator: null, cellEditValidatorEvent: 'click', className: null, colSpan: null, columnKey: null, dataType: 'text', editor: null, excludeGlobalFilter: false, expander: false, exportField: null, exportable: true, field: null, filter: false, filterApply: null, filterClear: null, filterElement: null, filterField: null, filterFooter: null, filterFunction: null, filterHeader: null, filterHeaderClassName: null, filterHeaderStyle: null, filterMatchMode: null, filterMatchModeOptions: null, filterMaxLength: null, filterMenuClassName: null, filterMenuStyle: null, filterPlaceholder: null, filterType: 'text', footer: null, footerClassName: null, footerStyle: null, frozen: false, header: null, headerClassName: null, headerStyle: null, headerTooltip: null, headerTooltipOptions: null, hidden: false, maxConstraints: 2, onBeforeCellEditHide: null, onBeforeCellEditShow: null, onCellEditCancel: null, onCellEditComplete: null, onCellEditInit: null, onFilterApplyClick: null, onFilterClear: null, onFilterConstraintAdd: null, onFilterConstraintRemove: null, onFilterMatchModeChange: null, onFilterOperatorChange: null, reorderable: true, resizeable: true, rowEditor: false, rowReorder: false, rowReorderIcon: null, rowSpan: null, selectionMode: null, showAddButton: true, showApplyButton: true, showClearButton: true, showFilterMatchModes: true, showFilterMenu: true, showFilterMenuOptions: true, showFilterOperator: true, sortField: null, sortFunction: null, sortable: false, sortableDisabled: false, style: null, children: undefined }, getCProp: function getCProp(column, name) { return ObjectUtils.getComponentProp(column, name, ColumnBase.defaultProps); }, getCProps: function getCProps(column) { return ObjectUtils.getComponentProps(column, ColumnBase.defaultProps); }, getCOtherProps: function getCOtherProps(column) { return ObjectUtils.getComponentDiffProps(column, ColumnBase.defaultProps); } }); var styles = "\n@layer primereact {\n .p-treetable {\n position: relative;\n }\n .p-treetable > .p-treetable-wrapper {\n overflow: auto;\n }\n .p-treetable table {\n border-collapse: collapse;\n width: 100%;\n table-layout: fixed;\n }\n .p-treetable .p-sortable-column {\n cursor: pointer;\n user-select: none;\n }\n .p-treetable-selectable .p-treetable-tbody > tr {\n cursor: pointer;\n }\n .p-treetable-toggler {\n cursor: pointer;\n user-select: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n vertical-align: middle;\n overflow: hidden;\n position: relative;\n }\n .p-treetable-toggler + .p-checkbox {\n vertical-align: middle;\n }\n .p-treetable-toggler + .p-checkbox + span {\n vertical-align: middle;\n }\n /* Resizable */\n .p-treetable-resizable > .p-treetable-wrapper {\n overflow-x: auto;\n }\n .p-treetable-resizable .p-treetable-thead > tr > th,\n .p-treetable-resizable .p-treetable-tfoot > tr > td,\n .p-treetable-resizable .p-treetable-tbody > tr > td {\n overflow: hidden;\n }\n .p-treetable-resizable .p-resizable-column {\n background-clip: padding-box;\n position: relative;\n }\n .p-treetable-resizable-fit .p-resizable-column:last-child .p-column-resizer {\n display: none;\n }\n .p-treetable .p-column-resizer {\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n margin: 0;\n width: 0.5rem;\n height: 100%;\n padding: 0px;\n cursor: col-resize;\n border: 1px solid transparent;\n }\n .p-treetable .p-column-resizer-helper {\n width: 1px;\n position: absolute;\n z-index: 10;\n display: none;\n }\n /* Scrollable */\n .p-treetable-scrollable-wrapper {\n position: relative;\n }\n .p-treetable-scrollable-header,\n .p-treetable-scrollable-footer {\n overflow: hidden;\n border: 0 none;\n }\n .p-treetable-scrollable-body {\n overflow: auto;\n position: relative;\n }\n .p-treetable-virtual-table {\n position: absolute;\n }\n /* Frozen Columns */\n .p-treetable-frozen-view .p-treetable-scrollable-body {\n overflow: hidden;\n }\n .p-treetable-unfrozen-view {\n position: absolute;\n top: 0px;\n left: 0px;\n }\n /* Reorder */\n .p-treetable-reorder-indicator-up,\n .p-treetable-reorder-indicator-down {\n position: absolute;\n display: none;\n }\n /* Loader */\n .p-treetable .p-treetable-loading-overlay {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2;\n }\n /* Alignment */\n .p-treetable .p-treetable-thead > tr > th.p-align-left > .p-column-header-content,\n .p-treetable .p-treetable-tbody > tr > td.p-align-left,\n .p-treetable .p-treetable-tfoot > tr > td.p-align-left {\n text-align: left;\n justify-content: flex-start;\n }\n .p-treetable .p-treetable-thead > tr > th.p-align-right > .p-column-header-content,\n .p-treetable .p-treetable-tbody > tr > td.p-align-right,\n .p-treetable .p-treetable-tfoot > tr > td.p-align-right {\n text-align: right;\n justify-content: flex-end;\n }\n .p-treetable .p-treetable-thead > tr > th.p-align-center > .p-column-header-content,\n .p-treetable .p-treetable-tbody > tr > td.p-align-center,\n .p-treetable .p-treetable-tfoot > tr > td.p-align-center {\n text-align: center;\n justify-content: center;\n }\n}\n"; var classes$1 = { root: function root(_ref) { var props = _ref.props, isRowSelectionMode = _ref.isRowSelectionMode; return classNames('p-treetable p-component', { 'p-treetable-hoverable-rows': props.rowHover, 'p-treetable-selectable': isRowSelectionMode(), 'p-treetable-resizable': props.resizableColumns, 'p-treetable-resizable-fit': props.resizableColumns && props.columnResizeMode === 'fit', 'p-treetable-striped': props.stripedRows, 'p-treetable-gridlines': props.showGridlines }); }, loadingIcon: 'p-treetable-loading-icon', loadingWrapper: 'p-treetable-loading', loadingOverlay: 'p-treetable-loading-overlay p-component-overlay', header: 'p-treetable-header', checkIcon: 'p-checkbox-icon', footer: 'p-treetable-footer', resizeHelper: 'p-column-resizer-helper', reorderIndicatorUp: 'p-treetable-reorder-indicator-up', reorderIndicatorDown: 'p-treetable-reorder-indicator-down', wrapper: 'p-treetable-wrapper', table: function table(_ref2) { var props = _ref2.props; return classNames('p-treetable-table', { 'p-treetable-scrollable-table': props.scrollable, 'p-treetable-resizable-table': props.resizableColumns, 'p-treetable-resizable-table-fit': props.resizableColumns && props.columnResizeMode === 'fit' }); }, scrollableWrapper: 'p-treetable-wrapper p-treetable-scrollable-wrapper', thead: 'p-treetable-thead', tbody: 'p-treetable-tbody', tfoot: 'p-treetable-tfoot', emptyMessage: 'p-treetable-emptymessage', bodyCell: function bodyCell(_ref3) { var props = _ref3.bodyProps, editingState = _ref3.editingState, align = _ref3.align; return classNames(_defineProperty({ 'p-editable-column': props.editor, 'p-cell-editing': props.editor ? editingState : false }, "p-align-".concat(align), !!align)); }, sortBadge: 'p-sortable-column-badge', headerTitle: 'p-column-title', headerContent: 'p-column-header-content', headerCell: function headerCell(_ref4) { var props = _ref4.headerProps, frozen = _ref4.frozen, column = _ref4.column, options = _ref4.options, getColumnProp = _ref4.getColumnProp, sorted = _ref4.sorted, align = _ref4.align; return options.filterOnly ? classNames('p-filter-column', { 'p-frozen-column': frozen }) : classNames(_defineProperty({ 'p-sortable-column': getColumnProp(column, 'sortable'), 'p-highlight': sorted, 'p-frozen-column': frozen, 'p-resizable-column': props.resizableColumns && getColumnProp(column, 'resizeable'), 'p-reorderable-column': props.reorderableColumns && getColumnProp(column, 'reorderable') && !frozen }, "p-align-".concat(align), !!align)); }, columnResizer: 'p-column-resizer p-clickable', sortIcon: 'p-sortable-column-icon', row: function row(_ref5) { var isSelected = _ref5.isSelected, props = _ref5.rowProps; return { 'p-highlight': isSelected(), 'p-highlight-contextmenu': props.contextMenuSelectionKey && props.contextMenuSelectionKey === props.node.key, 'p-row-odd': parseInt(String(props.rowIndex).split('_').pop(), 10) % 2 !== 0 }; }, rowCheckbox: function rowCheckbox(_ref6) { var partialChecked = _ref6.partialChecked; return classNames('p-treetable-checkbox', { 'p-indeterminate': partialChecked }); }, rowToggler: 'p-treetable-toggler p-link p-unselectable-text', rowTogglerIcon: 'p-treetable-toggler-icon', scrollableBody: 'p-treetable-scrollable-body', scrollableHeaderTable: 'p-treetable-scrollable-header-table', scrollableHeaderBox: 'p-treetable-scrollable-header-box', scrollableHeader: 'p-treetable-scrollable-header', scrollableBodyTable: 'p-treetable-scrollable-body-table', scrollableFooter: 'p-treetable-scrollable-footer', scrollableFooterBox: 'p-treetable-scrollable-footer-box', scrollableFooterTable: 'p-treetable-scrollable-footer-table', scrollable: function scrollable(_ref7) { var props = _ref7.scrolaableProps; return classNames('p-treetable-scrollable-view', { 'p-treetable-frozen-view': props.frozen, 'p-treetable-unfrozen-view': !props.frozen && props.frozenWidth }); }, scrollableColgroup: 'p-treetable-scrollable-colgroup' }; var TreeTableBase = ComponentBase.extend({ defaultProps: { __TYPE: 'TreeTable', alwaysShowPaginator: true, checkboxIcon: null, className: null, columnResizeMode: 'fit', contextMenuSelectionKey: null, currentPageReportTemplate: '({currentPage} of {totalPages})', customRestoreState: null, customSaveState: null, defaultSortOrder: 1, emptyMessage: null, expandedKeys: null, filterDelay: 300, filterLocale: undefined, filterMode: 'lenient', filters: null, first: null, footer: null, footerColumnGroup: null, frozenFooterColumnGroup: null, frozenHeaderColumnGroup: null, frozenWidth: null, globalFilter: null, globalFilterMatchMode: FilterMatchMode.CONTAINS, header: null, headerColumnGroup: null, id: null, lazy: false, loading: false, loadingIcon: null, metaKeySelection: false, multiSortMeta: null, onColReorder: null, onCollapse: null, onColumnResizeEnd: null, onContextMenu: null, onContextMenuSelectionChange: null, onExpand: null, onFilter: null, onPage: null, onRowClick: null, onRowMouseEnter: null, onRowMouseLeave: null, onSelect: null, onSelectionChange: null, onSort: null, onStateRestore: null, onStateSave: null, onToggle: null, onUnselect: null, onValueChange: null, pageLinkSize: 5, paginator: false, paginatorClassName: null, paginatorDropdownAppendTo: null, paginatorLeft: null, paginatorPosition: 'bottom', paginatorRight: null, paginatorTemplate: 'FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink RowsPerPageDropdown', propagateSelectionDown: true, propagateSelectionUp: true, removableSort: false, reorderIndicatorDownIcon: null, reorderIndicatorUpIcon: null, reorderableColumns: false, resizableColumns: false, rowClassName: null, rowHover: false, rows: null, rowsPerPageOptions: null, scrollHeight: null, scrollable: false, selectOnEdit: true, selectionKeys: null, selectionMode: null, showGridlines: false, sortField: null, sortIcon: null, sortMode: 'single', sortOrder: null, stateKey: null, stateStorage: null, stripedRows: false, style: null, tabIndex: 0, tableClassName: null, tableStyle: null, totalRecords: null, value: null, children: undefined, togglerTemplate: null }, css: { classes: classes$1, styles: styles } }); var classes = { box: 'p-checkbox-box', input: 'p-checkbox-input', icon: 'p-checkbox-icon', root: function root(_ref) { var props = _ref.props, checked = _ref.checked, context = _ref.context; return classNames('p-checkbox p-component', { 'p-highlight': checked, 'p-disabled': props.disabled, 'p-invalid': props.invalid, 'p-variant-filled': props.variant ? props.variant === 'filled' : context && context.inputStyle === 'filled' }); } }; var CheckboxBase = ComponentBase.extend({ defaultProps: { __TYPE: 'Checkbox', autoFocus: false, checked: false, className: null, disabled: false, falseValue: false, icon: null, id: null, inputId: null, inputRef: null, invalid: false, variant: null, name: null, onChange: null, onContextMenu: null, onMouseDown: null, readOnly: false, required: false, style: null, tabIndex: null, tooltip: null, tooltipOptions: null, trueValue: true, value: null, children: undefined }, css: { classes: classes } }); function ownKeys$6(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread$6(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$6(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$6(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var Checkbox = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (inProps, ref) { var mergeProps = useMergeProps(); var context = React.useContext(PrimeReactContext); var props = CheckboxBase.getProps(inProps, context); var _React$useState = React.useState(false), _React$useState2 = _slicedToArray(_React$useState, 2), focusedState = _React$useState2[0], setFocusedState = _React$useState2[1]; var _CheckboxBase$setMeta = CheckboxBase.setMetaData({ props: props, state: { focused: focusedState }, context: { checked: props.checked === props.trueValue, disabled: props.disabled } }), ptm = _CheckboxBase$setMeta.ptm, cx = _CheckboxBase$setMeta.cx, isUnstyled = _CheckboxBase$setMeta.isUnstyled; useHandleStyle(CheckboxBase.css.styles, isUnstyled, { name: 'checkbox' }); var elementRef = React.useRef(null); var inputRef = React.useRef(props.inputRef); var isChecked = function isChecked() { return props.checked === props.trueValue; }; var _onChange = function onChange(event) { if (props.disabled || props.readOnly) { return; } if (props.onChange) { var _props$onChange; var _checked = isChecked(); var value = _checked ? props.falseValue : props.trueValue; var eventData = { originalEvent: event, value: props.value, checked: value, stopPropagation: function stopPropagation() { event === null || event === void 0 || event.stopPropagation(); }, preventDefault: function preventDefault() { event === null || event === void 0 || event.preventDefault(); }, target: { type: 'checkbox', name: props.name, id: props.id, value: props.value, checked: value } }; props === null || props === void 0 || (_props$onChange = props.onChange) === null || _props$onChange === void 0 || _props$onChange.call(props, eventData); // do not continue if the user defined click wants to prevent if (event.defaultPrevented) { return; } DomHandler.focus(inputRef.current); } }; var _onFocus = function onFocus(event) { var _props$onFocus; setFocusedState(true); props === null || props === void 0 || (_props$onFocus = props.onFocus) === null || _props$onFocus === void 0 || _props$onFocus.call(props, event); }; var _onBlur = function onBlur(event) { var _props$onBlur; setFocusedState(false); props === null || props === void 0 || (_props$onBlur = props.onBlur) === null || _props$onBlur === void 0 || _props$onBlur.call(props, event); }; React.useImperativeHandle(ref, function () { return { props: props, focus: function focus() { return DomHandler.focus(inputRef.current); }, getElement: function getElement() { return elementRef.current; }, getInput: function getInput() { return inputRef.current; } }; }); React.useEffect(function () { ObjectUtils.combinedRefs(inputRef, props.inputRef); }, [inputRef, props.inputRef]); useUpdateEffect(function () { inputRef.current.checked = isChecked(); }, [props.checked, props.trueValue]); useMountEffect(function () { if (props.autoFocus) { DomHandler.focus(inputRef.current, props.autoFocus); } }); var checked = isChecked(); var hasTooltip = ObjectUtils.isNotEmpty(props.tooltip); var otherProps = CheckboxBase.getOtherProps(props); var rootProps = mergeProps({ id: props.id, className: classNames(props.className, cx('root', { checked: checked, context: context })), style: props.style, 'data-p-highlight': checked, 'data-p-disabled': props.disabled, onContextMenu: props.onContextMenu, onMouseDown: props.onMouseDown }, otherProps, ptm('root')); var createInputElement = function createInputElement() { var ariaProps = ObjectUtils.reduceKeys(otherProps, DomHandler.ARIA_PROPS); var inputProps = mergeProps(_objectSpread$6({ id: props.inputId, type: 'checkbox', className: cx('input'), name: props.name, tabIndex: props.tabIndex, onFocus: function onFocus(e) { return _onFocus(e); }, onBlur: function onBlur(e) { return _onBlur(e); }, onChange: function onChange(e) { return _onChange(e); }, disabled: props.disabled, readOnly: props.readOnly, required: props.required, 'aria-invalid': props.invalid, checked: checked }, ariaProps), ptm('input')); return /*#__PURE__*/React.createElement("input", _extends({ ref: inputRef }, inputProps)); }; var createBoxElement = function createBoxElement() { var iconProps = mergeProps({ className: cx('icon') }, ptm('icon')); var boxProps = mergeProps({ className: cx('box', { checked: checked }), 'data-p-highlight': checked, 'data-p-disabled': props.disabled }, ptm('box')); var icon = checked ? props.icon || /*#__PURE__*/React.createElement(CheckIcon, iconProps) : null; var checkboxIcon = IconUtils.getJSXIcon(icon, _objectSpread$6({}, iconProps), { props: props, checked: checked }); return /*#__PURE__*/React.createElement("div", boxProps, checkboxIcon); }; return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", _extends({ ref: elementRef }, rootProps), createInputElement(), createBoxElement()), hasTooltip && /*#__PURE__*/React.createElement(Tooltip, _extends({ target: elementRef, content: props.tooltip, pt: ptm('tooltip') }, props.tooltipOptions))); })); Checkbox.displayName = 'Checkbox'; function ownKeys$5(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread$5(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$5(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$5(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var TreeTableBodyCell = function TreeTableBodyCell(props) { var _React$useState = React.useState(false), _React$useState2 = _slicedToArray(_React$useState, 2), editingState = _React$useState2[0], setEditingState = _React$useState2[1]; var elementRef = React.useRef(null); var keyHelperRef = React.useRef(null); var selfClick = React.useRef(false); var overlayEventListener = React.useRef(null); var tabIndexTimeout = React.useRef(null); var mergeProps = useMergeProps(); var getColumnProp = function getColumnProp(name) { return ColumnBase.getCProp(props.column, name); }; var getColumnProps = function getColumnProps(column) { return ColumnBase.getCProps(column); }; var _props$ptCallbacks = props.ptCallbacks, ptm = _props$ptCallbacks.ptm, ptmo = _props$ptCallbacks.ptmo, cx = _props$ptCallbacks.cx; var getColumnPTOptions = function getColumnPTOptions(key) { var isSingleSelectionMode = props.metaData.props.selectionMode === 'single'; var isMultipleSelectionMode = props.metaData.props.selectionMode === 'multiple'; var cProps = getColumnProps(props.column); var columnMetadata = { props: cProps, parent: props.metaData, hostName: props.hostName, state: { editing: editingState }, context: { index: props.index, selectable: isSingleSelectionMode || isMultipleSelectionMode, selected: props.selected, scrollable: props.metaData.props.scrollable, frozen: getColumnProp('frozen'), showGridlines: props.metaData.props.showGridlines } }; return mergeProps(ptm("column.".concat(key), { column: columnMetadata }), ptm("column.".concat(key), columnMetadata), ptmo(cProps, key, columnMetadata)); }; var field = getColumnProp('field') || "field_".concat(props.index); var getCellParams = function getCellParams() { return { value: resolveFieldData(), field: field, rowData: props.rowData, rowIndex: props.rowIndex, cellIndex: props.index, selected: isSelected(), column: props.column, props: props }; }; var getCellCallbackParams = function getCellCallbackParams(event) { var params = getCellParams(); return _objectSpread$5({ originalEvent: event }, params); }; var resolveFieldData = function resolveFieldData(data) { return ObjectUtils.resolveFieldData(data || props.node.data, field); }; var _useEventListener = useEventListener({ type: 'click', listener: function listener(e) { if (!selfClick.current && isOutsideClicked(e.target)) { switchCellToViewMode(e); } selfClick.current = false; }, when: getColumnProp('editor') }), _useEventListener2 = _slicedToArray(_useEventListener, 2), bindDocumentClickListener = _useEventListener2[0], unbindDocumentClickListener = _useEventListener2[1]; var _onClick = function onClick(event) { if (getColumnProp('editor') && !editingState && (props.selectOnEdit || !props.selectOnEdit && props.selected)) { selfClick.current = true; var params = getCellCallbackParams(event); var onBeforeCellEditShow = getColumnProp('onBeforeCellEditShow'); if (onBeforeCellEditShow) { // if user returns false do not show the editor if (onBeforeCellEditShow(params) === false) { return; } // if user prevents default stop the editor if (event && event.defaultPrevented) { return; } } setEditingState(true); var onCellEditInit = getColumnProp('onCellEditInit'); if (onCellEditInit) { if (onCellEditInit(params) === false) { return; } // if user prevents default stop the editor if (event && event.defaultPrevented) { return; } } bindDocumentClickListener(); overlayEventListener.current = function (e) { if (!isOutsideClicked(e.target)) { selfClick.current = true; } }; OverlayService.on('overlay-click', overlayEventListener.current); } }; var _onKeyDown = function onKeyDown(event) { if (event.which === 13 || event.which === 9) { switchCellToViewMode(event); } }; var isOutsideClicked = function isOutsideClicked(target) { return elementRef.current && !(elementRef.current.isSameNode(target) || elementRef.current.contains(target)); }; var closeCell = function closeCell() { /* When using the 'tab' key, the focus event of the next cell is not called in IE. */ setTimeout(function () { setEditingState(false); unbindDocumentClickListener(); OverlayService.off('overlay-click', overlayEventListener.current); overlayEventListener.current = null; }, 1); }; var onEditorFocus = function onEditorFocus(event) { _onClick(event); }; var switchCellToViewMode = function switchCellToViewMode(event) { if (props.cellEditValidator) { var valid = props.cellEditValidator({ originalEvent: event, columnProps: props }); if (valid) { closeCell(); } } else { closeCell(); } }; var isSelected = function isSelected() { return props.selection ? props.selection instanceof Array ? findIndex(props.selection) > -1 : equals(props.selection) : false; }; React.useEffect(function () { if (elementRef.current && getColumnProp('editor')) { clearTimeout(tabIndexTimeout.current); if (editingState) { var focusable = DomHandler.findSingle(elementRef.current, 'input'); if (focusable && document.activeElement !== focusable && !focusable.hasAttribute('data-isCellEditing')) { focusable.setAttribute('data-isCellEditing', true); focusable.focus(); } keyHelperRef.current.tabIndex = -1; } else { tabIndexTimeout.current = setTimeout(function () { if (keyHelperRef.current) { keyHelperRef.current.setAttribute('tabindex', 0); } }, 50); } } }); useUnmountEffect(function () { if (overlayEventListener.current) { OverlayService.off('overlay-click', overlayEventListener.current); overlayEventListener.current = null; } }); var bodyClassName = ObjectUtils.getPropValue(props.bodyClassName, props.node.data, { field: props.field, rowIndex: props.rowIndex, props: props }); var style = props.bodyStyle || props.style; var columnEditor = getColumnProp('editor'); var content; if (editingState) { if (columnEditor) { content = ObjectUtils.getJSXElement(columnEditor, { node: props.node, rowData: props.rowData, value: ObjectUtils.resolveFieldData(props.node.data, props.field), field: props.field, rowIndex: props.rowIndex, props: props }); } else { throw new Error('Editor is not found on column.'); } } else if (props.body) { content = ObjectUtils.getJSXElement(props.body, props.node, { field: props.field, rowIndex: props.rowIndex, props: props }); } else { content = ObjectUtils.resolveFieldData(props.node.data, props.field); } var editorKeyHelperProps = mergeProps({ tabIndex: 0, ref: keyHelperRef, className: 'p-cell-editor-key-helper p-hidden-accessible', onFocus: function onFocus(e) { return onEditorFocus(e); } }, getColumnPTOptions('editorKeyHelperLabel')); var editorKeyHelperLabelProps = mergeProps(getColumnPTOptions('editorKeyHelper')); /* eslint-disable */ var editorKeyHelper = columnEditor && /*#__PURE__*/React.createElement("a", editorKeyHelperProps, /*#__PURE__*/React.createElement("span", editorKeyHelperLabelProps)); var align = getColumnProp('align'); /* eslint-enable */ var bodyCellProps = mergeProps({ role: 'cell', className: classNames(bodyClassName || props.className, cx('bodyCell', { bodyProps: props, editingState: editingState, align: align })), style: style, onClick: function onClick(e) { return _onClick(e); }, onKeyDown: function onKeyDown(e) { return _onKeyDown(e); } }, getColumnPTOptions('root'), getColumnPTOptions('bodyCell')); return /*#__PURE__*/React.createElement("td", _extends({ ref: elementRef }, bodyCellProps), props.children, editorKeyHelper, content); }; TreeTableBodyCell.displayName = 'TreeTableBodyCell'; function _createForOfIteratorHelper$3(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$3(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray$3(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$3(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$3(r, a) : void 0; } } function _arrayLikeToArray$3(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function ownKeys$4(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread$4(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$4(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$4(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var TreeTableRow = /*#__PURE__*/React.memo(function (props) { var elementRef = React.useRef(null); var nodeTouched = React.useRef(false); var mergeProps = useMergeProps(); var expanded = props.expandedKeys ? props.expandedKeys[props.node.key] !== undefined : false; var getColumnProp = function getColumnProp(column, name) { return ColumnBase.getCProp(column, name); }; var getColumnProps = function getColumnProps(column) { return ColumnBase.getCProps(column); }; var _props$ptCallbacks = props.ptCallbacks, ptm = _props$ptCallbacks.ptm, ptmo = _props$ptCallbacks.ptmo, cx = _props$ptCallbacks.cx, isUnstyled = _props$ptCallbacks.isUnstyled; var getColumnPTOptions = function getColumnPTOptions(column, key) { var cProps = getColumnProps(column); var columnMetadata = { props: cProps, parent: props.metaData, hostName: props.hostName, context: { index: props.rowIndex, selectable: props.node.selectable !== false, selected: isSelected(), frozen: getColumnProp(column, 'frozen'), scrollable: props.metaData.props.scrollable } }; return mergeProps(ptm("column.".concat(key), { column: columnMetadata }), ptm("column.".concat(key), columnMetadata), ptmo(cProps, key, columnMetadata)); }; var getColumnCheckboxPTOptions = function getColumnCheckboxPTOptions(column, key) { var cProps = getColumnProps(column); var columnMetadata = { props: cProps, parent: props.metaData, hostName: props.hostName, context: { checked: isChecked(), partialChecked: isPartialChecked() } }; return mergeProps(ptm("column.".concat(key), { column: columnMetadata }), ptm("column.".concat(key), columnMetadata), ptmo(cProps, key, columnMetadata)); }; var getRowPTOptions = function getRowPTOptions(key) { var rowMetadata = { hostName: props.hostName, context: { index: props.index, selected: isSelected(), selectable: props.node.selectable !== false, frozen: getColumnProp('frozen'), scrollable: props.metaData.props.scrollable, showGridlines: props.metaData.props.showGridlines } }; return ptm(key, rowMetadata); }; var onTogglerClick = function onTogglerClick(event) { expanded ? collapse(event) : expand(event); event.preventDefault(); event.stopPropagation(); }; var expand = function expand(event) { var navigateFocusToChild = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var expandedKeys = props.expandedKeys ? _objectSpread$4({}, props.expandedKeys) : {}; expandedKeys[props.node.key] = true; props.onToggle({ originalEvent: event, value: expandedKeys, navigateFocusToChild: navigateFocusToChild }); invokeToggleEvents(event, true); }; var collapse = function collapse(event) { var expandedKeys = _objectSpread$4({}, props.expandedKeys); delete expandedKeys[props.node.key]; props.onToggle({ originalEvent: event, value: expandedKeys }); invokeToggleEvents(event, false); }; var invokeToggleEvents = function invokeToggleEvents(event, expanded) { if (expanded) { if (props.onExpand) { props.onExpand({ originalEvent: event, node: props.node }); } } else if (props.onCollapse) { props.onCollapse({ originalEvent: event, node: props.node }); } }; var _onClick = function onClick(event) { if (props.onRowClick) { props.onRowClick(event, props.node); } nodeTouched.current = false; }; var _onTouchEnd = function onTouchEnd() { nodeTouched.current = true; }; var _onMouseEnter = function onMouseEnter(event) { if (props.onRowMouseEnter) { props.onRowMouseEnter({ originalEvent: event, node: props.node, index: props.rowIndex }); } }; var _onMouseLeave = function onMouseLeave(event) { if (props.onRowMouseLeave) { props.onRowMouseLeave({ originalEvent: event, node: props.node, index: props.rowIndex }); } }; var onCheckboxChange = function onCheckboxChange(event) { var checked = isChecked(); var selectionKeys = props.selectionKeys ? _objectSpread$4({}, props.selectionKeys) : {}; if (checked) { if (props.propagateSelectionDown) { _propagateDown(props.node, false, selectionKeys); } else { delete selectionKeys[props.node.key]; } if (props.propagateSelectionUp && props.onPropagateUp) { props.onPropagateUp({ originalEvent: event, check: false, selectionKeys: selectionKeys }); } if (props.onUnselect) { props.onUnselect({ originalEvent: event, node: props.node }); } } else { if (props.propagateSelectionDown) { _propagateDown(props.node, true, selectionKeys); } else { selectionKeys[props.node.key] = { checked: true }; } if (props.propagateSelectionUp && props.onPropagateUp) { props.onPropagateUp({ originalEvent: event, check: true, selectionKeys: selectionKeys }); } if (props.onSelect) { props.onSelect({ originalEvent: event, node: props.node }); } } if (props.onSelectionChange) { props.onSelectionChange({ originalEvent: event, value: selectionKeys }); } DomHandler.clearSelection(); }; var propagateUp = function propagateUp(event) { var check = event.check; var selectionKeys = event.selectionKeys; var checkedChildCount = 0; var _iterator = _createForOfIteratorHelper$3(props.node.children), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var child = _step.value; if (selectionKeys[child.key] && selectionKeys[child.key].checked) { checkedChildCount++; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } var parentKey = props.node.key; var children = ObjectUtils.findChildrenByKey(props.originalOptions, parentKey); var isParentPartiallyChecked = children.some(function (ele) { return ele.key in selectionKeys; }); var isCompletelyChecked = children.every(function (ele) { return ele.key in selectionKeys && selectionKeys[ele.key].checked; }); if (isParentPartiallyChecked && !isCompletelyChecked) { selectionKeys[parentKey] = { checked: false, partialChecked: true }; } else if (isCompletelyChecked) { selectionKeys[parentKey] = { checked: true, partialChecked: false }; } else if (check) { selectionKeys[parentKey] = { checked: false, partialChecked: false }; } else { delete selectionKeys[parentKey]; } if (props.propagateSelectionUp && props.onPropagateUp) { props.onPropagateUp(event); } }; var _propagateDown = function propagateDown(node, check, selectionKeys) { if (check) { selectionKeys[node.key] = { checked: true, partialChecked: false }; } else { delete selectionKeys[node.key]; } if (node.children && node.children.length) { for (var i = 0; i < node.children.length; i++) { _propagateDown(node.children[i], check, selectionKeys); } } }; var onRightClick = function onRightClick(event) { DomHandler.clearSelection(); if (props.onContextMenuSelectionChange) { props.onContextMenuSelectionChange({ originalEvent: event, value: props.node.key }); } if (props.onContextMenu) { props.onContextMenu({ originalEvent: event, node: props.node }); } }; var _onKeyDown = function onKeyDown(event, item) { switch (event.code) { case 'ArrowDown': onArrowDownKey(event); break; case 'ArrowUp': onArrowUpKey(event); break; case 'ArrowLeft': onArrowLeftKey(event); break; case 'ArrowRight': onArrowRightKey(event); break; case 'Home': onHomeKey(event); break; case 'End': onEndKey(event); break; case 'Enter': case 'NumpadEnter': case 'Space': if (!DomHandler.isClickable(event.target)) { onEnterKey(event); } break; case 'Tab': onTabKey(); break; } }; var onArrowDownKey = function onArrowDownKey(event) { var nextElementSibling = event.currentTarget.nextElementSibling; nextElementSibling && focusRowChange(event.currentTarget, nextElementSibling); event.preventDefault(); }; var onArrowUpKey = function onArrowUpKey(event) { var previousElementSibling = event.currentTarget.previousElementSibling; previousElementSibling && focusRowChange(event.currentTarget, previousElementSibling); event.preventDefault(); }; var onArrowRightKey = function onArrowRightKey(event) { var ishiddenIcon = DomHandler.findSingle(event.currentTarget, 'button').style.visibility === 'hidden'; DomHandler.findSingle(elementRef.current, '[data-pc-section="rowtoggler"]'); if (ishiddenIcon) { return; } !expanded && expand(event, true); event.preventDefault(); }; var onArrowLeftKey = function onArrowLeftKey(event) { if (props.level === 0 && !expanded) { return; } var currentTarget = event.currentTarget; var ishiddenIcon = DomHandler.findSingle(currentTarget, 'button').style.visibility === 'hidden'; DomHandler.findSingle(currentTarget, '[data-pc-section="rowtoggler"]'); if (expanded && !ishiddenIcon) { collapse(event); return; } var target = _findBeforeClickableNode(currentTarget); target && focusRowChange(currentTarget, target); }; var onHomeKey = function onHomeKey(event) { var findFirstElement = DomHandler.findSingle(event.currentTarget.parentElement, "tr[aria-level=\"".concat(props.level + 1, "\"]")); findFirstElement && DomHandler.focus(findFirstElement); event.preventDefault(); }; var onEndKey = function onEndKey(event) { var nodes = DomHandler.find(event.currentTarget.parentElement, "tr[aria-level=\"".concat(props.level + 1, "\"]")); var findFirstElement = nodes[nodes.length - 1]; DomHandler.focus(findFirstElement); event.preventDefault(); }; var onEnterKey = function onEnterKey(event) { event.preventDefault(); setTabIndexForSelectionMode(event, nodeTouched.current); if (props.selectionMode === 'checkbox') { onCheckboxChange(event); return; } props.onRowClick(event, props.node); nodeTouched.current = false; }; var onTabKey = function onTabKey() { var rows = _toConsumableArray(DomHandler.find(elementRef.current.parentElement, 'tr')); var hasSelectedRow = rows.some(function (row) { return DomHandler.getAttribute(row, 'data-p-highlight') || row.getAttribute('aria-checked') === 'true'; }); rows.forEach(function (row) { row.tabIndex = -1; }); if (hasSelectedRow) { var selectedNodes = rows.filter(function (node) { return DomHandler.getAttribute(node, 'data-p-highlight') || node.getAttribute('aria-checked') === 'true'; }); selectedNodes[0].tabIndex = 0; return; } rows[0].tabIndex = 0; }; var focusRowChange = function focusRowChange(firstFocusableRow, currentFocusedRow) { firstFocusableRow.tabIndex = '-1'; currentFocusedRow.tabIndex = '0'; DomHandler.focus(currentFocusedRow); }; var _findBeforeClickableNode = function findBeforeClickableNode(node) { var prevNode = node.previousElementSibling; if (prevNode) { var prevNodeButton = prevNode.querySelector('button'); if (prevNodeButton && prevNodeButton.style.visibility !== 'hidden') { return prevNode; } return _findBeforeClickableNode(prevNode); } return null; }; var setTabIndexForSelectionMode = function setTabIndexForSelectionMode(event, nodeTouched) { if (props.selectionMode !== null) { var elements = _toConsumableArray(DomHandler.find(elementRef.current.parentElement, 'tr')); event.currentTarget.tabIndex = nodeTouched === false ? -1 : 0; if (elements.every(function (element) { return element.tabIndex === -1; })) { elements[0].tabIn