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

import _typeof from '@babel/runtime/helpers/typeof';
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
import { defineComponent, toRefs, computed, ref, watchEffect, provide, reactive, createVNode, mergeProps, isVNode, h } from 'vue';
import intersection from 'lodash/intersection';
import isFunction from 'lodash/isFunction';
import isObject from 'lodash/isObject';
import isUndefined from 'lodash/isUndefined';
import useVModel from '../hooks/useVModel.js';
import { usePrefixClass } from '../hooks/useConfig.js';
import { useTNodeJSX } from '../hooks/tnode.js';
import { useChildComponentSlots } from '../hooks/slot.js';
import _Checkbox from './checkbox.js';
import props from './checkbox-group-props.js';
import { CheckboxGroupInjectionKey } from './constants.js';
import 'lodash/kebabCase';
import '../config-provider/useConfig.js';
import 'lodash/cloneDeep';
import 'lodash/isString';
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 '../_chunks/dep-e041f5b0.js';
import 'dayjs';
import 'lodash/camelCase';
import '../utils/render-tnode.js';
import 'lodash/isEmpty';
import '../form/hooks.js';
import '../hooks/useRipple.js';
import '../utils/set-style.js';
import '../hooks/useKeepAnimation.js';
import './props.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 _Group = defineComponent({
  name: "TCheckboxGroup",
  props: props,
  setup: function setup(props2) {
    var COMPONENT_NAME = usePrefixClass("checkbox-group");
    var renderTNodeJSX = useTNodeJSX();
    var isArray = Array.isArray;
    var _toRefs = toRefs(props2),
      value = _toRefs.value,
      modelValue = _toRefs.modelValue;
    var _useVModel = useVModel(value, modelValue, props2.defaultValue, props2.onChange),
      _useVModel2 = _slicedToArray(_useVModel, 2),
      innerValue = _useVModel2[0],
      setInnerValue = _useVModel2[1];
    var checkedMap = computed(function () {
      var map = {};
      if (isArray(innerValue.value)) {
        innerValue.value.forEach(function (item) {
          map[item] = true;
        });
      }
      return map;
    });
    var optionList = ref([]);
    var intersectionLen = computed(function () {
      if (!isArray(innerValue.value)) return 0;
      var values = optionList.value.map(function (item) {
        return item.value;
      });
      var n = intersection(innerValue.value, values);
      return n.length;
    });
    var isCheckAll = computed(function () {
      var excludeCount = optionList.value.filter(function (item) {
        return item.disabled || item.checkAll;
      }).length;
      if (isArray(innerValue.value) && innerValue.value.length !== optionList.value.length - excludeCount) return false;
      return intersectionLen.value === optionList.value.length - excludeCount;
    });
    var indeterminate = computed(function () {
      return !isCheckAll.value && intersectionLen.value < optionList.value.length && intersectionLen.value !== 0;
    });
    var maxExceeded = computed(function () {
      return !isUndefined(props2.max) && innerValue.value.length === props2.max;
    });
    watchEffect(function () {
      if (!props2.options) return [];
      optionList.value = props2.options.map(function (item) {
        var _item$disabled;
        return isObject(item) ? _objectSpread(_objectSpread({}, item), {}, {
          disabled: (_item$disabled = item.disabled) !== null && _item$disabled !== void 0 ? _item$disabled : props2.disabled
        }) : {
          label: String(item),
          value: item
        };
      });
    });
    var getAllCheckboxValue = function getAllCheckboxValue() {
      var val = /* @__PURE__ */new Set();
      for (var i = 0, len = optionList.value.length; i < len; i++) {
        var item = optionList.value[i];
        if (item.checkAll) continue;
        if (item.disabled) continue;
        val.add(item.value);
        if (maxExceeded.value) break;
      }
      return _toConsumableArray(val);
    };
    var onCheckAllChange = function onCheckAllChange(checked, context) {
      var value2 = checked ? getAllCheckboxValue() : [];
      setInnerValue(value2, {
        e: context.e,
        type: checked ? "check" : "uncheck",
        current: void 0,
        option: void 0
      });
    };
    var handleCheckboxChange = function handleCheckboxChange(data) {
      var currentValue = data.option.value;
      if (!isArray(innerValue.value)) {
        console.warn("TDesign CheckboxGroup Warn: `value` must be an array, instead of ".concat(_typeof(innerValue.value)));
        return;
      }
      var val = _toConsumableArray(innerValue.value);
      if (data.checked) {
        val.push(currentValue);
      } else {
        var i = val.indexOf(currentValue);
        val.splice(i, 1);
      }
      setInnerValue(val, {
        e: data.e,
        current: data.option.value,
        option: data.option,
        type: data.checked ? "check" : "uncheck"
      });
    };
    var onCheckedChange = function onCheckedChange(p) {
      var checked = p.checked,
        checkAll = p.checkAll,
        e = p.e;
      if (checkAll) onCheckAllChange(checked, {
        e: e
      });else handleCheckboxChange(p);
    };
    var getChildComponentSlots = useChildComponentSlots();
    var getOptionListBySlots = function getOptionListBySlots() {
      var nodes = getChildComponentSlots("Checkbox");
      var arr = [];
      nodes === null || nodes === void 0 ? void 0 : nodes.forEach(function (node) {
        var option = node.props;
        if (!option) return;
        if (option["check-all"] === "" || option["check-all"] === true) option.checkAll = true;
        arr.push(option);
      });
      return arr;
    };
    var renderLabel = function renderLabel(option) {
      if (isFunction(option.label)) return option.label(h);
      return option.label;
    };
    var _toRefs2 = toRefs(props2),
      name = _toRefs2.name,
      disabled = _toRefs2.disabled;
    provide(CheckboxGroupInjectionKey, reactive({
      name: name,
      isCheckAll: isCheckAll,
      checkedMap: checkedMap,
      maxExceeded: maxExceeded,
      disabled: disabled,
      indeterminate: indeterminate,
      handleCheckboxChange: handleCheckboxChange,
      onCheckedChange: onCheckedChange
    }));
    return function () {
      var _props2$options;
      var children = null;
      if ((_props2$options = props2.options) !== null && _props2$options !== void 0 && _props2$options.length) {
        var _optionList$value;
        children = (_optionList$value = optionList.value) === null || _optionList$value === void 0 ? void 0 : _optionList$value.map(function (option, index) {
          var _slot;
          return createVNode(_Checkbox, mergeProps({
            "key": "".concat(option.value).concat(index)
          }, option, {
            "checked": checkedMap.value[option.value]
          }), _isSlot(_slot = renderLabel(option)) ? _slot : {
            "default": function _default() {
              return [_slot];
            }
          });
        });
      } else {
        var nodes = renderTNodeJSX("default");
        optionList.value = getOptionListBySlots();
        children = nodes;
      }
      return createVNode("div", {
        "class": COMPONENT_NAME.value
      }, [children]);
    };
  }
});

export { _Group as default };
//# sourceMappingURL=group.js.map
