diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/document/DocumentDetails.spec.js b/app/javascript/dashboard/components-next/captain/pageComponents/document/DocumentDetails.spec.js index 9fde9a57e..68aace7c3 100644 --- a/app/javascript/dashboard/components-next/captain/pageComponents/document/DocumentDetails.spec.js +++ b/app/javascript/dashboard/components-next/captain/pageComponents/document/DocumentDetails.spec.js @@ -30,8 +30,9 @@ const captainDocument = { pdf_document: false, }; -const DialogStub = { - name: 'Dialog', +const SidePanelStub = { + name: 'SidePanel', + methods: { open() {}, close() {} }, template: '
', }; @@ -59,7 +60,7 @@ describe('DocumentDetails', () => { global: { directives: { dompurifyHtml: {} }, stubs: { - Dialog: DialogStub, + SidePanel: SidePanelStub, TabBar: TabBarStub, PaginationFooter: PaginationFooterStub, }, diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/document/DocumentDetails.vue b/app/javascript/dashboard/components-next/captain/pageComponents/document/DocumentDetails.vue index eadb0b480..d48df7f1d 100644 --- a/app/javascript/dashboard/components-next/captain/pageComponents/document/DocumentDetails.vue +++ b/app/javascript/dashboard/components-next/captain/pageComponents/document/DocumentDetails.vue @@ -12,7 +12,7 @@ import { getDocumentDisplayPath, } from 'shared/helpers/documentHelper'; import Spinner from 'dashboard/components-next/spinner/Spinner.vue'; -import Dialog from 'dashboard/components-next/dialog/Dialog.vue'; +import SidePanel from 'dashboard/components-next/side-panel/SidePanel.vue'; import Icon from 'dashboard/components-next/icon/Icon.vue'; import Button from 'dashboard/components-next/button/Button.vue'; import TabBar from 'dashboard/components-next/tabbar/TabBar.vue'; @@ -33,7 +33,9 @@ const TAB_KEYS = { const RESPONSES_PER_PAGE = 25; const { t } = useI18n(); const store = useStore(); -const dialogRef = ref(null); +// The parent mounts this component with v-if, so the panel opens on mount and +// the parent unmounts it only after the slide-out finishes (afterLeave). +const panelRef = ref(null); const documentDetails = computed(() => props.captainDocument); const showRawContent = ref(false); const activeTabIndex = ref(0); @@ -126,9 +128,9 @@ const syncedAtLabel = computed(() => { ); }); -const handleClose = () => { - emit('close'); -}; +const documentTitle = computed( + () => documentDetails.value.name || documentDetails.value.external_link +); const handleCopyContent = async () => { try { @@ -156,22 +158,18 @@ const handlePageChange = page => { }; onMounted(() => { + panelRef.value.open(); fetchResponses(); }); -defineExpose({ dialogRef }); diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/overview/AssistantDrilldownDrawer.vue b/app/javascript/dashboard/components-next/captain/pageComponents/overview/AssistantDrilldownDrawer.vue index cf17e7804..5be605782 100644 --- a/app/javascript/dashboard/components-next/captain/pageComponents/overview/AssistantDrilldownDrawer.vue +++ b/app/javascript/dashboard/components-next/captain/pageComponents/overview/AssistantDrilldownDrawer.vue @@ -1,13 +1,12 @@ diff --git a/app/javascript/dashboard/components-next/side-panel/SidePanel.vue b/app/javascript/dashboard/components-next/side-panel/SidePanel.vue index 55b7f7daf..0aae6d4ab 100644 --- a/app/javascript/dashboard/components-next/side-panel/SidePanel.vue +++ b/app/javascript/dashboard/components-next/side-panel/SidePanel.vue @@ -15,8 +15,8 @@ const props = defineProps({ }, width: { type: String, - default: 'lg', - validator: value => ['sm', 'md', 'lg', 'xl'].includes(value), + default: 'xl', + validator: value => ['md', 'lg', 'xl', '2xl', '3xl'].includes(value), }, closeOnClickOutside: { type: Boolean, @@ -24,13 +24,16 @@ const props = defineProps({ }, }); -const emit = defineEmits(['close']); +// `afterLeave` fires once the slide-out transition finishes, so consumers +// mounted with v-if can wait for it before unmounting the panel. +const emit = defineEmits(['close', 'afterLeave']); const MAX_WIDTH_CLASSES = { - sm: 'max-w-md', - md: 'max-w-xl', - lg: 'max-w-3xl', - xl: 'max-w-5xl', + md: 'max-w-md', + lg: 'max-w-lg', + xl: 'max-w-xl', + '2xl': 'max-w-2xl', + '3xl': 'max-w-3xl', }; const isOpen = ref(false); @@ -103,10 +106,11 @@ defineExpose({ open, close });