mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-06-13 10:59:37 +00:00
e2ab8a46ed
Some improvements to the Page Header and Tab UI. Original | New :--------:|:-------: ![image](https://user-images.githubusercontent.com/62170586/197360886-046f1016-ca39-4b69-8134-99ba88e3a0c2.png) | ![image](https://user-images.githubusercontent.com/62170586/197360819-7efd0d82-1412-465d-aefa-039164f97465.png) ![image](https://user-images.githubusercontent.com/62170586/197360872-f2ece5fd-7c0b-4e2c-8629-31524a412af5.png) | ![image](https://user-images.githubusercontent.com/62170586/197360830-49f09e0d-619e-4fa9-8e38-8d05d9404185.png) ![image](https://user-images.githubusercontent.com/62170586/197281776-e3de6441-9417-4614-8b25-1aaef0b8da61.png) | ![image](https://user-images.githubusercontent.com/62170586/197281698-40c66d34-76f3-4fd5-97e3-1c422b74844c.png) ![image](https://user-images.githubusercontent.com/62170586/196609248-ff150c6e-2995-4bcc-8573-49ffaf388446.png) | ![image](https://user-images.githubusercontent.com/62170586/197323734-7c1a1b79-0f41-4bf2-96a3-dd38df9e1415.png) ![image](https://user-images.githubusercontent.com/62170586/196609329-b7a6f37e-e8c2-4004-a98b-73f837122ff8.png) | ![image](https://user-images.githubusercontent.com/62170586/197323882-10141ffd-7411-4493-8291-b8000adc3cc5.png) What? - Create a new Scaffold component, which includes the header and tabs required for a page. - Use this component to wrap all the views that have a header. - Ensures consistency in headers between different pages. - [x] Add support to use custom html/component in place of title (for repo page, pipeline page, etc) - [x] Add support of right icon buttons (for repo page, pipeline page, etc) - [x] Refactor tabs handling using compositions (useTabsProvider, useTabsClient) - [x] Make new header ui resposive
65 lines
2 KiB
Vue
65 lines
2 KiB
Vue
<template>
|
|
<div class="bg-white dark:bg-dark-gray-900 border-b dark:border-gray-700">
|
|
<FluidContainer class="!py-0">
|
|
<div class="flex flex-wrap items-center justify-between py-4 <md:flex-row <md:gap-y-4">
|
|
<div
|
|
class="flex flex-wrap items-center justify-start <md:w-full <md:justify-center"
|
|
:class="{
|
|
'md:flex-1': searchBoxPresent,
|
|
}"
|
|
>
|
|
<IconButton v-if="goBack" icon="back" :title="$t('back')" class="mr-2 <md:hidden" @click="goBack" />
|
|
<h1 class="flex flex-wrap text-xl text-color items-center gap-x-2">
|
|
<slot name="title" />
|
|
</h1>
|
|
</div>
|
|
<TextField
|
|
v-if="searchBoxPresent"
|
|
class="w-auto !bg-gray-100 !dark:bg-dark-gray-600 <md:w-full <md:order-3"
|
|
input-class="!placeholder-gray-500"
|
|
:placeholder="$t('search')"
|
|
:model-value="search"
|
|
@update:model-value="(value: string) => $emit('update:search', value)"
|
|
/>
|
|
<div
|
|
v-if="$slots.titleActions"
|
|
class="flex flex-wrap items-center justify-end gap-x-2 <md:w-full <md:justify-center"
|
|
:class="{
|
|
'md:flex-1': searchBoxPresent,
|
|
}"
|
|
>
|
|
<slot name="titleActions" />
|
|
</div>
|
|
</div>
|
|
|
|
<div v-if="enableTabs" class="flex flex-wrap justify-between">
|
|
<Tabs class="<md:order-2" />
|
|
<div
|
|
v-if="$slots.titleActions"
|
|
class="flex items-center justify-end gap-x-2 md:mb-2 <md:w-full <md:justify-center <md:order-1"
|
|
>
|
|
<slot name="tabActions" />
|
|
</div>
|
|
</div>
|
|
</FluidContainer>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import TextField from '~/components/form/TextField.vue';
|
|
import FluidContainer from '~/components/layout/FluidContainer.vue';
|
|
|
|
import Tabs from './Tabs.vue';
|
|
|
|
export interface Props {
|
|
goBack?: () => void;
|
|
enableTabs?: boolean;
|
|
search?: string;
|
|
}
|
|
|
|
const props = defineProps<Props>();
|
|
defineEmits(['update:search']);
|
|
|
|
const searchBoxPresent = props.search !== undefined;
|
|
</script>
|