|
@@ -1,41 +1,14 @@
|
|
|
-<template>
|
|
|
- <div :class="prefixCls">
|
|
|
- <CollapseHeader v-bind="props" :prefixCls="prefixCls" :show="show" @expand="handleExpand">
|
|
|
- <template #title>
|
|
|
- <slot name="title"></slot>
|
|
|
- </template>
|
|
|
- <template #action>
|
|
|
- <slot name="action"></slot>
|
|
|
- </template>
|
|
|
- </CollapseHeader>
|
|
|
-
|
|
|
- <div class="p-2">
|
|
|
- <CollapseTransition :enable="canExpan">
|
|
|
- <Skeleton v-if="loading" :active="loading" />
|
|
|
- <div :class="`${prefixCls}__body`" v-else v-show="show">
|
|
|
- <slot></slot>
|
|
|
- </div>
|
|
|
- </CollapseTransition>
|
|
|
- </div>
|
|
|
- <div :class="`${prefixCls}__footer`" v-if="$slots.footer">
|
|
|
- <slot name="footer"></slot>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-</template>
|
|
|
-<script lang="ts" setup>
|
|
|
- import type { PropType } from 'vue';
|
|
|
- import { ref } from 'vue';
|
|
|
+<script lang="tsx">
|
|
|
+ import { ref, unref, defineComponent, type PropType, type ExtractPropTypes } from 'vue';
|
|
|
import { isNil } from 'lodash-es';
|
|
|
- // component
|
|
|
import { Skeleton } from 'ant-design-vue';
|
|
|
import { CollapseTransition } from '/@/components/Transition';
|
|
|
import CollapseHeader from './CollapseHeader.vue';
|
|
|
import { triggerWindowResize } from '/@/utils/event';
|
|
|
- // hook
|
|
|
import { useTimeoutFn } from '/@/hooks/core/useTimeout';
|
|
|
import { useDesign } from '/@/hooks/web/useDesign';
|
|
|
|
|
|
- const props = defineProps({
|
|
|
+ const collapseContainerProps = {
|
|
|
title: { type: String, default: '' },
|
|
|
loading: { type: Boolean },
|
|
|
/**
|
|
@@ -58,27 +31,60 @@
|
|
|
* Delayed loading time
|
|
|
*/
|
|
|
lazyTime: { type: Number, default: 0 },
|
|
|
- });
|
|
|
+ };
|
|
|
|
|
|
- const show = ref(true);
|
|
|
+ export type CollapseContainerProps = ExtractPropTypes<typeof collapseContainerProps>;
|
|
|
|
|
|
- const { prefixCls } = useDesign('collapse-container');
|
|
|
+ export default defineComponent({
|
|
|
+ name: 'CollapseContainer',
|
|
|
|
|
|
- /**
|
|
|
- * @description: Handling development events
|
|
|
- */
|
|
|
- function handleExpand(val: boolean) {
|
|
|
- show.value = isNil(val) ? !show.value : val;
|
|
|
- if (props.triggerWindowResize) {
|
|
|
- // 200 milliseconds here is because the expansion has animation,
|
|
|
- useTimeoutFn(triggerWindowResize, 200);
|
|
|
- }
|
|
|
- }
|
|
|
+ props: collapseContainerProps,
|
|
|
+
|
|
|
+ setup(props, { expose, slots }) {
|
|
|
+ const { prefixCls } = useDesign('collapse-container');
|
|
|
+
|
|
|
+ const show = ref(true);
|
|
|
+
|
|
|
+ const handleExpand = (val: boolean) => {
|
|
|
+ show.value = isNil(val) ? !show.value : val;
|
|
|
+ if (props.triggerWindowResize) {
|
|
|
+ // 200 milliseconds here is because the expansion has animation,
|
|
|
+ useTimeoutFn(triggerWindowResize, 200);
|
|
|
+ }
|
|
|
+ };
|
|
|
|
|
|
- defineExpose({
|
|
|
- handleExpand,
|
|
|
+ expose({ handleExpand });
|
|
|
+
|
|
|
+ return () => (
|
|
|
+ <div class={unref(prefixCls)}>
|
|
|
+ <CollapseHeader
|
|
|
+ {...props}
|
|
|
+ prefixCls={unref(prefixCls)}
|
|
|
+ onExpand={handleExpand}
|
|
|
+ show={show.value}
|
|
|
+ v-slots={{
|
|
|
+ title: slots.title,
|
|
|
+ action: slots.action,
|
|
|
+ }}
|
|
|
+ />
|
|
|
+
|
|
|
+ <div class="p-2">
|
|
|
+ <CollapseTransition enable={props.canExpan}>
|
|
|
+ {props.loading ? (
|
|
|
+ <Skeleton active={props.loading} />
|
|
|
+ ) : (
|
|
|
+ show.value && <div class={`${prefixCls}__body`}>{slots.default?.()}</div>
|
|
|
+ )}
|
|
|
+ </CollapseTransition>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {slots.footer && <div class={`${prefixCls}__footer`}>{slots.footer()}</div>}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ },
|
|
|
});
|
|
|
</script>
|
|
|
+
|
|
|
<style lang="less">
|
|
|
@prefix-cls: ~'@{namespace}-collapse-container';
|
|
|
|