UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 30.4 kB
{"version":3,"file":"dialog.mjs","sources":["../../src/dialog/dialog.tsx"],"sourcesContent":["import {\n computed,\n defineComponent,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n Transition,\n watch,\n getCurrentInstance,\n Teleport,\n} from 'vue';\n\nimport { DialogCloseContext } from './type';\nimport props from './props';\nimport { useConfig, usePrefixClass } from '../hooks/useConfig';\nimport { useAction, useSameTarget } from './hooks';\nimport { useTNodeJSX, useContent } from '../hooks/tnode';\nimport useDestroyOnClose from '../hooks/useDestroyOnClose';\nimport { stack } from './stack';\nimport { getScrollbarWidth } from '../_common/js/utils/getScrollbarWidth';\n\nimport type { TdDialogProps } from './type';\nimport useTeleport from '../hooks/useTeleport';\n\nfunction GetCSSValue(v: string | number) {\n return Number.isNaN(Number(v)) ? v : `${Number(v)}px`;\n}\n\nlet mousePosition: { x: number; y: number } | null;\nconst getClickPosition = (e: MouseEvent) => {\n mousePosition = {\n x: e.clientX,\n y: e.clientY,\n };\n setTimeout(() => {\n mousePosition = null;\n }, 100);\n};\n\nif (typeof window !== 'undefined' && window.document && window.document.documentElement) {\n document.documentElement.addEventListener('click', getClickPosition, true);\n}\n\nfunction InitDragEvent(dragBox: HTMLElement) {\n const target = dragBox;\n const windowInnerWidth = window.innerWidth || document.documentElement.clientWidth;\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\n target.addEventListener('mousedown', (targetEvent: MouseEvent) => {\n // 算出鼠标相对元素的位置\n const disX = targetEvent.clientX - target.offsetLeft;\n const disY = targetEvent.clientY - target.offsetTop;\n const dialogW = target.offsetWidth;\n const dialogH = target.offsetHeight;\n // 如果弹出框超出屏幕范围 不能进行拖拽\n if (dialogW > windowInnerWidth || dialogH > windowInnerHeight) return;\n function mouseMoverHandler(documentEvent: MouseEvent) {\n // 用鼠标的位置减去鼠标相对元素的位置,得到元素的位置\n let left = documentEvent.clientX - disX;\n let top = documentEvent.clientY - disY;\n // 临界判断\n // 拖拽上左边界限制\n if (left < 0) left = 0;\n if (top < 0) top = 0;\n if (windowInnerWidth - target.offsetWidth - left < 0) left = windowInnerWidth - target.offsetWidth;\n if (windowInnerHeight - target.offsetHeight - top < 0) top = windowInnerHeight - target.offsetHeight;\n target.style.position = 'absolute';\n target.style.left = `${left}px`;\n target.style.top = `${top}px`;\n }\n function mouseUpHandler() {\n // 鼠标弹起来的时候不再移动\n document.removeEventListener('mousemove', mouseMoverHandler);\n // 预防鼠标弹起来后还会循环(即预防鼠标放上去的时候还会移动)\n document.removeEventListener('mouseup', mouseUpHandler);\n }\n // 元素按下时注册document鼠标监听事件\n document.addEventListener('mousemove', mouseMoverHandler);\n // 鼠标弹起来移除document鼠标监听事件\n document.addEventListener('mouseup', mouseUpHandler);\n // 拖拽结束移除鼠标监听事件,解决文字拖拽结束事件未解绑问题\n document.addEventListener('dragend', mouseUpHandler);\n });\n}\n\nlet key = 1;\n\nexport default defineComponent({\n name: 'XDialog',\n // 注册v-draggable指令,传入true时候初始化拖拽事件\n directives: {\n draggable(el, binding) {\n // el 指令绑定的元素\n if (el && binding && binding.value) {\n InitDragEvent(el);\n }\n },\n },\n inheritAttrs: false,\n props,\n emits: ['update:visible'],\n setup(props, context) {\n const COMPONENT_NAME = usePrefixClass('dialog');\n const classPrefix = usePrefixClass();\n const renderContent = useContent();\n const renderTNodeJSX = useTNodeJSX();\n const dialogEle = ref<HTMLElement | null>(null);\n const { globalConfig } = useConfig('dialog');\n\n const confirmBtnAction = (e: MouseEvent) => {\n props.onConfirm?.({ e });\n };\n const cancelBtnAction = (e: MouseEvent) => {\n props.onCancel?.({ e });\n emitCloseEvent({ e, trigger: 'cancel' });\n };\n const { getConfirmBtn, getCancelBtn } = useAction({ confirmBtnAction, cancelBtnAction });\n // teleport容器\n const teleportElement = useTeleport(() => props.attach);\n useDestroyOnClose();\n const timer = ref();\n const styleEl = ref();\n // 是否模态形式的对话框\n const isModal = computed(() => props.mode === 'modal');\n // 是否非模态对话框\n const isModeLess = computed(() => props.mode === 'modeless');\n // 是否普通对话框,没有脱离文档流的对话框\n const isNormal = computed(() => props.mode === 'normal');\n // 是否全屏对话框\n const isFullScreen = computed(() => props.mode === 'full-screen');\n const maskClass = computed(() => [\n `${COMPONENT_NAME.value}__mask`,\n !props.showOverlay && `${classPrefix.value}-is-hidden`,\n ]);\n const positionClass = computed(() => {\n if (isNormal.value) return [];\n if (isFullScreen.value) return [`${COMPONENT_NAME.value}__position_fullscreen`];\n\n return [\n `${COMPONENT_NAME.value}__position`,\n !!props.top && `${COMPONENT_NAME.value}--top`,\n `${props.placement && !props.top ? `${COMPONENT_NAME.value}--${props.placement}` : ''}`,\n ];\n });\n const wrapClass = computed(() => [!isNormal.value && `${COMPONENT_NAME.value}__wrap`]);\n const positionStyle = computed(() => {\n if (isFullScreen.value) return {}; // 全屏模式,top属性不生效\n\n // 此处获取定位方式 top 优先级较高 存在时 默认使用top定位\n const { top } = props;\n let topStyle = {};\n if (top !== undefined) {\n const topValue = GetCSSValue(top);\n topStyle = { paddingTop: topValue };\n }\n return topStyle;\n });\n const dialogClass = computed(() => {\n const dialogClass = [\n `${COMPONENT_NAME.value}`,\n `${COMPONENT_NAME.value}__modal-${props.theme}`,\n isModeLess.value && props.draggable && `${COMPONENT_NAME.value}--draggable`,\n ];\n\n if (isFullScreen.value) {\n dialogClass.push(`${COMPONENT_NAME.value}__fullscreen`);\n } else {\n dialogClass.push(...[`${COMPONENT_NAME.value}--default`, `${COMPONENT_NAME.value}--${props.placement}`]);\n }\n return dialogClass;\n });\n const dialogStyle = computed(() => {\n return !isFullScreen.value ? { width: GetCSSValue(props.width) } : {}; // width全屏模式不生效\n });\n\n watch(\n () => props.visible,\n (value) => {\n if (value) {\n if ((isModal.value && !props.showInAttachedElement) || isFullScreen.value) {\n if (props.preventScrollThrough) {\n document.head.appendChild(styleEl.value);\n }\n\n nextTick(() => {\n if (mousePosition && dialogEle.value) {\n dialogEle.value.style.transformOrigin = `${mousePosition.x - dialogEle.value.offsetLeft}px ${\n mousePosition.y - dialogEle.value.offsetTop\n }px`;\n }\n });\n }\n // 清除鼠标焦点 避免entry事件多次触发(按钮弹出弹窗 不移除焦点 立即按Entry按键 会造成弹窗关闭再弹出)\n (document.activeElement as HTMLElement)?.blur();\n } else {\n clearStyleFunc();\n }\n storeUid(value);\n addKeyboardEvent(value);\n },\n );\n\n function destroySelf() {\n styleEl.value.parentNode?.removeChild?.(styleEl.value);\n }\n\n function clearStyleFunc() {\n clearTimeout(timer.value);\n timer.value = setTimeout(() => {\n destroySelf();\n }, 150);\n }\n\n const instance = getCurrentInstance();\n const storeUid = (flag: boolean) => {\n if (flag) {\n stack.push(instance.uid);\n } else {\n stack.pop();\n }\n };\n\n const addKeyboardEvent = (status: boolean) => {\n if (status) {\n document.addEventListener('keydown', keyboardEvent);\n props.confirmOnEnter && document.addEventListener('keydown', keyboardEnterEvent);\n } else {\n document.removeEventListener('keydown', keyboardEvent);\n props.confirmOnEnter && document.removeEventListener('keydown', keyboardEnterEvent);\n }\n };\n // 回车出发确认事件\n const keyboardEnterEvent = (e: KeyboardEvent) => {\n const eventSrc = e.target as HTMLElement;\n if (eventSrc.tagName.toLowerCase() === 'input') return; // 若是input触发 则不执行\n const { code } = e;\n if ((code === 'Enter' || code === 'NumpadEnter') && stack.top === instance.uid) {\n props.onConfirm?.({ e });\n }\n };\n const keyboardEvent = (e: KeyboardEvent) => {\n if (e.code === 'Escape' && stack.top === instance.uid) {\n props.onEscKeydown?.({ e });\n // 根据closeOnEscKeydown判断按下ESC时是否触发close事件\n if (props.closeOnEscKeydown ?? globalConfig.value.closeOnEscKeydown) {\n emitCloseEvent({ e, trigger: 'esc' });\n }\n }\n };\n const overlayAction = (e: MouseEvent) => {\n if (props.showOverlay && (props.closeOnOverlayClick ?? globalConfig.value.closeOnOverlayClick)) {\n props.onOverlayClick?.({ e });\n emitCloseEvent({ e, trigger: 'overlay' });\n }\n };\n const { onClick, onMousedown, onMouseup } = useSameTarget(overlayAction);\n const closeBtnAction = (e: MouseEvent) => {\n props.onCloseBtnClick?.({ e });\n emitCloseEvent({\n trigger: 'close-btn',\n e,\n });\n };\n\n // 打开弹窗动画结束时事件\n const afterEnter = () => {\n props.onOpened?.();\n };\n // 关闭弹窗动画结束时事件\n const afterLeave = () => {\n if (isModeLess.value && props.draggable && dialogEle.value) {\n // 关闭弹窗 清空拖拽设置的相关css\n dialogEle.value.style.position = 'relative';\n dialogEle.value.style.left = 'unset';\n dialogEle.value.style.top = 'unset';\n }\n props.onClosed?.();\n };\n\n const emitCloseEvent = (ctx: DialogCloseContext) => {\n props.onClose?.(ctx);\n // 默认关闭弹窗\n context.emit('update:visible', false);\n };\n\n // Vue在引入阶段对事件的处理还做了哪些初始化操作。Vue在实例上用一个_events属性存贮管理事件的派发和更新,\n // 暴露出$on, $once, $off, $emit方法给外部管理事件和派发执行事件\n // 所以通过判断_events某个事件下监听函数数组是否超过一个,可以判断出组件是否监听了当前事件\n const hasEventOn = (name: string) => {\n // _events 因没有被暴露在vue实例接口中,只能把这个规则注释掉\n // eslint-disable-next-line dot-notation\n const eventFuncs = this['_events']?.[name];\n return !!eventFuncs?.length;\n };\n const getIcon = () => {\n const icon = {\n info: <icon-ri-information-fill class={`${classPrefix.value}-is-info`} />,\n warning: <icon-ri-error-warning-fill class={`${classPrefix.value}-is-warning`} />,\n danger: <icon-ri-error-warning-fill class={`${classPrefix.value}-is-error`} />,\n success: <icon-ri-checkbox-circle-fill class={`${classPrefix.value}-is-success`} />,\n };\n return icon[props.theme];\n };\n const renderDialog = () => {\n // header 值为 true 显示空白头部\n const defaultHeader = <h5 class=\"title\"></h5>;\n const defaultCloseBtn = <icon-ri-close-line />;\n const body = renderContent('default', 'body');\n const defaultFooter = (\n <div>\n {getCancelBtn({\n cancelBtn: props.cancelBtn as TdDialogProps['cancelBtn'],\n globalCancel: globalConfig.value.cancel,\n className: `${COMPONENT_NAME.value}__cancel`,\n })}\n {getConfirmBtn({\n theme: props.theme,\n confirmBtn: props.confirmBtn as TdDialogProps['confirmBtn'],\n globalConfirm: globalConfig.value.confirm,\n globalConfirmBtnTheme: globalConfig.value.confirmBtnTheme,\n className: `${COMPONENT_NAME.value}__confirm`,\n })}\n </div>\n );\n const headerClassName = isFullScreen.value\n ? [`${COMPONENT_NAME.value}__header`, `${COMPONENT_NAME.value}__header--fullscreen`]\n : `${COMPONENT_NAME.value}__header`;\n\n const closeClassName = isFullScreen.value\n ? [`${COMPONENT_NAME.value}__close`, `${COMPONENT_NAME.value}__close--fullscreen`]\n : `${COMPONENT_NAME.value}__close`;\n\n const bodyClassName =\n props.theme === 'default' ? [`${COMPONENT_NAME.value}__body`] : [`${COMPONENT_NAME.value}__body__icon`];\n\n const footerContent = renderTNodeJSX('footer', defaultFooter);\n\n if (isFullScreen.value && footerContent) {\n bodyClassName.push(`${COMPONENT_NAME.value}__body--fullscreen`);\n } else if (isFullScreen.value) {\n bodyClassName.push(`${COMPONENT_NAME.value}__body--fullscreen--without-footer`);\n }\n\n const footerClassName = isFullScreen.value\n ? [`${COMPONENT_NAME.value}__footer`, `${COMPONENT_NAME.value}__footer--fullscreen`]\n : `${COMPONENT_NAME.value}__footer`;\n\n const onStopDown = (e: MouseEvent) => {\n if (isModeLess.value && props.draggable) e.stopPropagation();\n };\n\n return (\n // /* 非模态形态下draggable为true才允许拖拽 */\n <div class={wrapClass.value}>\n <div\n class={positionClass.value}\n style={positionStyle.value}\n onClick={onClick}\n onMousedown={onMousedown}\n onMouseup={onMouseup}\n >\n <div\n key=\"dialog\"\n class={dialogClass.value}\n style={dialogStyle.value}\n v-draggable={isModeLess.value && props.draggable}\n ref={dialogEle}\n >\n <div class={headerClassName} onMousedown={onStopDown}>\n <div class={`${COMPONENT_NAME.value}__header-content`}>\n {getIcon()}\n {renderTNodeJSX('header', defaultHeader)}\n </div>\n\n {props.closeBtn ? (\n <span class={closeClassName} onClick={closeBtnAction}>\n {renderTNodeJSX('closeBtn', defaultCloseBtn)}\n </span>\n ) : null}\n </div>\n <div class={bodyClassName} onMousedown={onStopDown}>\n {body}\n </div>\n {footerContent && (\n <div class={footerClassName} onMousedown={onStopDown}>\n {footerContent}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n onMounted(() => {\n const hasScrollBar = document.documentElement.scrollHeight > document.documentElement.clientHeight;\n const scrollWidth = hasScrollBar ? getScrollbarWidth() : 0;\n styleEl.value = document.createElement('style');\n styleEl.value.dataset.id = `td_dialog_${+new Date()}_${(key += 1)}`;\n styleEl.value.innerHTML = `\n html body {\n overflow-y: hidden;\n width: calc(100% - ${scrollWidth}px);\n }\n `;\n });\n\n onBeforeUnmount(() => {\n addKeyboardEvent(false);\n destroySelf();\n });\n\n return {\n COMPONENT_NAME,\n isModal,\n isModeLess,\n isFullScreen,\n maskClass,\n dialogClass,\n dialogStyle,\n dialogEle,\n afterEnter,\n afterLeave,\n hasEventOn,\n renderDialog,\n teleportElement,\n };\n },\n render() {\n const { COMPONENT_NAME } = this;\n const maskView = (this.isModal || this.isFullScreen) && <div key=\"mask\" class={this.maskClass}></div>;\n const dialogView = this.renderDialog();\n const view = [maskView, dialogView];\n const ctxStyle = { zIndex: this.zIndex };\n // dialog__ctx--fixed 绝对定位\n // dialog__ctx--absolute 挂载在attach元素上 相对定位\n // __ctx--modeless modeless 点击穿透\n const ctxClass = [\n `${COMPONENT_NAME}__ctx`,\n {\n [`${COMPONENT_NAME}__ctx--fixed`]: this.isModal || this.isFullScreen,\n [`${COMPONENT_NAME}__ctx--absolute`]: this.isModal && this.showInAttachedElement,\n [`${COMPONENT_NAME}__ctx--modeless`]: this.isModeLess,\n },\n ];\n return (\n <Teleport disabled={!this.attach || !this.teleportElement} to={this.teleportElement}>\n <Transition\n duration={300}\n name={`${COMPONENT_NAME}-zoom__vue`}\n onAfterEnter={this.afterEnter}\n onAfterLeave={this.afterLeave}\n >\n {(!this.destroyOnClose || this.visible) && (\n <div v-show={this.visible} class={ctxClass} style={ctxStyle} {...this.$attrs}>\n {view}\n </div>\n )}\n </Transition>\n </Teleport>\n );\n },\n});\n"],"names":["mousePosition","setTimeout","target","document","name","directives","draggable","inheritAttrs","props","setup","e","emitCloseEvent","trigger","confirmBtnAction","cancelBtnAction","useDestroyOnClose","topStyle","paddingTop","dialogClass","width","watch","nextTick","dialogEle","clearStyleFunc","clearTimeout","timer","destroySelf","stack","context","_createVNode","_resolveComponent","globalCancel","className","globalConfirm","globalConfirmBtnTheme","onMounted","onBeforeUnmount","COMPONENT_NAME","isModal","isModeLess","isFullScreen","maskClass","dialogStyle","afterEnter","afterLeave","hasEventOn","renderDialog","teleportElement","_withDirectives","_mergeProps"],"mappings":"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"}