|
@@ -0,0 +1,107 @@
|
|
|
+<script setup lang="ts">
|
|
|
+import { ElDialog, ElScrollbar } from 'element-plus'
|
|
|
+import { propTypes } from '@/utils/propTypes'
|
|
|
+import { computed, useAttrs, ref, unref, useSlots, watch, nextTick } from 'vue'
|
|
|
+import { isNumber } from '@/utils/is'
|
|
|
+
|
|
|
+const slots = useSlots()
|
|
|
+
|
|
|
+const props = defineProps({
|
|
|
+ modelValue: propTypes.bool.def(false),
|
|
|
+ title: propTypes.string.def('Dialog'),
|
|
|
+ fullscreen: propTypes.bool.def(true),
|
|
|
+ maxHeight: propTypes.oneOfType([String, Number]).def('500px')
|
|
|
+})
|
|
|
+
|
|
|
+const getBindValue = computed(() => {
|
|
|
+ const delArr: string[] = ['fullscreen', 'title', 'maxHeight']
|
|
|
+ const attrs = useAttrs()
|
|
|
+ const obj = { ...attrs, ...props }
|
|
|
+ for (const key in obj) {
|
|
|
+ if (delArr.indexOf(key) !== -1) {
|
|
|
+ delete obj[key]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return obj
|
|
|
+})
|
|
|
+
|
|
|
+const isFullscreen = ref(false)
|
|
|
+
|
|
|
+const toggleFull = () => {
|
|
|
+ isFullscreen.value = !unref(isFullscreen)
|
|
|
+}
|
|
|
+
|
|
|
+const dialogHeight = ref(isNumber(props.maxHeight) ? `${props.maxHeight}px` : props.maxHeight)
|
|
|
+
|
|
|
+watch(
|
|
|
+ () => isFullscreen.value,
|
|
|
+ async (val: boolean) => {
|
|
|
+ await nextTick()
|
|
|
+ if (val) {
|
|
|
+ const windowHeight = document.documentElement.offsetHeight
|
|
|
+ dialogHeight.value = `${windowHeight - 55 - 60 - (slots.footer ? 63 : 0)}px`
|
|
|
+ console.log(windowHeight)
|
|
|
+ } else {
|
|
|
+ dialogHeight.value = isNumber(props.maxHeight) ? `${props.maxHeight}px` : props.maxHeight
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ immediate: true
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+const dialogStyle = computed(() => {
|
|
|
+ return {
|
|
|
+ height: unref(dialogHeight)
|
|
|
+ }
|
|
|
+})
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <ElDialog
|
|
|
+ v-bind="getBindValue"
|
|
|
+ :fullscreen="isFullscreen"
|
|
|
+ destroy-on-close
|
|
|
+ lock-scroll
|
|
|
+ :close-on-click-modal="false"
|
|
|
+ >
|
|
|
+ <template #title>
|
|
|
+ <div class="flex justify-between">
|
|
|
+ <slot name="title">
|
|
|
+ {{ title }}
|
|
|
+ </slot>
|
|
|
+ <Icon
|
|
|
+ v-if="fullscreen"
|
|
|
+ class="mr-15px cursor-pointer is-hover"
|
|
|
+ :icon="isFullscreen ? 'zmdi:fullscreen-exit' : 'zmdi:fullscreen'"
|
|
|
+ color="var(--el-color-info)"
|
|
|
+ @click="toggleFull"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <ElScrollbar :style="dialogStyle">
|
|
|
+ <slot></slot>
|
|
|
+ </ElScrollbar>
|
|
|
+
|
|
|
+ <template v-if="slots.footer" #footer>
|
|
|
+ <slot name="footer"></slot>
|
|
|
+ </template>
|
|
|
+ </ElDialog>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style lang="less">
|
|
|
+.@{elNamespace}-dialog__header {
|
|
|
+ border-bottom: 1px solid var(--tags-view-border-color);
|
|
|
+}
|
|
|
+
|
|
|
+.@{elNamespace}-dialog__footer {
|
|
|
+ border-top: 1px solid var(--tags-view-border-color);
|
|
|
+}
|
|
|
+
|
|
|
+.is-hover {
|
|
|
+ &:hover {
|
|
|
+ color: var(--el-color-primary) !important;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|