UNPKG

@trap_stevo/legendarybuilderproreact-ui

Version:

The legendary UI & utility API that makes your application a legendary application. ~ Created by Steven Compton

779 lines 40.4 kB
import _typeof from "@babel/runtime/helpers/typeof"; import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import _extends from "@babel/runtime/helpers/extends"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function ownKeys(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(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } import React, { useState, useEffect, useRef, useMemo, useCallback } from "react"; import { Debounce } from "../HUDManagers/HUDUniversalHUDUtilityManager.js"; import HUDIcon from "./HUDIcon.js"; var parsePx = function parsePx(v) { if (v == null) { return 0; } if (typeof v === "number") { return v; } var m = String(v).match(/([\d.]+)/); return m ? Number(m[1]) : 0; }; var GroupedSection = /*#__PURE__*/React.memo(function GroupedSection(_ref) { var groupedListSectionHeaderContainerHoverConfigurationSettings = _ref.groupedListSectionHeaderContainerHoverConfigurationSettings, groupedListSectionFooterContainerHoverConfigurationSettings = _ref.groupedListSectionFooterContainerHoverConfigurationSettings, groupedListSectionCollapseButtonHoverConfigurationSettings = _ref.groupedListSectionCollapseButtonHoverConfigurationSettings, groupedListSectionFooterContainerConfigurationSettings = _ref.groupedListSectionFooterContainerConfigurationSettings, groupedListSectionHeaderContainerConfigurationSettings = _ref.groupedListSectionHeaderContainerConfigurationSettings, groupedListSectionContainerHoverConfigurationSettings = _ref.groupedListSectionContainerHoverConfigurationSettings, groupedListSectionCollapseButtonConfigurationSettings = _ref.groupedListSectionCollapseButtonConfigurationSettings, groupedListSectionContentHoverConfigurationSettings = _ref.groupedListSectionContentHoverConfigurationSettings, groupedListSectionContainerConfigurationSettings = _ref.groupedListSectionContainerConfigurationSettings, groupedListSectionContentConfigurationSettings = _ref.groupedListSectionContentConfigurationSettings, groupedListSectionConfigurationSettings = _ref.groupedListSectionConfigurationSettings, groupedListSectionHeaderContainerConfigurations = _ref.groupedListSectionHeaderContainerConfigurations, groupedListSectionFooterContainerConfigurations = _ref.groupedListSectionFooterContainerConfigurations, groupedListSectionCollapseButtonConfigurations = _ref.groupedListSectionCollapseButtonConfigurations, groupedListSectionContainerConfigurations = _ref.groupedListSectionContainerConfigurations, groupedListSectionConfigurations = _ref.groupedListSectionConfigurations, onSectionCollapseButtonClicked = _ref.onSectionCollapseButtonClicked, collapseButtonRenderer = _ref.collapseButtonRenderer, handleToggleCollapse = _ref.handleToggleCollapse, itemKeyExtractor = _ref.itemKeyExtractor, onSectionEnter = _ref.onSectionEnter, onSectionLeave = _ref.onSectionLeave, onItemEnter = _ref.onItemEnter, onItemLeave = _ref.onItemLeave, onItemClick = _ref.onItemClick, renderSectionHeader = _ref.renderSectionHeader, renderSectionFooter = _ref.renderSectionFooter, renderCell = _ref.renderCell, groupedListSectionCollapsedButtonIconHoverColor = _ref.groupedListSectionCollapsedButtonIconHoverColor, groupedListSectionCollapsedButtonIconColor = _ref.groupedListSectionCollapsedButtonIconColor, groupedListSectionCollapsedButtonIcon = _ref.groupedListSectionCollapsedButtonIcon, groupedListSectionCollapseButtonIcon = _ref.groupedListSectionCollapseButtonIcon, setCollapseButtonHover = _ref.setCollapseButtonHover, collapseButtonHover = _ref.collapseButtonHover, collapsibleSections = _ref.collapsibleSections, collapsedSections = _ref.collapsedSections, sectionItemHover = _ref.sectionItemHover, stickyHeaders = _ref.stickyHeaders, sectionHover = _ref.sectionHover, sectionRefs = _ref.sectionRefs, section = _ref.section, sIndex = _ref.sIndex, layout = _ref.layout; var containerStyle = useMemo(function () { return _objectSpread(_objectSpread({ overflow: "hidden", scrollSnapAlign: "start", borderRadius: "8px", boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)", background: "#fff", marginBottom: "15px" }, groupedListSectionContainerConfigurationSettings), sectionHover === sIndex && groupedListSectionContainerHoverConfigurationSettings ? groupedListSectionContainerHoverConfigurationSettings : {}); }, [groupedListSectionContainerConfigurationSettings, groupedListSectionContainerHoverConfigurationSettings, sectionHover, sIndex]); var headerStyle = useMemo(function () { return _objectSpread(_objectSpread({ position: stickyHeaders ? "sticky" : "relative", display: "flex", justifyContent: "space-between", alignItems: "center", fontWeight: "bold", background: "#f8f9fa", zIndex: 10, padding: "10px 15px", top: stickyHeaders ? 0 : "auto" }, groupedListSectionHeaderContainerConfigurationSettings), sectionHover === sIndex && groupedListSectionHeaderContainerHoverConfigurationSettings ? groupedListSectionHeaderContainerHoverConfigurationSettings : {}); }, [stickyHeaders, groupedListSectionHeaderContainerConfigurationSettings, groupedListSectionHeaderContainerHoverConfigurationSettings, sectionHover, sIndex]); var bodyStyle = useMemo(function () { var _groupedListSectionHe; var padTop = stickyHeaders ? (_groupedListSectionHe = groupedListSectionHeaderContainerConfigurationSettings === null || groupedListSectionHeaderContainerConfigurationSettings === void 0 ? void 0 : groupedListSectionHeaderContainerConfigurationSettings.height) !== null && _groupedListSectionHe !== void 0 ? _groupedListSectionHe : 0 : 0; return _objectSpread({ display: layout === "horizontal" ? "flex" : "block", gap: "10px", padding: "10px 15px", paddingTop: padTop }, groupedListSectionConfigurationSettings); }, [layout, stickyHeaders, groupedListSectionConfigurationSettings, groupedListSectionHeaderContainerConfigurationSettings === null || groupedListSectionHeaderContainerConfigurationSettings === void 0 ? void 0 : groupedListSectionHeaderContainerConfigurationSettings.height]); var footerStyle = useMemo(function () { return _objectSpread(_objectSpread({ fontStyle: "italic", fontSize: "14px", background: "#f8f9fa", padding: "10px 15px" }, groupedListSectionFooterContainerConfigurationSettings), sectionHover === sIndex && groupedListSectionFooterContainerHoverConfigurationSettings ? groupedListSectionFooterContainerHoverConfigurationSettings : {}); }, [groupedListSectionFooterContainerConfigurationSettings, groupedListSectionFooterContainerHoverConfigurationSettings, sectionHover, sIndex]); return /*#__PURE__*/React.createElement("div", _extends({ ref: function ref(el) { return sectionRefs.current[sIndex] = el; }, className: "hud-section", style: containerStyle, onMouseEnter: function onMouseEnter() { return onSectionEnter(section, sIndex); }, onMouseLeave: function onMouseLeave() { return onSectionLeave(sIndex); } }, groupedListSectionContainerConfigurations), renderSectionHeader && /*#__PURE__*/React.createElement("div", _extends({ style: headerStyle }, groupedListSectionHeaderContainerConfigurations), renderSectionHeader(section.header, section, sIndex), collapsibleSections && (collapseButtonRenderer ? collapseButtonRenderer({ isCollapsed: collapsedSections[sIndex], onToggle: function onToggle() { return handleToggleCollapse(sIndex); } }) : /*#__PURE__*/React.createElement(HUDIcon, _extends({ iconConfigurationSettings: _objectSpread(_objectSpread({ transition: "all 0.369s ease-out", cursor: "pointer", background: "transparent" }, groupedListSectionCollapseButtonConfigurationSettings), (collapseButtonHover === sIndex || collapsedSections[sIndex]) && groupedListSectionCollapseButtonHoverConfigurationSettings ? groupedListSectionCollapseButtonHoverConfigurationSettings : {}), onMouseEnter: function onMouseEnter() { return setCollapseButtonHover(sIndex); }, onMouseLeave: function onMouseLeave() { return setCollapseButtonHover(null); }, onClick: function onClick() { handleToggleCollapse(sIndex); onSectionCollapseButtonClicked && onSectionCollapseButtonClicked(sIndex, !collapsedSections[sIndex]); }, color: collapseButtonHover === sIndex || collapsedSections[sIndex] ? groupedListSectionCollapsedButtonIconHoverColor : groupedListSectionCollapsedButtonIconColor, name: collapsedSections[sIndex] ? groupedListSectionCollapsedButtonIcon : groupedListSectionCollapseButtonIcon }, groupedListSectionCollapseButtonConfigurations)))), !collapsedSections[sIndex] && /*#__PURE__*/React.createElement("div", _extends({ style: bodyStyle }, groupedListSectionConfigurations), section.filteredItems.map(function (item, iIndex) { var key = itemKeyExtractor(item, iIndex, section); var hovered = sectionItemHover.section === sIndex && sectionItemHover.item === iIndex; return /*#__PURE__*/React.createElement(GroupedItem, { key: key, groupedListSectionContentHoverConfigurationSettings: groupedListSectionContentHoverConfigurationSettings, groupedListSectionContentConfigurationSettings: groupedListSectionContentConfigurationSettings, onItemEnter: onItemEnter, onItemLeave: onItemLeave, onItemClick: onItemClick, renderCell: renderCell, hovered: hovered, section: section, sIndex: sIndex, iIndex: iIndex, item: item }); })), renderSectionFooter && /*#__PURE__*/React.createElement("div", _extends({ style: footerStyle }, groupedListSectionFooterContainerConfigurations), renderSectionFooter(section.footer, section, sIndex))); }); var GroupedItem = /*#__PURE__*/React.memo(function GroupedItem(_ref2) { var groupedListSectionContentHoverConfigurationSettings = _ref2.groupedListSectionContentHoverConfigurationSettings, groupedListSectionContentConfigurationSettings = _ref2.groupedListSectionContentConfigurationSettings, onItemEnter = _ref2.onItemEnter, onItemLeave = _ref2.onItemLeave, onItemClick = _ref2.onItemClick, renderCell = _ref2.renderCell, hovered = _ref2.hovered, section = _ref2.section, sIndex = _ref2.sIndex, iIndex = _ref2.iIndex, item = _ref2.item; var style = useMemo(function () { return _objectSpread(_objectSpread({ borderRadius: "6px", boxShadow: "0 2px 4px rgba(0, 0, 0, 0.1)", background: "#e9ecef", padding: "10px" }, groupedListSectionContentConfigurationSettings), hovered && groupedListSectionContentHoverConfigurationSettings ? groupedListSectionContentHoverConfigurationSettings : {}); }, [groupedListSectionContentConfigurationSettings, groupedListSectionContentHoverConfigurationSettings, hovered]); return /*#__PURE__*/React.createElement("div", { style: style, onMouseEnter: function onMouseEnter() { return onItemEnter(sIndex, item, iIndex); }, onMouseLeave: function onMouseLeave() { return onItemLeave(sIndex); }, onClick: function onClick() { return onItemClick(item, section); } }, renderCell ? renderCell(item, iIndex, section) : /*#__PURE__*/React.createElement("div", { style: { padding: "6px 8px" } }, JSON.stringify(item))); }, function (prev, next) { return prev.item === next.item && prev.iIndex === next.iIndex && prev.sIndex === next.sIndex && prev.hovered === next.hovered && prev.renderCell === next.renderCell && prev.groupedListSectionContentConfigurationSettings === next.groupedListSectionContentConfigurationSettings && prev.groupedListSectionContentHoverConfigurationSettings === next.groupedListSectionContentHoverConfigurationSettings; }); function HUDGroupedList(_ref3) { var _ref3$groupedListSect = _ref3.groupedListSectionHeaderContainerHoverConfigurationSettings, groupedListSectionHeaderContainerHoverConfigurationSettings = _ref3$groupedListSect === void 0 ? {} : _ref3$groupedListSect, _ref3$groupedListSect2 = _ref3.groupedListSectionFooterContainerHoverConfigurationSettings, groupedListSectionFooterContainerHoverConfigurationSettings = _ref3$groupedListSect2 === void 0 ? {} : _ref3$groupedListSect2, _ref3$groupedListSect3 = _ref3.groupedListSectionCollapseButtonHoverConfigurationSettings, groupedListSectionCollapseButtonHoverConfigurationSettings = _ref3$groupedListSect3 === void 0 ? {} : _ref3$groupedListSect3, _ref3$groupedListSect4 = _ref3.groupedListSectionHeaderContainerConfigurationSettings, groupedListSectionHeaderContainerConfigurationSettings = _ref3$groupedListSect4 === void 0 ? {} : _ref3$groupedListSect4, _ref3$groupedListSect5 = _ref3.groupedListSectionFooterContainerConfigurationSettings, groupedListSectionFooterContainerConfigurationSettings = _ref3$groupedListSect5 === void 0 ? {} : _ref3$groupedListSect5, _ref3$groupedListSect6 = _ref3.groupedListSectionCollapseButtonConfigurationSettings, groupedListSectionCollapseButtonConfigurationSettings = _ref3$groupedListSect6 === void 0 ? {} : _ref3$groupedListSect6, _ref3$groupedListSect7 = _ref3.groupedListSectionContainerHoverConfigurationSettings, groupedListSectionContainerHoverConfigurationSettings = _ref3$groupedListSect7 === void 0 ? {} : _ref3$groupedListSect7, _ref3$groupedListSect8 = _ref3.groupedListSectionContentHoverConfigurationSettings, groupedListSectionContentHoverConfigurationSettings = _ref3$groupedListSect8 === void 0 ? {} : _ref3$groupedListSect8, _ref3$groupedListSect9 = _ref3.groupedListSectionContainerConfigurationSettings, groupedListSectionContainerConfigurationSettings = _ref3$groupedListSect9 === void 0 ? {} : _ref3$groupedListSect9, _ref3$groupedListSect10 = _ref3.groupedListSectionContentConfigurationSettings, groupedListSectionContentConfigurationSettings = _ref3$groupedListSect10 === void 0 ? {} : _ref3$groupedListSect10, _ref3$groupedListCont = _ref3.groupedListContainerConfigurationSettings, groupedListContainerConfigurationSettings = _ref3$groupedListCont === void 0 ? {} : _ref3$groupedListCont, _ref3$groupedListSect11 = _ref3.groupedListSectionConfigurationSettings, groupedListSectionConfigurationSettings = _ref3$groupedListSect11 === void 0 ? {} : _ref3$groupedListSect11, _ref3$groupedListSect12 = _ref3.groupedListSectionHeaderContainerConfigurations, groupedListSectionHeaderContainerConfigurations = _ref3$groupedListSect12 === void 0 ? {} : _ref3$groupedListSect12, _ref3$groupedListSect13 = _ref3.groupedListSectionFooterContainerConfigurations, groupedListSectionFooterContainerConfigurations = _ref3$groupedListSect13 === void 0 ? {} : _ref3$groupedListSect13, _ref3$groupedListSect14 = _ref3.groupedListSectionCollapseButtonConfigurations, groupedListSectionCollapseButtonConfigurations = _ref3$groupedListSect14 === void 0 ? {} : _ref3$groupedListSect14, _ref3$groupedListSect15 = _ref3.groupedListSectionContainerConfigurations, groupedListSectionContainerConfigurations = _ref3$groupedListSect15 === void 0 ? {} : _ref3$groupedListSect15, _ref3$groupedListSect16 = _ref3.groupedListSectionConfigurations, groupedListSectionConfigurations = _ref3$groupedListSect16 === void 0 ? {} : _ref3$groupedListSect16, _ref3$groupedListSect17 = _ref3.groupedListSectionCollapsedButtonIconHoverColor, groupedListSectionCollapsedButtonIconHoverColor = _ref3$groupedListSect17 === void 0 ? "rgba(147.69, 147.69, 147.69, 1)" : _ref3$groupedListSect17, _ref3$groupedListSect18 = _ref3.groupedListSectionCollapsedButtonIconColor, groupedListSectionCollapsedButtonIconColor = _ref3$groupedListSect18 === void 0 ? "rgba(115.69, 115.69, 115.69, 1)" : _ref3$groupedListSect18, _ref3$groupedListSect19 = _ref3.groupedListSectionCollapsedButtonIcon, groupedListSectionCollapsedButtonIcon = _ref3$groupedListSect19 === void 0 ? "plus" : _ref3$groupedListSect19, _ref3$groupedListSect20 = _ref3.groupedListSectionCollapseButtonIcon, groupedListSectionCollapseButtonIcon = _ref3$groupedListSect20 === void 0 ? "minus" : _ref3$groupedListSect20, _ref3$itemKeyExtracto = _ref3.itemKeyExtractor, itemKeyExtractor = _ref3$itemKeyExtracto === void 0 ? function (item, index, section) { return index; } : _ref3$itemKeyExtracto, _ref3$sectionKeyExtra = _ref3.sectionKeyExtractor, sectionKeyExtractor = _ref3$sectionKeyExtra === void 0 ? function (section, index) { return index; } : _ref3$sectionKeyExtra, _ref3$onSectionCollap = _ref3.onSectionCollapseButtonClicked, onSectionCollapseButtonClicked = _ref3$onSectionCollap === void 0 ? null : _ref3$onSectionCollap, _ref3$onSectionHovere = _ref3.onSectionHovered, onSectionHovered = _ref3$onSectionHovere === void 0 ? null : _ref3$onSectionHovere, _ref3$onGroupingUpdat = _ref3.onGroupingUpdate, onGroupingUpdate = _ref3$onGroupingUpdat === void 0 ? null : _ref3$onGroupingUpdat, _ref3$onItemSelected = _ref3.onItemSelected, onItemSelected = _ref3$onItemSelected === void 0 ? null : _ref3$onItemSelected, _ref3$onItemHovered = _ref3.onItemHovered, onItemHovered = _ref3$onItemHovered === void 0 ? null : _ref3$onItemHovered, collapseButtonRenderer = _ref3.collapseButtonRenderer, renderSectionHeader = _ref3.renderSectionHeader, renderSectionFooter = _ref3.renderSectionFooter, renderCell = _ref3.renderCell, _ref3$snappingDebounc = _ref3.snappingDebounce, snappingDebounce = _ref3$snappingDebounc === void 0 ? 13.69 : _ref3$snappingDebounc, _ref3$snapping = _ref3.snapping, snapping = _ref3$snapping === void 0 ? true : _ref3$snapping, _ref3$stickyHeaders = _ref3.stickyHeaders, stickyHeaders = _ref3$stickyHeaders === void 0 ? false : _ref3$stickyHeaders, _ref3$collapsibleSect = _ref3.collapsibleSections, collapsibleSections = _ref3$collapsibleSect === void 0 ? false : _ref3$collapsibleSect, _ref3$collapseAllSect = _ref3.collapseAllSections, collapseAllSections = _ref3$collapseAllSect === void 0 ? false : _ref3$collapseAllSect, _ref3$expandAllSectio = _ref3.expandAllSections, expandAllSections = _ref3$expandAllSectio === void 0 ? false : _ref3$expandAllSectio, _ref3$resetPreviously = _ref3.resetPreviouslyAutoExpandedSections, resetPreviouslyAutoExpandedSections = _ref3$resetPreviously === void 0 ? false : _ref3$resetPreviously, _ref3$autoSectionColl = _ref3.autoSectionCollapseMap, autoSectionCollapseMap = _ref3$autoSectionColl === void 0 ? null : _ref3$autoSectionColl, _ref3$collapseSection = _ref3.collapseSectionsOnLoad, collapseSectionsOnLoad = _ref3$collapseSection === void 0 ? {} : _ref3$collapseSection, _ref3$groupingInterva = _ref3.groupingInterval, groupingInterval = _ref3$groupingInterva === void 0 ? null : _ref3$groupingInterva, _ref3$groupingRules = _ref3.groupingRules, groupingRules = _ref3$groupingRules === void 0 ? [] : _ref3$groupingRules, _ref3$sortingRules = _ref3.sortingRules, sortingRules = _ref3$sortingRules === void 0 ? [] : _ref3$sortingRules, _ref3$searchTerm = _ref3.searchTerm, searchTerm = _ref3$searchTerm === void 0 ? "" : _ref3$searchTerm, _ref3$headerFilterKey = _ref3.headerFilterKeys, headerFilterKeys = _ref3$headerFilterKey === void 0 ? [] : _ref3$headerFilterKey, _ref3$itemFilterKeys = _ref3.itemFilterKeys, itemFilterKeys = _ref3$itemFilterKeys === void 0 ? [] : _ref3$itemFilterKeys, customHeaderFilter = _ref3.customHeaderFilter, customItemFilter = _ref3.customItemFilter, _ref3$minDistanceForS = _ref3.minDistanceForSmooth, minDistanceForSmooth = _ref3$minDistanceForS === void 0 ? 24 : _ref3$minDistanceForS, _ref3$snapThresholdPx = _ref3.snapThresholdPx, snapThresholdPx = _ref3$snapThresholdPx === void 0 ? 56 : _ref3$snapThresholdPx, snapIdleMs = _ref3.snapIdleMs, _ref3$layout = _ref3.layout, layout = _ref3$layout === void 0 ? "vertical" : _ref3$layout, _ref3$data = _ref3.data, data = _ref3$data === void 0 ? [] : _ref3$data; var _useState = useState(function () { return _objectSpread({}, collapseSectionsOnLoad); }), _useState2 = _slicedToArray(_useState, 2), collapsedSections = _useState2[0], setCollapsedSections = _useState2[1]; var _useState3 = useState({ section: null, item: null }), _useState4 = _slicedToArray(_useState3, 2), sectionItemHover = _useState4[0], setSectionItemHover = _useState4[1]; var _useState5 = useState(null), _useState6 = _slicedToArray(_useState5, 2), collapseButtonHover = _useState6[0], setCollapseButtonHover = _useState6[1]; var _useState7 = useState(null), _useState8 = _slicedToArray(_useState7, 2), sectionHover = _useState8[0], setSectionHover = _useState8[1]; var _useState9 = useState([]), _useState10 = _slicedToArray(_useState9, 2), groupedData = _useState10[0], setGroupedData = _useState10[1]; var pCollapsedAllSections = useRef(false); var pExpandedAllSections = useRef(false); var prevCollapseMapRef = useRef(null); var lastUserScrollAtRef = useRef(0); var sectionOffsetsRef = useRef([]); var snappingRef = useRef(false); var containerRef = useRef(null); var sectionRefs = useRef([]); var rafIdRef = useRef(null); var stickyHeaderHeight = stickyHeaders ? parsePx(groupedListSectionHeaderContainerConfigurationSettings === null || groupedListSectionHeaderContainerConfigurationSettings === void 0 ? void 0 : groupedListSectionHeaderContainerConfigurationSettings.height) : 0; var containerStyle = useMemo(function () { return _objectSpread({ position: "relative", display: layout === "horizontal" ? "flex" : "block", overflow: "auto", overscrollBehavior: "contain", scrollSnapType: "none", border: "1px solid #ddd", borderRadius: "10px", background: "#f5f5f5", maxHeight: "100vh", padding: "10px" }, groupedListContainerConfigurationSettings); }, [layout, groupedListContainerConfigurationSettings]); var handleToggleCollapse = useCallback(function (sectionIndex) { setCollapsedSections(function (prev) { return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, sectionIndex, !prev[sectionIndex])); }); }, []); var applySortingRules = useCallback(function (groups) { if (!sortingRules.length) { return groups; } var sortItems = function sortItems(items) { var out = _toConsumableArray(items); sortingRules.forEach(function (rule) { out.sort(function (a, b) { var va = rule.getValue(a); var vb = rule.getValue(b); if (va < vb) { return rule.order === "asc" ? -1 : 1; } if (va > vb) { return rule.order === "asc" ? 1 : -1; } return 0; }); }); return out; }; var sortedGroups = groups.map(function (g) { return _objectSpread(_objectSpread({}, g), {}, { items: sortItems(g.items) }); }).sort(function (a, b) { var _iterator = _createForOfIteratorHelper(sortingRules), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var rule = _step.value; var va = rule.getValue(a.header); var vb = rule.getValue(b.header); if (va < vb) { return rule.order === "asc" ? -1 : 1; } if (va > vb) { return rule.order === "asc" ? 1 : -1; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return 0; }); return sortedGroups; }, [sortingRules]); var applyGroupingRules = useCallback(function () { if (!groupingRules.length) { var looksPreGrouped = Array.isArray(data) && data.every(function (s) { return s && _typeof(s) === "object" && s.header && Array.isArray(s.items); }); var _groups = looksPreGrouped ? data : [{ header: { title: "All Items" }, items: data, footer: { totalItems: data.length } }]; var finalGroups = applySortingRules(_groups); setGroupedData(finalGroups); onGroupingUpdate && onGroupingUpdate(finalGroups); return; } var groups = groupingRules.reduce(function (acc, rule) { var matched = data.filter(rule.condition); if (matched.length > 0) { acc.push({ header: _objectSpread({ title: rule.title, description: rule.description, icon: rule.icon || undefined }, rule.headerMetadata || {}), items: matched.map(function (item) { return _objectSpread(_objectSpread({}, item), rule.itemMetadata || {}); }), footer: _objectSpread({ totalItems: matched.length, note: rule.footerNote ? rule.footerNote(matched) : "Total items in ".concat(rule.title) }, rule.footerMetadata || {}) }); } return acc; }, []); groups = applySortingRules(groups); setGroupedData(groups); onGroupingUpdate && onGroupingUpdate(groups); }, [groupingRules, data, applySortingRules, onGroupingUpdate]); var measureOffsets = useCallback(function () { var el = containerRef.current; if (!el) { return; } var baseTop = el.offsetTop; sectionOffsetsRef.current = (sectionRefs.current || []).map(function (node) { return node ? node.offsetTop - baseTop : 0; }); }, []); var filteredData = useMemo(function () { var term = String(searchTerm || "").toLowerCase(); var headerMatches = function headerMatches(header) { if (customHeaderFilter) { return customHeaderFilter(header, term); } return headerFilterKeys.some(function (k) { var _header$k; return String((_header$k = header === null || header === void 0 ? void 0 : header[k]) !== null && _header$k !== void 0 ? _header$k : "").toLowerCase().includes(term); }); }; var itemMatches = function itemMatches(item) { if (customItemFilter) { return customItemFilter(item, term); } return itemFilterKeys.some(function (k) { var _item$k; return String((_item$k = item === null || item === void 0 ? void 0 : item[k]) !== null && _item$k !== void 0 ? _item$k : "").toLowerCase().includes(term); }); }; return groupedData.map(function (section) { var filteredItems = section.items.filter(itemMatches); var matchesHeader = headerMatches(section.header); var keep = matchesHeader || filteredItems.length > 0; return keep ? _objectSpread(_objectSpread({}, section), {}, { filteredItems: filteredItems }) : null; }).filter(Boolean); }, [groupedData, searchTerm, customHeaderFilter, headerFilterKeys, customItemFilter, itemFilterKeys]); var findNearestIndex = useCallback(function (scrollTop) { var arr = sectionOffsetsRef.current; if (!arr.length) { return 0; } var lo = 0, hi = arr.length - 1, ans = 0; while (lo <= hi) { var mid = lo + hi >> 1; if (arr[mid] <= scrollTop) { ans = mid; lo = mid + 1; } else { hi = mid - 1; } } if (ans < 0) { return 0; } if (ans >= arr.length) { return arr.length - 1; } return ans; }, []); var onSectionEnter = useCallback(function (section, index) { setSectionHover(index); onSectionHovered && onSectionHovered(section, index); }, [onSectionHovered]); var onSectionLeave = useCallback(function (index) { setSectionHover(null); onSectionHovered && onSectionHovered(null, index); }, [onSectionHovered]); var onItemEnter = useCallback(function (sectionIndex, item, itemIndex) { setSectionItemHover({ section: sectionIndex, item: itemIndex }); onItemHovered && onItemHovered(item, filteredData[sectionIndex], itemIndex); }, [onItemHovered, filteredData]); var onItemLeave = useCallback(function (sectionIndex) { setSectionItemHover({ section: null, item: null }); onItemHovered && onItemHovered(null, filteredData[sectionIndex], null); }, [onItemHovered, filteredData]); var onItemClick = useCallback(function (item, section) { onItemSelected && onItemSelected(item, section); }, [onItemSelected]); useEffect(function () { applyGroupingRules(); }, [data, groupingRules, applyGroupingRules]); useEffect(function () { if (!groupingInterval) { return; } var id = setInterval(applyGroupingRules, groupingInterval); return function () { return clearInterval(id); }; }, [groupingInterval, applyGroupingRules]); useEffect(function () { var activating = collapseAllSections && !pCollapsedAllSections.current; if (activating && groupedData.length > 0) { var next = {}; groupedData.forEach(function (_, i) { next[i] = true; }); setCollapsedSections(next); pCollapsedAllSections.current = collapseAllSections; } if (!collapseAllSections) { pCollapsedAllSections.current = false; } }, [collapseAllSections, groupedData]); useEffect(function () { var activating = expandAllSections && !pExpandedAllSections.current; if (activating && groupedData.length > 0) { var next = {}; groupedData.forEach(function (_, i) { next[i] = false; }); setCollapsedSections(next); pExpandedAllSections.current = expandAllSections; } if (!expandAllSections) { pExpandedAllSections.current = false; } }, [expandAllSections, groupedData]); useEffect(function () { if (!autoSectionCollapseMap || _typeof(autoSectionCollapseMap) !== "object") { return; } var prev = prevCollapseMapRef.current; var changed = JSON.stringify(autoSectionCollapseMap) !== JSON.stringify(prev); if (!changed) { return; } var sanitized = Object.fromEntries(Object.entries(autoSectionCollapseMap).filter(function (_ref4) { var _ref5 = _slicedToArray(_ref4, 2), _ = _ref5[0], v = _ref5[1]; return v !== null; })); setCollapsedSections(function (cur) { var next = _objectSpread(_objectSpread({}, cur), sanitized); if (resetPreviouslyAutoExpandedSections && prev) { for (var _i = 0, _Object$entries = Object.entries(prev); _i < _Object$entries.length; _i++) { var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), idx = _Object$entries$_i[0], wasExpanded = _Object$entries$_i[1]; var isAutoExpanded = wasExpanded === false; var nowOmitted = !(idx in sanitized); var stillExpanded = cur[idx] === false; if (isAutoExpanded && nowOmitted && stillExpanded) { next[idx] = true; } } } return next; }); prevCollapseMapRef.current = autoSectionCollapseMap; }, [autoSectionCollapseMap, resetPreviouslyAutoExpandedSections]); useEffect(function () { measureOffsets(); var ro = new ResizeObserver(function () { measureOffsets(); }); if (containerRef.current) { ro.observe(containerRef.current); } sectionRefs.current.forEach(function (n) { if (n) { ro.observe(n); } }); return function () { return ro.disconnect(); }; }, [filteredData, collapsedSections, stickyHeaderHeight, measureOffsets]); useEffect(function () { if (!snapping || !containerRef.current) { return; } var el = containerRef.current; var idleMs = Math.max(60, Math.round(snapIdleMs !== null && snapIdleMs !== void 0 ? snapIdleMs : snappingDebounce)); var cancelSnap = function cancelSnap() { snappingRef.current = false; if (rafIdRef.current) { cancelAnimationFrame(rafIdRef.current); rafIdRef.current = null; } }; var onUserOverride = function onUserOverride() { cancelSnap(); }; var onScroll = function onScroll() { lastUserScrollAtRef.current = performance.now(); if (snappingRef.current) { return; } if (rafIdRef.current) { cancelAnimationFrame(rafIdRef.current); } rafIdRef.current = requestAnimationFrame(function () { var tick = function tick() { var _sectionOffsetsRef$cu; var now = performance.now(); var idle = now - lastUserScrollAtRef.current >= idleMs; if (!idle) { rafIdRef.current = requestAnimationFrame(tick); return; } var currentTop = el.scrollTop + stickyHeaderHeight; var idx = findNearestIndex(currentTop); var targetTop = Math.max(0, ((_sectionOffsetsRef$cu = sectionOffsetsRef.current[idx]) !== null && _sectionOffsetsRef$cu !== void 0 ? _sectionOffsetsRef$cu : 0) - stickyHeaderHeight); var delta = Math.abs(targetTop - el.scrollTop); if (delta <= snapThresholdPx) { snappingRef.current = true; el.scrollTo({ behavior: delta > minDistanceForSmooth ? "smooth" : "auto", top: targetTop }); var t = setTimeout(function () { snappingRef.current = false; }, 220); var clear = function clear() { clearTimeout(t); snappingRef.current = false; }; el.addEventListener("touchstart", clear, { once: true, passive: true }); el.addEventListener("wheel", clear, { once: true, passive: true }); } }; tick(); }); }; el.addEventListener("touchstart", onUserOverride, { passive: true }); el.addEventListener("wheel", onUserOverride, { passive: true }); el.addEventListener("scroll", onScroll, { passive: true }); return function () { el.removeEventListener("touchstart", onUserOverride, { passive: true }); el.removeEventListener("wheel", onUserOverride, { passive: true }); el.removeEventListener("scroll", onScroll, { passive: true }); cancelSnap(); }; }, [snapping, snappingDebounce, snapIdleMs, snapThresholdPx, minDistanceForSmooth, stickyHeaderHeight, findNearestIndex]); return /*#__PURE__*/React.createElement("div", { ref: containerRef, style: containerStyle }, filteredData.map(function (section, sIndex) { var sectionKey = sectionKeyExtractor(section, sIndex); return /*#__PURE__*/React.createElement(GroupedSection, { key: sectionKey, groupedListSectionFooterContainerHoverConfigurationSettings: groupedListSectionFooterContainerHoverConfigurationSettings, groupedListSectionHeaderContainerHoverConfigurationSettings: groupedListSectionHeaderContainerHoverConfigurationSettings, groupedListSectionCollapseButtonHoverConfigurationSettings: groupedListSectionCollapseButtonHoverConfigurationSettings, groupedListSectionFooterContainerConfigurationSettings: groupedListSectionFooterContainerConfigurationSettings, groupedListSectionHeaderContainerConfigurationSettings: groupedListSectionHeaderContainerConfigurationSettings, groupedListSectionContainerHoverConfigurationSettings: groupedListSectionContainerHoverConfigurationSettings, groupedListSectionCollapseButtonConfigurationSettings: groupedListSectionCollapseButtonConfigurationSettings, groupedListSectionContentHoverConfigurationSettings: groupedListSectionContentHoverConfigurationSettings, groupedListSectionContainerConfigurationSettings: groupedListSectionContainerConfigurationSettings, groupedListSectionContentConfigurationSettings: groupedListSectionContentConfigurationSettings, groupedListSectionConfigurationSettings: groupedListSectionConfigurationSettings, groupedListSectionHeaderContainerConfigurations: groupedListSectionHeaderContainerConfigurations, groupedListSectionFooterContainerConfigurations: groupedListSectionFooterContainerConfigurations, groupedListSectionCollapseButtonConfigurations: groupedListSectionCollapseButtonConfigurations, groupedListSectionContainerConfigurations: groupedListSectionContainerConfigurations, groupedListSectionConfigurations: groupedListSectionConfigurations, groupedListSectionCollapsedButtonIconHoverColor: groupedListSectionCollapsedButtonIconHoverColor, groupedListSectionCollapsedButtonIconColor: groupedListSectionCollapsedButtonIconColor, groupedListSectionCollapsedButtonIcon: groupedListSectionCollapsedButtonIcon, groupedListSectionCollapseButtonIcon: groupedListSectionCollapseButtonIcon, itemKeyExtractor: itemKeyExtractor, onSectionCollapseButtonClicked: onSectionCollapseButtonClicked, handleToggleCollapse: handleToggleCollapse, onSectionEnter: onSectionEnter, onSectionLeave: onSectionLeave, onItemEnter: onItemEnter, onItemLeave: onItemLeave, onItemClick: onItemClick, collapseButtonRenderer: collapseButtonRenderer, renderSectionHeader: renderSectionHeader, renderSectionFooter: renderSectionFooter, renderCell: renderCell, setCollapseButtonHover: setCollapseButtonHover, collapseButtonHover: collapseButtonHover, collapsibleSections: collapsibleSections, collapsedSections: collapsedSections, sectionItemHover: sectionItemHover, stickyHeaders: stickyHeaders, sectionHover: sectionHover, sectionRefs: sectionRefs, section: section, sIndex: sIndex, layout: layout }); })); } ; export default HUDGroupedList;