fix: ProseMirror prompt modal UI issue (#13722)
This commit is contained in:
parent
939471cb3b
commit
f4e6aa1bd2
@ -1,4 +1,5 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
import { vOnClickOutside } from '@vueuse/components';
|
||||||
import Button from 'dashboard/components-next/button/Button.vue';
|
import Button from 'dashboard/components-next/button/Button.vue';
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
@ -28,7 +29,11 @@ const handleButtonClick = () => {
|
|||||||
{{ headerTitle }}
|
{{ headerTitle }}
|
||||||
</span>
|
</span>
|
||||||
<div
|
<div
|
||||||
v-on-clickaway="() => emit('close')"
|
v-on-click-outside="[
|
||||||
|
() => emit('close'),
|
||||||
|
// This will prevent closing the modal when the editor Create link popup is open
|
||||||
|
{ ignore: ['dialog.ProseMirror-prompt-backdrop'] },
|
||||||
|
]"
|
||||||
class="relative group/campaign-button"
|
class="relative group/campaign-button"
|
||||||
>
|
>
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@ -277,7 +277,7 @@ useKeyboardEvents(keyboardEvents);
|
|||||||
handleClickOutside,
|
handleClickOutside,
|
||||||
// Fixed and edge case https://github.com/chatwoot/chatwoot/issues/10785
|
// Fixed and edge case https://github.com/chatwoot/chatwoot/issues/10785
|
||||||
// This will prevent closing the compose conversation modal when the editor Create link popup is open
|
// This will prevent closing the compose conversation modal when the editor Create link popup is open
|
||||||
{ ignore: ['div.ProseMirror-prompt'] },
|
{ ignore: ['dialog.ProseMirror-prompt-backdrop'] },
|
||||||
]"
|
]"
|
||||||
class="relative"
|
class="relative"
|
||||||
:class="{
|
:class="{
|
||||||
|
|||||||
@ -96,6 +96,17 @@ const close = () => {
|
|||||||
isOpen.value = false;
|
isOpen.value = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Only close if the close event originated from this dialog,
|
||||||
|
// not from a child dialog (e.g. ProseMirror prompt) bubbling up.
|
||||||
|
const handleDialogClose = e => e.target === dialogRef.value && close();
|
||||||
|
|
||||||
|
// Only close on click-outside if this dialog is the topmost one.
|
||||||
|
// If another dialog (e.g. ProseMirror prompt) is open on top, ignore.
|
||||||
|
const handleClickOutside = () => {
|
||||||
|
const dialogs = document.querySelectorAll('dialog[open]');
|
||||||
|
if (dialogs[dialogs.length - 1] === dialogRef.value) close();
|
||||||
|
};
|
||||||
|
|
||||||
const confirm = () => {
|
const confirm = () => {
|
||||||
emit('confirm');
|
emit('confirm');
|
||||||
};
|
};
|
||||||
@ -113,9 +124,9 @@ defineExpose({ open, close });
|
|||||||
positionClass,
|
positionClass,
|
||||||
overflowYAuto ? 'overflow-y-auto' : 'overflow-visible',
|
overflowYAuto ? 'overflow-y-auto' : 'overflow-visible',
|
||||||
]"
|
]"
|
||||||
@close="close"
|
@close.prevent="handleDialogClose"
|
||||||
>
|
>
|
||||||
<OnClickOutside @trigger="close">
|
<OnClickOutside @trigger="handleClickOutside">
|
||||||
<form
|
<form
|
||||||
ref="dialogContentRef"
|
ref="dialogContentRef"
|
||||||
class="flex flex-col w-full h-auto gap-6 p-6 overflow-visible text-start align-middle transition-all duration-300 ease-in-out transform bg-n-alpha-3 backdrop-blur-[100px] shadow-xl rounded-xl"
|
class="flex flex-col w-full h-auto gap-6 p-6 overflow-visible text-start align-middle transition-all duration-300 ease-in-out transform bg-n-alpha-3 backdrop-blur-[100px] shadow-xl rounded-xl"
|
||||||
|
|||||||
@ -978,11 +978,15 @@ useEmitter(BUS_EVENTS.INSERT_INTO_RICH_EDITOR, insertContentIntoEditor);
|
|||||||
@apply overflow-auto min-h-[5rem] max-h-[7.5rem];
|
@apply overflow-auto min-h-[5rem] max-h-[7.5rem];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ProseMirror-prompt-backdrop::backdrop {
|
||||||
|
@apply bg-n-alpha-black1 backdrop-blur-[4px];
|
||||||
|
}
|
||||||
|
|
||||||
.ProseMirror-prompt {
|
.ProseMirror-prompt {
|
||||||
@apply z-[9999] bg-n-alpha-3 backdrop-blur-[100px] border border-n-strong p-6 shadow-xl rounded-xl;
|
@apply bg-n-alpha-3 border border-n-strong p-6 shadow-xl rounded-xl w-96 !important;
|
||||||
|
|
||||||
h5 {
|
h5 {
|
||||||
@apply text-n-slate-12 mb-1.5;
|
@apply text-n-slate-12 mb-3;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ProseMirror-prompt-buttons {
|
.ProseMirror-prompt-buttons {
|
||||||
|
|||||||
@ -326,26 +326,4 @@ export default {
|
|||||||
max-height: 7.5rem;
|
max-height: 7.5rem;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ProseMirror-prompt {
|
|
||||||
@apply z-[9999] bg-n-alpha-3 min-w-80 backdrop-blur-[100px] border border-n-strong p-6 shadow-xl rounded-xl;
|
|
||||||
|
|
||||||
h5 {
|
|
||||||
@apply text-n-slate-12 mb-1.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ProseMirror-prompt-buttons {
|
|
||||||
button {
|
|
||||||
@apply h-8 px-3;
|
|
||||||
|
|
||||||
&[type='submit'] {
|
|
||||||
@apply bg-n-brand text-white hover:bg-n-brand/90;
|
|
||||||
}
|
|
||||||
|
|
||||||
&[type='button'] {
|
|
||||||
@apply bg-n-slate-9/10 text-n-slate-12 hover:bg-n-slate-9/20;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -34,7 +34,7 @@
|
|||||||
"@amplitude/analytics-browser": "^2.11.10",
|
"@amplitude/analytics-browser": "^2.11.10",
|
||||||
"@breezystack/lamejs": "^1.2.7",
|
"@breezystack/lamejs": "^1.2.7",
|
||||||
"@chatwoot/ninja-keys": "1.2.3",
|
"@chatwoot/ninja-keys": "1.2.3",
|
||||||
"@chatwoot/prosemirror-schema": "1.3.6",
|
"@chatwoot/prosemirror-schema": "1.3.7",
|
||||||
"@chatwoot/utils": "^0.0.52",
|
"@chatwoot/utils": "^0.0.52",
|
||||||
"@formkit/core": "^1.6.7",
|
"@formkit/core": "^1.6.7",
|
||||||
"@formkit/vue": "^1.6.7",
|
"@formkit/vue": "^1.6.7",
|
||||||
|
|||||||
10
pnpm-lock.yaml
generated
10
pnpm-lock.yaml
generated
@ -23,8 +23,8 @@ importers:
|
|||||||
specifier: 1.2.3
|
specifier: 1.2.3
|
||||||
version: 1.2.3
|
version: 1.2.3
|
||||||
'@chatwoot/prosemirror-schema':
|
'@chatwoot/prosemirror-schema':
|
||||||
specifier: 1.3.6
|
specifier: 1.3.7
|
||||||
version: 1.3.6
|
version: 1.3.7
|
||||||
'@chatwoot/utils':
|
'@chatwoot/utils':
|
||||||
specifier: ^0.0.52
|
specifier: ^0.0.52
|
||||||
version: 0.0.52
|
version: 0.0.52
|
||||||
@ -454,8 +454,8 @@ packages:
|
|||||||
'@chatwoot/ninja-keys@1.2.3':
|
'@chatwoot/ninja-keys@1.2.3':
|
||||||
resolution: {integrity: sha512-xM8d9P5ikDMZm2WbaCTk/TW5HFauylrU3cJ75fq5je6ixKwyhl/0kZbVN/vbbZN4+AUX/OaSIn6IJbtCgIF67g==}
|
resolution: {integrity: sha512-xM8d9P5ikDMZm2WbaCTk/TW5HFauylrU3cJ75fq5je6ixKwyhl/0kZbVN/vbbZN4+AUX/OaSIn6IJbtCgIF67g==}
|
||||||
|
|
||||||
'@chatwoot/prosemirror-schema@1.3.6':
|
'@chatwoot/prosemirror-schema@1.3.7':
|
||||||
resolution: {integrity: sha512-sHRtWqbtiow9mVF1ixim0eGUXfhGK5tuLOdF9Vf53aepjJ+ngEiNVkxQT6FohlEOd886ZsdQxMvmI92IDaUXAQ==}
|
resolution: {integrity: sha512-N+Gicecp18TSEJQoRtGZXkp8R+kC0iPSms8ezu1k8U+ySY9FAENzFQQ1rBVSSC4hDFwb9/EbSI9IFqDjHGds7g==}
|
||||||
|
|
||||||
'@chatwoot/utils@0.0.52':
|
'@chatwoot/utils@0.0.52':
|
||||||
resolution: {integrity: sha512-e57uVqyVW4tj1gql4YJPNMykqMJPkETn5Y9AmHdhc6Y7oxDXfRXBq27fZrrDadLkZdn5RYVCZjfIhXOumyYv2Q==}
|
resolution: {integrity: sha512-e57uVqyVW4tj1gql4YJPNMykqMJPkETn5Y9AmHdhc6Y7oxDXfRXBq27fZrrDadLkZdn5RYVCZjfIhXOumyYv2Q==}
|
||||||
@ -4999,7 +4999,7 @@ snapshots:
|
|||||||
hotkeys-js: 3.8.7
|
hotkeys-js: 3.8.7
|
||||||
lit: 2.2.6
|
lit: 2.2.6
|
||||||
|
|
||||||
'@chatwoot/prosemirror-schema@1.3.6':
|
'@chatwoot/prosemirror-schema@1.3.7':
|
||||||
dependencies:
|
dependencies:
|
||||||
markdown-it-sup: 2.0.0
|
markdown-it-sup: 2.0.0
|
||||||
prosemirror-commands: 1.6.0
|
prosemirror-commands: 1.6.0
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user