Files
chatwoot/app/javascript/dashboard/routes/dashboard/settings/components/BaseSettingsHeader.vue
T
Sivin VargheseandGitHub 7b2b3ac37d feat(V5): Update settings pages UI (#13396)
# Pull Request Template

## Description

This PR updates settings page UI


## Type of change

- [x] New feature (non-breaking change which adds functionality)


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
2026-02-19 15:04:40 +05:30

127 lines
3.4 KiB
Vue

<script setup>
import { useSlots } from 'vue';
import CustomBrandPolicyWrapper from 'dashboard/components/CustomBrandPolicyWrapper.vue';
import { getHelpUrlForFeature } from '../../../../helper/featureHelper';
import BackButton from '../../../../components/widgets/BackButton.vue';
import Icon from 'dashboard/components-next/icon/Icon.vue';
import Input from 'dashboard/components-next/input/Input.vue';
const props = defineProps({
title: {
type: String,
required: true,
},
description: {
type: String,
default: '',
},
linkText: {
type: String,
default: '',
},
featureName: {
type: String,
default: '',
},
backButtonLabel: {
type: String,
default: '',
},
searchPlaceholder: {
type: String,
default: '',
},
});
const slots = useSlots();
const searchQuery = defineModel('searchQuery', { type: String, default: '' });
const helpURL = getHelpUrlForFeature(props.featureName);
</script>
<template>
<div class="flex flex-col items-start w-full">
<BackButton
v-if="backButtonLabel"
compact
:button-label="backButtonLabel"
class="my-1"
/>
<div
v-if="title"
class="flex items-center justify-between w-full gap-4 min-h-8 mb-2"
>
<h1 class="text-heading-1 text-n-slate-12">
{{ title }}
</h1>
</div>
<div
v-if="description || $slots.description || linkText || helpURL"
class="flex flex-col w-full gap-1.5 text-n-slate-11"
>
<p
v-if="description || $slots.description"
class="mb-0 line-clamp-5 sm:line-clamp-none max-w-3xl text-body-main"
>
<slot name="description">{{ description }}</slot>
</p>
<CustomBrandPolicyWrapper :show-on-custom-branded-instance="false">
<a
v-if="helpURL && linkText"
:href="helpURL"
target="_blank"
rel="noopener noreferrer"
class="items-center hidden gap-1 text-sm font-medium sm:inline-flex w-fit text-n-blue-11 hover:underline mb-2"
>
{{ linkText }}
<Icon
icon="i-lucide-chevron-right"
class="flex-shrink-0 text-n-blue-11 size-4"
/>
</a>
</CustomBrandPolicyWrapper>
</div>
</div>
<div
v-if="searchPlaceholder || slots.actions || slots.tabs"
class="gap-3 flex justify-between sm:mt-4 min-w-0"
>
<div
v-if="slots.tabs || searchPlaceholder"
class="flex items-center gap-3"
:class="{
'hidden sm:flex': !slots.tabs,
}"
>
<slot name="tabs" />
<Input
v-if="searchPlaceholder"
v-model="searchQuery"
:placeholder="searchPlaceholder"
class="group w-56 min-w-0 hidden sm:flex [&>input]:ltr:!pl-8 [&>input]:rtl:!pr-8 [&>input]:!rounded-[0.625rem]"
size="sm"
type="search"
>
<template #prefix>
<Icon
icon="i-lucide-search"
class="absolute top-1/2 -translate-y-1/2 text-n-slate-11 group-focus-within:text-n-brand size-3.5 ltr:left-2.5 rtl:right-2.5"
/>
</template>
</Input>
</div>
<div
class="flex items-center gap-3 min-w-0"
:class="{ 'flex-row-reverse sm:flex-row': !slots.tabs }"
>
<slot name="count" />
<div
v-if="slots.count"
class="w-px h-3 rounded-lg bg-n-weak ltr:ml-1 ltr:mr-2 rtl:ml-2 rtl:mr-1 flex-shrink-0"
/>
<slot name="actions" />
</div>
</div>
</template>