primevue-mirror/components/dynamicdialog/DynamicDialog.vue

76 lines
2.7 KiB
Vue
Raw Normal View History

2022-09-06 12:03:37 +00:00
<template>
<template v-for="(instance, key) in instanceMap" :key="key">
2022-09-14 11:26:01 +00:00
<DDialog v-model:visible="instance.visible" :_instance="instance" v-bind="instance.options.props" @hide="onDialogHide(instance)" @after-hide="onDialogAfterHide">
<template v-if="instance.options.templates && instance.options.templates.header" #header>
<component v-for="(header, index) in getTemplateItems(instance.options.templates.header)" :is="header" :key="index + '_header'"></component>
2022-09-06 12:03:37 +00:00
</template>
<component :is="instance.content"></component>
2022-09-14 11:26:01 +00:00
<template v-if="instance.options.templates && instance.options.templates.footer" #footer>
<component v-for="(footer, index) in getTemplateItems(instance.options.templates.footer)" :is="footer" :key="index + '_footer'"></component>
2022-09-06 12:03:37 +00:00
</template>
</DDialog>
</template>
</template>
<script>
import Dialog from 'primevue/dialog';
2023-03-07 12:36:48 +00:00
import DynamicDialogEventBus from 'primevue/dynamicdialogeventbus';
import { UniqueComponentId } from 'primevue/utils';
2022-09-06 12:03:37 +00:00
export default {
name: 'DynamicDialog',
inheritAttrs: false,
data() {
return {
instanceMap: {}
2022-09-14 11:26:01 +00:00
};
2022-09-06 12:03:37 +00:00
},
openListener: null,
closeListener: null,
currentInstance: null,
mounted() {
this.openListener = ({ instance }) => {
const key = UniqueComponentId() + '_dynamic_dialog';
instance.visible = true;
instance.key = key;
this.instanceMap[key] = instance;
};
this.closeListener = ({ instance, params }) => {
const key = instance.key;
const currentInstance = this.instanceMap[key];
if (currentInstance) {
currentInstance.visible = false;
2022-09-14 11:26:01 +00:00
currentInstance.options.onClose && currentInstance.options.onClose({ data: params, type: 'config-close' });
2022-09-06 12:03:37 +00:00
this.currentInstance = currentInstance;
}
};
DynamicDialogEventBus.on('open', this.openListener);
DynamicDialogEventBus.on('close', this.closeListener);
},
beforeUnmount() {
DynamicDialogEventBus.off('open', this.openListener);
DynamicDialogEventBus.off('close', this.closeListener);
},
methods: {
onDialogHide(instance) {
!this.currentInstance && instance.options.onClose && instance.options.onClose({ type: 'dialog-close' });
},
onDialogAfterHide() {
2022-09-14 11:26:01 +00:00
this.currentInstance && delete this.currentInstance;
2022-09-06 12:03:37 +00:00
this.currentInstance = null;
},
getTemplateItems(template) {
return Array.isArray(template) ? template : [template];
}
},
components: {
2022-09-14 11:26:01 +00:00
DDialog: Dialog
2022-09-06 12:03:37 +00:00
}
2022-09-14 11:26:01 +00:00
};
2022-09-06 12:03:37 +00:00
</script>