From e2ab8a46edc3b69c7b848d44f0f44c52dfefb291 Mon Sep 17 00:00:00 2001 From: Divya Jain Date: Fri, 28 Oct 2022 04:25:07 +0530 Subject: [PATCH] Header and Tabs UI Improvements (#1290) 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 --- web/components.d.ts | 6 +- web/src/components/atomic/Button.vue | 2 +- web/src/components/form/TextField.vue | 7 ++ web/src/components/layout/header/Navbar.vue | 2 +- web/src/components/layout/scaffold/Header.vue | 64 +++++++++++++ .../components/layout/scaffold/Scaffold.vue | 56 ++++++++++++ web/src/components/layout/scaffold/Tab.vue | 31 +++++++ web/src/components/layout/scaffold/Tabs.vue | 41 +++++++++ web/src/components/tabs/Tab.vue | 49 ---------- web/src/components/tabs/Tabs.vue | 91 ------------------- web/src/components/tabs/types.ts | 4 - web/src/compositions/useTabs.ts | 64 +++++++++++++ web/src/views/RepoAdd.vue | 35 +++---- web/src/views/Repos.vue | 22 ++--- web/src/views/ReposOwner.vue | 21 ++--- web/src/views/User.vue | 54 +++++------ web/src/views/admin/AdminSettings.vue | 35 +++---- web/src/views/org/OrgSettings.vue | 41 +++++---- web/src/views/org/OrgWrapper.vue | 20 ++-- web/src/views/repo/RepoSettings.vue | 75 ++++++++------- web/src/views/repo/RepoWrapper.vue | 44 +++++---- .../views/repo/pipeline/PipelineWrapper.vue | 60 +++++------- 22 files changed, 469 insertions(+), 355 deletions(-) create mode 100644 web/src/components/layout/scaffold/Header.vue create mode 100644 web/src/components/layout/scaffold/Scaffold.vue create mode 100644 web/src/components/layout/scaffold/Tab.vue create mode 100644 web/src/components/layout/scaffold/Tabs.vue delete mode 100644 web/src/components/tabs/Tab.vue delete mode 100644 web/src/components/tabs/Tabs.vue delete mode 100644 web/src/components/tabs/types.ts create mode 100644 web/src/compositions/useTabs.ts diff --git a/web/components.d.ts b/web/components.d.ts index 992bc6a15..83cc1dfd8 100644 --- a/web/components.d.ts +++ b/web/components.d.ts @@ -18,6 +18,7 @@ declare module '@vue/runtime-core' { DocsLink: typeof import('./src/components/atomic/DocsLink.vue')['default'] FluidContainer: typeof import('./src/components/layout/FluidContainer.vue')['default'] GeneralTab: typeof import('./src/components/repo/settings/GeneralTab.vue')['default'] + Header: typeof import('./src/components/layout/scaffold/Header.vue')['default'] IBxBxPowerOff: typeof import('~icons/bx/bx-power-off')['default'] ICarbonCloseOutline: typeof import('~icons/carbon/close-outline')['default'] IClarityDeployLine: typeof import('~icons/clarity/deploy-line')['default'] @@ -84,12 +85,13 @@ declare module '@vue/runtime-core' { RegistriesTab: typeof import('./src/components/repo/settings/RegistriesTab.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + Scaffold: typeof import('./src/components/layout/scaffold/Scaffold.vue')['default'] SecretEdit: typeof import('./src/components/secrets/SecretEdit.vue')['default'] SecretList: typeof import('./src/components/secrets/SecretList.vue')['default'] SecretsTab: typeof import('./src/components/repo/settings/SecretsTab.vue')['default'] SelectField: typeof import('./src/components/form/SelectField.vue')['default'] - Tab: typeof import('./src/components/tabs/Tab.vue')['default'] - Tabs: typeof import('./src/components/tabs/Tabs.vue')['default'] + Tab: typeof import('./src/components/layout/scaffold/Tab.vue')['default'] + Tabs: typeof import('./src/components/layout/scaffold/Tabs.vue')['default'] TextField: typeof import('./src/components/form/TextField.vue')['default'] Warning: typeof import('./src/components/atomic/Warning.vue')['default'] } diff --git a/web/src/components/atomic/Button.vue b/web/src/components/atomic/Button.vue index 5007878a7..43bbc080a 100644 --- a/web/src/components/atomic/Button.vue +++ b/web/src/components/atomic/Button.vue @@ -3,7 +3,7 @@ type="button" class="relative flex items-center py-1 px-2 rounded-md border shadow-sm cursor-pointer transition-all duration-150 focus:outline-none overflow-hidden disabled:opacity-50 disabled:cursor-not-allowed" :class="{ - 'bg-white hover:bg-gray-200 border-gray-300 text-color dark:bg-dark-gray-700 dark:border-dark-400 dark:hover:bg-dark-gray-800': + 'bg-white hover:bg-gray-200 border-gray-300 text-color dark:bg-dark-gray-600 dark:border-dark-400 dark:hover:bg-dark-gray-800': color === 'gray', 'bg-lime-600 hover:bg-lime-700 border-lime-800 text-white dark:text-gray-400 dark:bg-lime-900 dark:hover:bg-lime-800': color === 'green', diff --git a/web/src/components/form/TextField.vue b/web/src/components/form/TextField.vue index aa685c69a..6fdca17b7 100644 --- a/web/src/components/form/TextField.vue +++ b/web/src/components/form/TextField.vue @@ -7,6 +7,7 @@ v-if="lines === 1" v-model="innerValue" class="w-full bg-transparent text-color focus:outline-none focus:border-blue-400" + :class="inputClass" :disabled="disabled" :type="type" :placeholder="placeholder" @@ -15,6 +16,7 @@ v-else v-model="innerValue" class="w-full bg-transparent text-color focus:outline-none focus:border-blue-400" + :class="inputClass" :disabled="disabled" :placeholder="placeholder" :rows="lines" @@ -52,6 +54,11 @@ export default defineComponent({ disabled: { type: Boolean, }, + + inputClass: { + type: String, + default: '', + }, }, emits: { diff --git a/web/src/components/layout/header/Navbar.vue b/web/src/components/layout/header/Navbar.vue index 97ed91802..c8a2d32d6 100644 --- a/web/src/components/layout/header/Navbar.vue +++ b/web/src/components/layout/header/Navbar.vue @@ -1,6 +1,6 @@