primevue-mirror/components/lib/confirmdialog/ConfirmDialog.vue

183 lines
6.4 KiB
Vue
Raw Normal View History

2022-09-06 12:03:37 +00:00
<template>
<Dialog
v-model:visible="visible"
role="alertdialog"
2023-05-29 20:18:28 +00:00
:class="cx('root')"
:modal="true"
:header="header"
:blockScroll="blockScroll"
:position="position"
:breakpoints="breakpoints"
:closeOnEscape="closeOnEscape"
:draggable="draggable"
@update:visible="onHide"
2023-04-25 11:21:19 +00:00
:pt="pt"
2023-05-29 17:44:31 +00:00
:unstyled="unstyled"
>
2023-09-19 10:51:23 +00:00
<template v-if="$slots.container" #container="slotProps">
<slot name="container" :message="confirmation" :closeCallback="slotProps.onclose" :acceptCallback="accept" :rejectCallback="reject" />
2022-09-06 12:03:37 +00:00
</template>
2023-09-19 10:51:23 +00:00
<template v-if="!$slots.container">
<template v-if="!$slots.message">
<slot name="icon">
<component v-if="$slots.icon" :is="$slots.icon" :class="cx('icon')" />
<span v-else-if="confirmation.icon" :class="[confirmation.icon, cx('icon')]" v-bind="ptm('icon')" />
2023-09-19 10:51:23 +00:00
</slot>
<span :class="cx('message')" v-bind="ptm('message')">{{ message }}</span>
</template>
<component v-else :is="$slots.message" :message="confirmation"></component>
</template>
<template v-if="!$slots.container" #footer>
<Button
2024-05-06 15:23:01 +00:00
:class="[cx('pcRejectButton'), confirmation.rejectClass]"
:autofocus="autoFocusReject"
:unstyled="unstyled"
:text="confirmation.rejectProps?.text || false"
@click="reject()"
v-bind="confirmation.rejectProps"
:label="rejectLabel"
2024-05-06 15:23:01 +00:00
:pt="ptm('pcRejectButton')"
>
<template v-if="rejectIcon || $slots.rejecticon" #icon="iconProps">
<slot name="rejecticon">
2024-05-06 15:23:01 +00:00
<span :class="[rejectIcon, iconProps.class]" v-bind="ptm('pcRejectButton')['icon']" data-pc-section="rejectbuttonicon" />
</slot>
</template>
</Button>
2024-05-06 15:23:01 +00:00
<Button :label="acceptLabel" :class="[cx('pcAcceptButton'), confirmation.acceptClass]" :autofocus="autoFocusAccept" :unstyled="unstyled" @click="accept()" v-bind="confirmation.acceptProps" :pt="ptm('pcAcceptButton')">
<template v-if="acceptIcon || $slots.accepticon" #icon="iconProps">
<slot name="accepticon">
2024-05-06 15:23:01 +00:00
<span :class="[acceptIcon, iconProps.class]" v-bind="ptm('pcAcceptButton')['icon']" data-pc-section="acceptbuttonicon" />
</slot>
</template>
</Button>
2022-09-06 12:03:37 +00:00
</template>
</Dialog>
2022-09-06 12:03:37 +00:00
</template>
<script>
2022-09-14 11:26:01 +00:00
import Button from 'primevue/button';
2022-09-06 12:03:37 +00:00
import ConfirmationEventBus from 'primevue/confirmationeventbus';
import Dialog from 'primevue/dialog';
import BaseConfirmDialog from './BaseConfirmDialog.vue';
2022-09-06 12:03:37 +00:00
export default {
name: 'ConfirmDialog',
2023-05-29 17:44:31 +00:00
extends: BaseConfirmDialog,
2022-09-06 12:03:37 +00:00
confirmListener: null,
closeListener: null,
data() {
return {
visible: false,
2022-09-14 11:26:01 +00:00
confirmation: null
};
2022-09-06 12:03:37 +00:00
},
mounted() {
this.confirmListener = (options) => {
if (!options) {
return;
}
if (options.group === this.group) {
this.confirmation = options;
2022-12-08 11:04:25 +00:00
if (this.confirmation.onShow) {
this.confirmation.onShow();
}
2022-09-06 12:03:37 +00:00
this.visible = true;
}
};
this.closeListener = () => {
this.visible = false;
this.confirmation = null;
};
2022-09-14 11:26:01 +00:00
2022-09-06 12:03:37 +00:00
ConfirmationEventBus.on('confirm', this.confirmListener);
ConfirmationEventBus.on('close', this.closeListener);
},
beforeUnmount() {
ConfirmationEventBus.off('confirm', this.confirmListener);
ConfirmationEventBus.off('close', this.closeListener);
},
methods: {
accept() {
if (this.confirmation.accept) {
this.confirmation.accept();
}
this.visible = false;
},
reject() {
if (this.confirmation.reject) {
this.confirmation.reject();
}
2022-09-14 11:26:01 +00:00
this.visible = false;
},
onHide() {
if (this.confirmation.onHide) {
this.confirmation.onHide();
}
2022-09-06 12:03:37 +00:00
this.visible = false;
2023-05-29 17:44:31 +00:00
},
getCXOptions(icon, iconProps) {
return { contenxt: { icon, iconClass: iconProps.class } };
2022-09-06 12:03:37 +00:00
}
},
computed: {
header() {
return this.confirmation ? this.confirmation.header : null;
},
message() {
return this.confirmation ? this.confirmation.message : null;
},
blockScroll() {
return this.confirmation ? this.confirmation.blockScroll : true;
},
position() {
return this.confirmation ? this.confirmation.position : null;
},
acceptLabel() {
if (this.confirmation) {
const confirmation = this.confirmation;
return confirmation.acceptLabel ? confirmation.acceptLabel : confirmation.acceptProps ? confirmation.acceptProps.label || this.$primevue.config.locale.accept : null;
}
return null;
2022-09-06 12:03:37 +00:00
},
rejectLabel() {
if (this.confirmation) {
const confirmation = this.confirmation;
return confirmation.rejectLabel ? confirmation.rejectLabel : confirmation.rejectProps ? confirmation.rejectProps.label || this.$primevue.config.locale.reject : null;
}
return null;
2022-09-06 12:03:37 +00:00
},
acceptIcon() {
return this.confirmation ? this.confirmation.acceptIcon : this.confirmation?.acceptProps ? this.confirmation.acceptProps.icon : null;
2022-09-06 12:03:37 +00:00
},
rejectIcon() {
return this.confirmation ? this.confirmation.rejectIcon : this.confirmation?.rejectProps ? this.confirmation.rejectProps.icon : null;
2022-09-06 12:03:37 +00:00
},
autoFocusAccept() {
2022-09-14 11:26:01 +00:00
return this.confirmation.defaultFocus === undefined || this.confirmation.defaultFocus === 'accept' ? true : false;
2022-09-06 12:03:37 +00:00
},
autoFocusReject() {
return this.confirmation.defaultFocus === 'reject' ? true : false;
},
closeOnEscape() {
return this.confirmation ? this.confirmation.closeOnEscape : true;
}
},
components: {
Dialog,
Button
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>