/**
 * ldesign v0.3.13
 * (c) 2023 ldesign
 * @license MIT
 */

import _defineProperty from '@babel/runtime/helpers/defineProperty';
import { defineComponent, inject, ref, computed, createVNode, mergeProps, isVNode } from 'vue';
import isFunction from 'lodash/isFunction';
import omit from 'lodash/omit';
import { useTNodeJSX, useTNodeDefault } from '../hooks/tnode.js';
import { usePrefixClass } from '../hooks/useConfig.js';
import _Option from './option.js';
import _OptionGroup from './optionGroup.js';
import props from './props.js';
import { usePanelVirtualScroll } from './hooks/usePanelVirtualScroll.js';
import { selectInjectKey } from './helper.js';
import { useConfig } from '../config-provider/useConfig.js';
import 'lodash/camelCase';
import 'lodash/kebabCase';
import '../utils/render-tnode.js';
import 'lodash/isEmpty';
import 'lodash/isString';
import 'lodash/isObject';
import 'lodash/cloneDeep';
import '../config-provider/context.js';
import 'lodash/mergeWith';
import 'lodash/merge';
import 'lodash/isArray';
import '../_common/js/global-config/default-config.js';
import '../_common/js/global-config/locale/zh_CN.js';
import '@babel/runtime/helpers/typeof';
import '../_chunks/dep-e041f5b0.js';
import 'dayjs';
import '../checkbox/index.js';
import '../utils/withInstall.js';
import '../checkbox/checkbox.js';
import '@babel/runtime/helpers/slicedToArray';
import '../hooks/useVModel.js';
import '../form/hooks.js';
import '../hooks/useRipple.js';
import '../utils/set-style.js';
import '../hooks/useKeepAnimation.js';
import '../checkbox/props.js';
import '../checkbox/constants.js';
import '../checkbox/group.js';
import '@babel/runtime/helpers/toConsumableArray';
import 'lodash/intersection';
import 'lodash/isUndefined';
import '../hooks/slot.js';
import '../checkbox/checkbox-group-props.js';
import './option-props.js';
import './option-group-props.js';
import '../hooks/useVirtualScroll.js';

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; }
function _isSlot(s) {
  return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !isVNode(s);
}
var SelectPanel = defineComponent({
  name: "TSelectPanel",
  props: {
    inputValue: props.inputValue,
    panelTopContent: props.panelTopContent,
    panelBottomContent: props.panelBottomContent,
    empty: props.empty,
    creatable: props.creatable,
    loading: props.loading,
    loadingText: props.loadingText,
    multiple: props.multiple,
    filterable: props.filterable,
    filter: props.filter,
    options: {
      type: Array,
      "default": function _default() {
        return [];
      }
    },
    scroll: props.scroll
  },
  setup: function setup(props, _ref) {
    var expose = _ref.expose;
    var COMPONENT_NAME = usePrefixClass("select");
    var renderTNodeJSX = useTNodeJSX();
    var renderDefaultTNode = useTNodeDefault();
    var _useConfig = useConfig("select"),
      t = _useConfig.t,
      globalConfig = _useConfig.globalConfig;
    var tSelect = inject(selectInjectKey);
    var innerRef = ref(null);
    var popupContentRef = computed(function () {
      return tSelect.value.popupContentRef.value;
    });
    var showCreateOption = computed(function () {
      return props.creatable && props.filterable && props.inputValue;
    });
    var displayOptions = computed(function () {
      if (!props.inputValue || !(props.filterable || isFunction(props.filter))) return props.options;
      var filterMethods = function filterMethods(option) {
        var _option$label, _option$label$toLower;
        if (isFunction(props.filter)) return props.filter("".concat(props.inputValue), option);
        return ((_option$label = option.label) === null || _option$label === void 0 ? void 0 : (_option$label$toLower = _option$label.toLowerCase) === null || _option$label$toLower === void 0 ? void 0 : _option$label$toLower.call(_option$label).indexOf("".concat(props.inputValue).toLowerCase())) > -1;
      };
      var res = [];
      props.options.forEach(function (option) {
        if (option.group && option.children) {
          res.push(_objectSpread(_objectSpread({}, option), {}, {
            children: option.children.filter(filterMethods)
          }));
        }
        if (filterMethods(option)) res.push(option);
      });
      return res;
    });
    var _usePanelVirtualScrol = usePanelVirtualScroll({
        scroll: props.scroll,
        popupContentRef: popupContentRef,
        options: displayOptions
      }),
      trs = _usePanelVirtualScrol.trs,
      visibleData = _usePanelVirtualScrol.visibleData,
      handleRowMounted = _usePanelVirtualScrol.handleRowMounted,
      isVirtual = _usePanelVirtualScrol.isVirtual,
      panelStyle = _usePanelVirtualScrol.panelStyle,
      cursorStyle = _usePanelVirtualScrol.cursorStyle;
    var isEmpty = computed(function () {
      return !displayOptions.value.length;
    });
    var renderCreateOption = function renderCreateOption() {
      return createVNode("ul", {
        "class": ["".concat(COMPONENT_NAME.value, "__create-option"), "".concat(COMPONENT_NAME.value, "__list")]
      }, [createVNode(_Option, {
        "value": props.inputValue,
        "label": "".concat(props.inputValue),
        "createAble": true,
        "class": "".concat(COMPONENT_NAME.value, "__create-option--special")
      }, null)]);
    };
    var renderOptionsContent = function renderOptionsContent(options) {
      return createVNode("ul", {
        "class": "".concat(COMPONENT_NAME.value, "__list")
      }, [options.map(function (item, index) {
        var _props$scroll, _props$scroll2;
        if (item.group) {
          var _slot;
          return createVNode(_OptionGroup, {
            "label": item.group,
            "divider": item.divider
          }, _isSlot(_slot = renderOptionsContent(item.children)) ? _slot : {
            "default": function _default() {
              return [_slot];
            }
          });
        }
        return createVNode(_Option, mergeProps(omit(item, "$index"), isVirtual.value ? {
          rowIndex: item.$index,
          trs: trs,
          scrollType: (_props$scroll = props.scroll) === null || _props$scroll === void 0 ? void 0 : _props$scroll.type,
          isVirtual: isVirtual.value,
          bufferSize: (_props$scroll2 = props.scroll) === null || _props$scroll2 === void 0 ? void 0 : _props$scroll2.bufferSize,
          key: "".concat(item.$index || "", "_").concat(index)
        } : {
          key: index
        }, {
          "multiple": props.multiple,
          "onRowMounted": handleRowMounted
        }), item.slots);
      })]);
    };
    var dropdownInnerSize = computed(function () {
      return {
        small: "s",
        medium: "m",
        large: "l"
      }[tSelect.value.size];
    });
    expose({
      innerRef: innerRef
    });
    var renderPanel = function renderPanel(options, extraStyle) {
      return createVNode("div", {
        "ref": innerRef,
        "class": ["".concat(COMPONENT_NAME.value, "__dropdown-inner"), "".concat(COMPONENT_NAME.value, "__dropdown-inner--size-").concat(dropdownInnerSize.value)],
        "onClick": function onClick(e) {
          return e.stopPropagation();
        },
        "style": extraStyle
      }, [renderTNodeJSX("panelTopContent"), showCreateOption.value && renderCreateOption(), props.loading && renderDefaultTNode("loadingText", {
        defaultNode: createVNode("div", {
          "class": "".concat(COMPONENT_NAME.value, "__loading-tips")
        }, [t(globalConfig.value.loadingText)])
      }), !props.loading && isEmpty.value && !showCreateOption.value && renderDefaultTNode("empty", {
        defaultNode: createVNode("div", {
          "class": "".concat(COMPONENT_NAME.value, "__empty")
        }, [t(globalConfig.value.empty)])
      }), !isEmpty.value && !props.loading && renderOptionsContent(options), renderTNodeJSX("panelBottomContent")]);
    };
    return {
      renderPanel: renderPanel,
      panelStyle: panelStyle,
      cursorStyle: cursorStyle,
      isVirtual: isVirtual,
      displayOptions: displayOptions,
      visibleData: visibleData
    };
  },
  render: function render() {
    return this.isVirtual ? createVNode("div", null, [createVNode("div", {
      "style": this.cursorStyle
    }, null), this.renderPanel(this.visibleData, this.panelStyle)]) : this.renderPanel(this.displayOptions);
  }
});

export { SelectPanel as default };
//# sourceMappingURL=select-panel.js.map
