From 8b4f9f8fa5647a1d3a3ed59d279632220623e9eb Mon Sep 17 00:00:00 2001 From: Thomas Hutterer Date: Tue, 29 Jul 2025 15:59:31 +0200 Subject: [PATCH 01/12] WIP: add global topbar looks totally broken at the moment. wip! --- .../javascripts/entrypoints/super_sidebar.js | 2 ++ .../super_sidebar/components/topbar.vue | 22 ++++++++++++++++ .../super_sidebar/super_sidebar_bundle.js | 21 ++++++++++++++++ .../stylesheets/framework/super_sidebar.scss | 25 +++++++++++++++++++ app/helpers/sidebars_helper.rb | 8 ++++++ app/views/layouts/application.html.haml | 4 ++- 6 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/super_sidebar/components/topbar.vue diff --git a/app/assets/javascripts/entrypoints/super_sidebar.js b/app/assets/javascripts/entrypoints/super_sidebar.js index 961ffc56e60d6e..e85e94e9fea1a1 100644 --- a/app/assets/javascripts/entrypoints/super_sidebar.js +++ b/app/assets/javascripts/entrypoints/super_sidebar.js @@ -5,10 +5,12 @@ import { initSuperSidebarToggle, initPageBreadcrumbs, getSuperSidebarData, + initSuperTopbar, } from '~/super_sidebar/super_sidebar_bundle'; const superSidebarData = getSuperSidebarData(); initSuperSidebar(superSidebarData); initSuperSidebarToggle(); +initSuperTopbar(); initPageBreadcrumbs(); diff --git a/app/assets/javascripts/super_sidebar/components/topbar.vue b/app/assets/javascripts/super_sidebar/components/topbar.vue new file mode 100644 index 00000000000000..d701e4a3b82e9e --- /dev/null +++ b/app/assets/javascripts/super_sidebar/components/topbar.vue @@ -0,0 +1,22 @@ + + + diff --git a/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js b/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js index fcced25ab11676..2e505099f3f092 100644 --- a/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js +++ b/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js @@ -10,6 +10,7 @@ import { initSuperSidebarCollapsedState, } from './super_sidebar_collapsed_state_manager'; import SuperSidebar from './components/super_sidebar.vue'; +import SuperTopbar from './components/topbar.vue'; import SuperSidebarToggle from './components/super_sidebar_toggle.vue'; export { initPageBreadcrumbs } from './super_sidebar_breadcrumbs'; @@ -196,3 +197,23 @@ export const initSuperSidebarToggle = () => { }, }); }; + +export const initSuperTopbar = () => { + const el = document.querySelector('#app-topnav'); + if (!el) return false; + + const { props } = el.dataset; + const topbarProps = JSON.parse(props); + + return new Vue({ + el, + provide: { + rootPath: '/', + }, + render(h) { + return h(SuperTopbar, { + props: topbarProps, + }); + }, + }); +}; diff --git a/app/assets/stylesheets/framework/super_sidebar.scss b/app/assets/stylesheets/framework/super_sidebar.scss index 3e2ae99607f6e1..0be0d87dfb511e 100644 --- a/app/assets/stylesheets/framework/super_sidebar.scss +++ b/app/assets/stylesheets/framework/super_sidebar.scss @@ -737,3 +737,28 @@ $scroll-scrim-height: 2.25rem; .custom-gradient-progress .gl-progress { background: linear-gradient(90deg, #ffb177 0%, #936fff 100%); } + + + + + + + + + +// drafting CSS for new topnav +// TODO: move to its own file +#app-topnav { + position: fixed; + top: 0; + left: 0; + width: 100vw; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + gap: 1rem; + + z-index: 99999; // total hack to see the topbar while layout isn't ready for it yet + + padding: 0.25rem; +} diff --git a/app/helpers/sidebars_helper.rb b/app/helpers/sidebars_helper.rb index 0c7bb670e2293e..27531fe649d1ca 100644 --- a/app/helpers/sidebars_helper.rb +++ b/app/helpers/sidebars_helper.rb @@ -133,6 +133,14 @@ def super_sidebar_whats_new_data } end + # TODO: Use feature flag in sidebar data methods above to already mark the ones we duplicate noew (like logo_url). + # otherwise we'll never clean this up later + def super_topbar_props + return { + logo_url: current_appearance&.header_logo_path, + } + end + def work_items_modal_data(group, project) if project&.persisted? return { diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index f630ec888eb2df..cdccf80ede3f4f 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -15,7 +15,9 @@ = render 'peek/bar' = header_message - - if !current_user + - if current_user # && tbd_feature-flag is true + %header#app-topnav{data: { props: super_topbar_props.to_json } } + - else = render partial: "layouts/header/super_sidebar_logged_out" = render 'layouts/page', sidebar: sidebar, nav: nav = footer_message -- GitLab From d4b380b3d3b7422a075e0be286676a9e71df0e50 Mon Sep 17 00:00:00 2001 From: Thomas Hutterer Date: Wed, 30 Jul 2025 12:26:51 +0200 Subject: [PATCH 02/12] wip: share sidebardata for now --- .../javascripts/entrypoints/super_sidebar.js | 2 +- .../super_sidebar/components/topbar.vue | 13 +++- .../super_sidebar/components/user_bar.vue | 7 +- .../super_sidebar/super_sidebar_bundle.js | 68 +++++++++++++++++-- .../stylesheets/framework/super_sidebar.scss | 4 +- app/views/layouts/application.html.haml | 2 +- config/feature_flags/wip/global_topbar.yml | 10 +++ lib/gitlab/gon_helper.rb | 1 + 8 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 config/feature_flags/wip/global_topbar.yml diff --git a/app/assets/javascripts/entrypoints/super_sidebar.js b/app/assets/javascripts/entrypoints/super_sidebar.js index e85e94e9fea1a1..6fbb77673cb824 100644 --- a/app/assets/javascripts/entrypoints/super_sidebar.js +++ b/app/assets/javascripts/entrypoints/super_sidebar.js @@ -12,5 +12,5 @@ const superSidebarData = getSuperSidebarData(); initSuperSidebar(superSidebarData); initSuperSidebarToggle(); -initSuperTopbar(); +initSuperTopbar(superSidebarData); initPageBreadcrumbs(); diff --git a/app/assets/javascripts/super_sidebar/components/topbar.vue b/app/assets/javascripts/super_sidebar/components/topbar.vue index d701e4a3b82e9e..6b9282ddd41296 100644 --- a/app/assets/javascripts/super_sidebar/components/topbar.vue +++ b/app/assets/javascripts/super_sidebar/components/topbar.vue @@ -1,14 +1,19 @@ @@ -16,7 +21,9 @@ export default { diff --git a/app/assets/javascripts/super_sidebar/components/user_bar.vue b/app/assets/javascripts/super_sidebar/components/user_bar.vue index 68693b5dadb607..6baa43f1d6151b 100644 --- a/app/assets/javascripts/super_sidebar/components/user_bar.vue +++ b/app/assets/javascripts/super_sidebar/components/user_bar.vue @@ -90,6 +90,9 @@ export default { this.glFeatures.uiForOrganizations && this.isLoggedIn && window.gon.current_organization ); }, + appHasTopbar() { + return gon.features.globalTopbar; + }, }, created() { Object.assign(userCounts, this.sidebarData.user_counts); @@ -126,7 +129,7 @@ export default { class="gl-flex gl-items-center gl-gap-1" >