opendesk
PublicKnowledgeBase.vue
<template>
<SettingsLayoutBase
:description="
__('Manage who can read your knowledge base and how it looks.')
"
>
<template #title>
<div class="flex items-center gap-2">
<h1 class="text-md-semibold text-ink-gray-8">
{{ __("Knowledge Base") }}
</h1>
<UnsavedBadge :show="isDirty" />
</div>
</template>
<template #header-actions>
<Transition name="fade">
<div v-if="isDirty" class="flex items-center gap-2">
<Button
icon-left="lucide-external-link"
:label="__('Preview')"
@click="preview"
/>
<Button
variant="solid"
:label="__('Save')"
:loading="saving"
@click="save"
/>
</div>
</Transition>
</template>
<template #content>
<KnowledgeBaseForm />
</template>
</SettingsLayoutBase>
</template>
<script setup lang="ts">
import SettingsLayoutBase from "@/components/layouts/SettingsLayoutBase.vue";
import UnsavedBadge from "@/components/UnsavedBadge.vue";
import { __ } from "@/translation";
import KnowledgeBaseForm from "@opendesk/shared/settings/KnowledgeBaseForm.vue";
import { useKnowledgeBaseDraft } from "@opendesk/shared/settings/knowledgeBaseDraft.ts";
import { Button } from "frappe-ui";
import { onUnmounted, watch } from "vue";
import { disableSettingModalOutsideClick } from "../settingsModal";
const { isDirty, saving, save, discard, preview } = useKnowledgeBaseDraft();
// Unsaved edits keep the modal open and guard tab changes.
watch(isDirty, (dirty) => (disableSettingModalOutsideClick.value = dirty), {
immediate: true,
});
// The draft is shared; drop edits left by a confirmed tab change.
onUnmounted(() => {
if (isDirty.value) discard();
disableSettingModalOutsideClick.value = false;
});
</script>