{"version":3,"file":"drawer.vue2.mjs","sources":["../../../../../../packages/components/drawer/src/drawer.vue"],"sourcesContent":["<script lang=\"ts\">\n  import { computed, defineComponent, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue'\n  import type { StyleValue } from 'vue'\n  import { getComponentNamespace, getNamespace } from '../../../utils/global-config'\n  import { upperFirstChar, addUnit } from '../../../shared/utils'\n  import { isFunction, isPromise } from '../../../utils/is'\n  import { useOverflow } from '../../../hooks/use-overflow'\n  import BnButton from '../../../components/button/src/button.vue'\n  import BnSpace from '../../../components/space/src/space.vue'\n  import { KEYBOARD_KEY } from '../../../utils/keyboard'\n  import { getElement, off, on } from '../../../utils/dom'\n  import usePopupManager from '../../../hooks/use-popup-manager'\n  import { Scrollbar } from '../../scrollbar'\n  import { drawerProps } from './props'\n\n  export default defineComponent({\n    name: getComponentNamespace('Drawer'),\n    components: {\n      BnButton,\n      BnSpace,\n      Scrollbar\n    },\n    inheritAttrs: false,\n    props: drawerProps,\n    emits: ['update:modelValue', 'close', 'closed', 'open', 'opened'],\n    setup(props, { emit }) {\n      const ns = getNamespace('drawer')\n\n      const containerStyle = computed(() => {\n        const style: StyleValue = {}\n\n        if (props.width && ['left', 'right'].includes(props.placement)) {\n          style.width = addUnit(props.width)\n        }\n        if (props.height && ['top', 'bottom'].includes(props.placement)) {\n          style.height = addUnit(props.height)\n        }\n        return style\n      })\n\n      const modelVisible = computed(() => props.modelValue)\n      const animation = ref(false)\n      const mergeVisible = computed(() => modelVisible.value || animation.value)\n\n      const teleportContainer = computed(() => getElement(props.renderTo))\n      const drawerRef = ref<HTMLElement>()\n\n      const drawerBodyStyle = computed(() => {\n        const style: StyleValue = {}\n        if (props.showFooter) {\n          style.height = `calc(100% - 68px - 80px)`\n        } else {\n          style.height = `calc(100% - 68px)`\n        }\n        return style\n      })\n\n      const { zIndex, isLastDialog } = usePopupManager('dialog', {\n        visible: modelVisible\n      })\n\n      const { setOverflowHidden, resetOverflow } = useOverflow(teleportContainer, drawerRef)\n\n      const drawerStyle = computed(() => {\n        const style: StyleValue = {\n          zIndex: zIndex.value\n        }\n        return style\n      })\n\n      const emitToClose = (action: 'cancel' | 'ok', e?: Event) => {\n        emit('update:modelValue', false)\n        emit('close', action, e)\n      }\n\n      const loadingObj = reactive({\n        ok: false,\n        cancel: false\n      })\n\n      const interceptClose = (action: 'ok' | 'cancel', e?: Event) => {\n        const fnKey = `onBefore${upperFirstChar(action)}` as 'onBeforeOk' | 'onBeforeCancel'\n        const interceptFn = props[fnKey]\n        let result: boolean | Promise<boolean> = true\n        loadingObj[action] = true\n        if (isFunction(interceptFn)) {\n          result = interceptFn() ?? false\n        }\n        if (isPromise(result)) {\n          result.then((res) => {\n            loadingObj[action] = false\n            res && emitToClose(action, e)\n          })\n          return\n        }\n        loadingObj[action] = false\n        result && emitToClose(action, e)\n      }\n\n      const handleMask = () => {\n        if (!props.maskToClose) return\n        if (!props.mask) return\n        interceptClose('cancel')\n      }\n\n      const afterEnter = () => {\n        emit('opened')\n      }\n\n      // 动画结束\n      const afterLeave = () => {\n        animation.value = false\n        resetOverflow()\n        emit('closed')\n      }\n\n      let globalKeyDownListener = false\n\n      const handleGlobalKeyDown = (ev: KeyboardEvent) => {\n        if (props.escToClose && ev.key === KEYBOARD_KEY.ESC && isLastDialog()) {\n          interceptClose('cancel')\n        }\n      }\n\n      const addGlobalKeyDownListener = () => {\n        if (props.escToClose && !globalKeyDownListener) {\n          globalKeyDownListener = true\n          on(document.documentElement, 'keydown', handleGlobalKeyDown)\n        }\n      }\n\n      const removeGlobalKeyDownListener = () => {\n        globalKeyDownListener = false\n        off(document.documentElement, 'keydown', handleGlobalKeyDown)\n      }\n\n      onMounted(() => {\n        if (modelVisible.value) {\n          props.escToClose && addGlobalKeyDownListener()\n        }\n      })\n\n      // 页面意外关闭\n      onBeforeUnmount(() => {\n        resetOverflow()\n        removeGlobalKeyDownListener()\n      })\n\n      watch(\n        () => modelVisible.value,\n        (val) => {\n          if (val) {\n            emit('open')\n            setOverflowHidden()\n            animation.value = true\n            // 监听键盘事件\n            addGlobalKeyDownListener()\n          } else {\n            // 移除键盘事件\n            removeGlobalKeyDownListener()\n          }\n        }\n      )\n\n      // footer按钮内部控制\n      const handleCancel = (e: Event) => {\n        interceptClose('cancel', e)\n      }\n      const handleOk = (e: Event) => {\n        interceptClose('ok', e)\n      }\n\n      return {\n        ns,\n        containerStyle,\n        drawerStyle,\n        teleportContainer,\n        drawerRef,\n        modelVisible,\n        mergeVisible,\n        drawerBodyStyle,\n        handleMask,\n        afterEnter,\n        afterLeave,\n        interceptClose,\n        handleCancel,\n        handleOk,\n        loadingObj\n      }\n    }\n  })\n</script>\n\n<template>\n  <teleport :to=\"teleportContainer\" :disabled=\"disabled || !teleportContainer\">\n    <div\n      v-if=\"!destroyOnClosed || mergeVisible\"\n      v-show=\"mergeVisible\"\n      ref=\"drawerRef\"\n      :class=\"[`${ns}`, popupClass]\"\n      :style=\"drawerStyle\"\n      v-bind=\"$attrs\"\n    >\n      <transition name=\"bn-fade-in-standard\" appear>\n        <div v-if=\"mask\" v-show=\"modelVisible\" :class=\"`${ns}__mask`\" @click.self=\"handleMask\" />\n      </transition>\n      <transition\n        :name=\"`bn-slide-${placement}`\"\n        appear\n        @after-enter=\"afterEnter\"\n        @after-leave=\"afterLeave\"\n      >\n        <div\n          v-show=\"modelVisible\"\n          :class=\"[`${ns}__container`, `is-${placement}`]\"\n          :style=\"containerStyle\"\n        >\n          <slot>\n            <div :class=\"[`${ns}__header`]\">\n              <!-- title插槽 -->\n              <slot name=\"title\">\n                <span :class=\"[`${ns}__title`]\">{{ title }}</span>\n              </slot>\n            </div>\n            <div :class=\"[`${ns}__body`]\" :style=\"drawerBodyStyle\">\n              <Scrollbar>\n                <!-- body插槽 -->\n                <slot name=\"body\"></slot>\n              </Scrollbar>\n            </div>\n            <div v-if=\"showFooter\" :class=\"[`${ns}__footer`, `is-${placement}`]\">\n              <!-- footer插槽 -->\n              <slot name=\"footer\" :ok=\"handleOk\" :cancel=\"handleCancel\" :loading-obj=\"loadingObj\">\n                <BnSpace :size=\"12\">\n                  <BnButton type=\"primary\" :loading=\"loadingObj.ok\" @click=\"handleOk\"\n                    >{{ `${okText ? okText : '确认'}` }}\n                  </BnButton>\n                  <BnButton :loading=\"loadingObj.cancel\" @click=\"handleCancel\">{{\n                    `${cancelText ? cancelText : '取消'}`\n                  }}</BnButton>\n                </BnSpace>\n              </slot>\n            </div>\n          </slot>\n          <span\n            v-if=\"showClose\"\n            :class=\"[`${ns}__close-icon`]\"\n            @click=\"interceptClose('cancel')\"\n          ></span>\n        </div>\n      </transition>\n    </div>\n  </teleport>\n</template>\n"],"names":["BnButton","BnSpace"],"mappings":"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"}