UNPKG

@clayui/drop-down

Version:
227 lines (226 loc) 7.37 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var DropDownWithItems_exports = {}; __export(DropDownWithItems_exports, { ClayDropDownWithItems: () => ClayDropDownWithItems }); module.exports = __toCommonJS(DropDownWithItems_exports); var import_shared = require("@clayui/shared"); var import_react = __toESM(require("react")); var import_Caption = __toESM(require("./Caption")); var import_DropDown = __toESM(require("./DropDown")); var import_DropDownWithDrilldown = require("./DropDownWithDrilldown"); var import_Help = __toESM(require("./Help")); var import_Items = require("./Items"); var import_Search = __toESM(require("./Search")); let counter = 0; function getId() { return `id-${counter++}`; } function transformTreeToLinkedList(items, id, menu = {}) { menu[id] = []; items?.forEach((item, index) => { const keys = Object.keys(item); menu[id][index] = {}; keys.forEach((key) => { if (item["type"] === "contextual" && Array.isArray(item[key])) { const childId = getId(); menu[id][index].child = childId; transformTreeToLinkedList(item[key], childId, menu); } else { if (item[key] === "contextual") { menu[id][index].type = "item"; } else { menu[id][index][key] = item[key]; } } }); }); return menu; } function ClayDropDownWithItems({ active, alignmentByViewport, alignmentPosition, caption, className, closeOnClickOutside, containerElement, defaultActive = false, footerContent, helpText, items, menuElementAttrs, menuHeight, menuWidth, offsetFn, onActiveChange, onSearchValueChange = () => { }, renderMenuOnClick, searchable, searchProps, searchValue = "", triggerIcon = null, spritemap, trigger }) { const triggerElementRef = (0, import_react.useRef)(null); const [internalActive, setInternalActive] = (0, import_shared.useControlledState)({ defaultName: "defaultActive", defaultValue: defaultActive, handleName: "onActiveChange", name: "active", onChange: onActiveChange, value: active }); const hasRightSymbols = (0, import_react.useMemo)( () => !!(0, import_Items.findNested)(items, "symbolRight"), [items] ); const hasLeftSymbols = (0, import_react.useMemo)( () => !!(0, import_Items.findNested)(items, "symbolLeft"), [items] ); const hasContextual = (0, import_react.useMemo)( () => items.some((item) => item.type === "contextual"), [items] ); const Wrap = footerContent ? "form" : import_react.default.Fragment; const isMobile = (0, import_shared.useIsMobileDevice)(); const activeMenu = (0, import_react.useMemo)(() => getId(), []); const linkedList = (0, import_react.useMemo)(() => { if (isMobile && hasContextual) { return transformTreeToLinkedList(items, activeMenu); } }, [items, hasContextual, isMobile]); if (hasContextual && isMobile) { return /* @__PURE__ */ import_react.default.createElement( import_DropDownWithDrilldown.ClayDropDownWithDrilldown, { active: internalActive, alignmentByViewport, alignmentPosition, caption, className, containerElement, defaultActiveMenu: activeMenu, footerContent, helpText, menuElementAttrs, menuHeight, menuWidth, menus: linkedList, offsetFn, onActiveChange: setInternalActive, onSearchValueChange, renderMenuOnClick, searchProps, searchValue, searchable, trigger, triggerIcon } ); } else { return /* @__PURE__ */ import_react.default.createElement( import_DropDown.default, { active: internalActive, alignmentByViewport, alignmentPosition, className, closeOnClickOutside, containerElement, hasLeftSymbols, hasRightSymbols, menuElementAttrs, menuHeight, menuWidth, offsetFn, onActiveChange: setInternalActive, renderMenuOnClick, trigger: import_react.default.cloneElement(trigger, { ref: (node) => { if (node) { triggerElementRef.current = node; const { ref } = trigger; if (typeof ref === "function") { ref(node); } } } }), triggerIcon }, /* @__PURE__ */ import_react.default.createElement( import_Items.ClayDropDownContext.Provider, { value: { close: () => { setInternalActive(false); triggerElementRef.current?.focus(); } } }, helpText && /* @__PURE__ */ import_react.default.createElement(import_Help.default, null, helpText), searchable && /* @__PURE__ */ import_react.default.createElement( import_Search.default, { ...searchProps, onChange: onSearchValueChange, spritemap, value: searchValue } ), /* @__PURE__ */ import_react.default.createElement(Wrap, null, footerContent ? /* @__PURE__ */ import_react.default.createElement("div", { className: "inline-scroller" }, /* @__PURE__ */ import_react.default.createElement( import_Items.DropDownItems, { items, spritemap } )) : /* @__PURE__ */ import_react.default.createElement( import_Items.DropDownItems, { items, spritemap } ), caption && /* @__PURE__ */ import_react.default.createElement(import_Caption.default, null, caption), footerContent && /* @__PURE__ */ import_react.default.createElement( "div", { className: "dropdown-section", role: "presentation" }, footerContent )) ) ); } } ClayDropDownWithItems.displayName = "ClayDropDownWithItems";