fomantic-ui-react
Version:
Fomantic-UI React -- A React Component Library.
422 lines (359 loc) • 14 kB
JavaScript
/**
* fomantic-ui-react v0.0.1-alpha.10
* (c) 2022 FireLoong <fireloong@foxmail.com>
* @license MIT
*/
import { _ as _defineProperty, a as _objectWithoutProperties } from '../_chunks/dep-9f1126c1.js';
import { _ as _slicedToArray } from '../_chunks/dep-dc9b74a1.js';
import classNames from 'classnames';
import React, { useState, useRef, useEffect, Children, cloneElement, createElement } from 'react';
import _ from 'lodash';
import DropdownMenu from './DropdownMenu.js';
import DropdownItem from './DropdownItem.js';
import DropdownDivider from './DropdownDivider.js';
import DropdownSearchInput from './DropdownSearchInput.js';
import { Icon } from '../icon/index.js';
import { isNil, isValidElement } from '../_util/reactNode.js';
import '../transition/index.js';
import '../transition/Transition.js';
import './style/css.js';
import '../transition/type.js';
import '../icon/Icon.js';
import '../icon/type.js';
var _excluded = ["as", "text", "fluid", "className", "selection", "name", "value", "placeholder", "on", "search", "clearable", "noResultsMessage", "options", "onClick", "children"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
var Dropdown = function Dropdown(_ref) {
var _ref$as = _ref.as,
as = _ref$as === void 0 ? "div" : _ref$as,
text = _ref.text,
fluid = _ref.fluid,
className = _ref.className,
selection = _ref.selection,
name = _ref.name,
value = _ref.value,
placeholder = _ref.placeholder,
_ref$on = _ref.on,
on = _ref$on === void 0 ? "click" : _ref$on,
search = _ref.search,
clearable = _ref.clearable,
_ref$noResultsMessage = _ref.noResultsMessage,
noResultsMessage = _ref$noResultsMessage === void 0 ? "No results found." : _ref$noResultsMessage,
_ref$options = _ref.options,
options = _ref$options === void 0 ? [] : _ref$options,
onClick = _ref.onClick,
children = _ref.children,
props = _objectWithoutProperties(_ref, _excluded);
var _useState = useState(false),
_useState2 = _slicedToArray(_useState, 2),
visible = _useState2[0],
setVisible = _useState2[1];
var _useState3 = useState(text),
_useState4 = _slicedToArray(_useState3, 2),
textState = _useState4[0],
setTextState = _useState4[1];
var _useState5 = useState(value),
_useState6 = _slicedToArray(_useState5, 2),
inputValue = _useState6[0],
setInputValue = _useState6[1];
var _useState7 = useState(),
_useState8 = _slicedToArray(_useState7, 2),
selectedIndex = _useState8[0],
setSelectedIndex = _useState8[1];
var _useState9 = useState(),
_useState10 = _slicedToArray(_useState9, 2),
searchElement = _useState10[0],
setSearchElement = _useState10[1];
var _useState11 = useState(),
_useState12 = _slicedToArray(_useState11, 2),
searchValue = _useState12[0],
setSearchValue = _useState12[1];
var _useState13 = useState(false),
_useState14 = _slicedToArray(_useState13, 2),
filtered = _useState14[0],
setFiltered = _useState14[1];
var ref = useRef();
var handleClick = function handleClick(e) {
if (on === "click") {
e.stopPropagation();
setVisible(!visible);
}
onClick === null || onClick === void 0 ? void 0 : onClick(e);
};
var handleHover = function handleHover(e) {
if (on === "hover") {
if (e.type === "mouseenter") {
setVisible(true);
} else if (e.type === "mouseleave") {
setVisible(false);
}
}
};
var handleKeyDown = function handleKeyDown(e) {
if (e.key === "Escape") {
e.stopPropagation();
setVisible(false);
}
if (search && e.key === "Enter") {
var _ref$current;
((_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.querySelector(".menu > .item.selected")).click();
}
};
var handleHideDropdown = function handleHideDropdown() {
setVisible(false);
};
var handleSearchChange = function handleSearchChange(e) {
if (e.target.value) {
var _ref$current2;
setFiltered(true);
var endLoop = false;
(_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.querySelectorAll(".menu > .item").forEach(function (item, index) {
setTimeout(function () {
if (item.classList.contains("filtered") === false && endLoop === false) {
setSelectedIndex(index);
endLoop = true;
}
});
});
} else {
setFiltered(false);
setSelectedIndex(0);
}
setSearchValue(e.target.value);
};
var scrollSelectedItemIntoView = function scrollSelectedItemIntoView() {
if (!ref.current) {
return;
}
var menu2 = ref.current.querySelector(".menu");
if (!menu2) {
return;
}
var item = menu2.querySelector(".item.active");
if (!item) {
return;
}
var isOutOfUpperView = item.offsetTop < menu2.scrollTop;
var isOutOfLowerView = item.offsetTop + item.clientHeight > menu2.scrollTop + menu2.clientHeight;
if (isOutOfUpperView) {
menu2.scrollTop = item.offsetTop;
} else if (isOutOfLowerView) {
menu2.scrollTop = item.offsetTop + item.clientHeight - menu2.clientHeight;
}
};
useEffect(function () {
if (visible) {
document.onclick = handleHideDropdown;
if (search) {
setSearchElement( /* @__PURE__ */React.createElement(DropdownSearchInput, {
tabIndex: 0,
onChange: handleSearchChange
}));
if (value === void 0 && selectedIndex === void 0) {
setSelectedIndex(0);
}
}
} else {
document.onclick = null;
if (search) {
setSearchElement(null);
setFiltered(false);
}
}
}, [visible]);
var menu = /* @__PURE__ */React.createElement(React.Fragment, null);
if (isNil(children)) {
var itemChildren = [];
if (selection) {
var hasResults = false;
_.forEach(options, function (item, i) {
var handleItemClick = function handleItemClick() {
setInputValue(item.value);
setTextState(item.text);
setSelectedIndex(i);
setFiltered(false);
};
useEffect(function () {
if (inputValue === item.value) {
setSelectedIndex(i);
setTextState(item.text);
}
}, []);
var findValue = function findValue() {
if (filtered || searchValue) {
var _item$children;
if (typeof item.value === "string" || typeof item.value === "number") {
if (_.toLower(_.trim(item.value.toString())).includes(_.toLower(searchValue)) !== false) {
hasResults = true;
return false;
}
}
if (_.toLower(_.trim(item.text || ((_item$children = item.children) === null || _item$children === void 0 ? void 0 : _item$children.toString()))).includes(_.toLower(searchValue)) !== false) {
hasResults = true;
return false;
}
return true;
} else {
return false;
}
};
if (item.unfilterable) {
hasResults = true;
}
itemChildren.push( /* @__PURE__ */React.createElement(DropdownItem, {
className: classNames({
filtered: item.unfilterable ? false : findValue()
}),
key: i,
active: inputValue === item.value,
selected: selectedIndex === i,
value: item.value,
text: item.text,
onClick: handleItemClick
}));
});
menu = /* @__PURE__ */React.createElement(DropdownMenu, {
open: visible,
onShow: scrollSelectedItemIntoView,
onHide: function onHide() {
return setSearchValue(void 0);
}
}, itemChildren);
} else {
_.forEach(options, function (item, i) {
itemChildren.push( /* @__PURE__ */React.createElement(DropdownItem, _objectSpread({
key: i
}, item)));
});
menu = /* @__PURE__ */React.createElement(DropdownMenu, {
open: visible
}, itemChildren);
}
} else {
var menuChild = Children.only(children);
if (isValidElement(menuChild)) {
if (selection) {
var _hasResults = false;
var _itemChildren = Children.map(menuChild.props.children, function (childItem, i) {
if (isValidElement(childItem)) {
var childItemProps = childItem.props;
useEffect(function () {
if (inputValue === childItemProps.value) {
setSelectedIndex(i);
setTextState(childItemProps.text);
}
}, []);
var findValue = function findValue() {
if (filtered || searchValue) {
var _childItemProps$child;
if (typeof childItemProps.value === "string" || typeof childItemProps.value === "number") {
if (_.toLower(_.trim(childItemProps.value.toString())).includes(_.toLower(searchValue)) !== false) {
_hasResults = true;
return false;
}
}
if (_.toLower(_.trim(childItemProps.text || ((_childItemProps$child = childItemProps.children) === null || _childItemProps$child === void 0 ? void 0 : _childItemProps$child.toString()))).includes(_.toLower(searchValue)) !== false) {
_hasResults = true;
return false;
}
return true;
} else {
return false;
}
};
if (childItemProps.unfilterable) {
_hasResults = true;
}
return /*#__PURE__*/cloneElement(childItem, {
key: i,
active: inputValue === childItemProps.value,
selected: selectedIndex === i,
className: classNames({
filtered: childItemProps.unfilterable ? false : findValue()
}),
onClick: function onClick() {
setInputValue(childItemProps.value);
setTextState(childItemProps.text || childItemProps.children);
setSelectedIndex(i);
setFiltered(false);
}
});
}
});
if (search && searchValue && _hasResults === false) {
_itemChildren = /* @__PURE__ */React.createElement(React.Fragment, null, _itemChildren, /* @__PURE__ */React.createElement("div", {
className: "message"
}, noResultsMessage));
}
menu = /*#__PURE__*/cloneElement(menuChild, {
open: visible,
onShow: scrollSelectedItemIntoView,
onHide: function onHide() {
return setSearchValue(void 0);
}
}, _itemChildren);
} else {
menu = /*#__PURE__*/cloneElement(menuChild, {
open: visible
});
}
}
}
if (!as) {
as = "div";
}
var inputElement = /* @__PURE__ */React.createElement(React.Fragment, null);
if (typeof inputValue === "string" || typeof inputValue === "number") {
inputElement = /* @__PURE__ */React.createElement("input", {
type: "hidden",
name: name,
value: inputValue
});
} else if (typeof inputValue === "boolean") {
inputElement = /* @__PURE__ */React.createElement("input", {
type: "hidden",
name: name,
value: inputValue ? 1 : 0
});
}
return /*#__PURE__*/createElement(as, _objectSpread({
ref: ref,
className: classNames("ui", "dropdown", {
fluid: fluid,
selection: selection,
active: selection && visible,
search: search
}, className),
onClick: handleClick,
onKeyDown: handleKeyDown,
onMouseEnter: handleHover,
onMouseLeave: handleHover,
tabIndex: "0"
}, props), /* @__PURE__ */React.createElement(React.Fragment, null, selection ? /* @__PURE__ */React.createElement(React.Fragment, null, inputElement, /* @__PURE__ */React.createElement(Icon, {
name: "dropdown"
}), searchElement, clearable && selectedIndex !== void 0 && /* @__PURE__ */React.createElement(Icon, {
name: "remove",
onClick: function onClick(e) {
e.stopPropagation();
setSelectedIndex(void 0);
setInputValue(void 0);
setTextState(void 0);
}
}), /* @__PURE__ */React.createElement("div", {
className: classNames("text", {
"default": placeholder && !textState,
filtered: filtered
})
}, textState || placeholder)) : /* @__PURE__ */React.createElement(React.Fragment, null, /* @__PURE__ */React.createElement("div", {
className: "text"
}, textState), /* @__PURE__ */React.createElement(Icon, {
name: "dropdown"
})), menu));
};
Dropdown.displayName = "Dropdown";
Dropdown.Menu = DropdownMenu;
Dropdown.Item = DropdownItem;
Dropdown.Divider = DropdownDivider;
Dropdown.SearchInput = DropdownSearchInput;
export { Dropdown as default };
//# sourceMappingURL=Dropdown.js.map