This commit is contained in:
gsinghpal
2026-03-13 12:38:28 -04:00
parent db4b9aa278
commit fc3c966484
2975 changed files with 1614 additions and 498 deletions

View File

@@ -0,0 +1,33 @@
import { registry } from "@web/core/registry";
import { user } from "@web/core/user";
import { computeAppsAndMenuItems, reorderApps } from "@web/webclient/menus/menu_helpers";
export const appMenuService = {
dependencies: ["menu"],
async start(env, { menu }) {
return {
getCurrentApp () {
return menu.getCurrentApp();
},
getAppsMenuItems() {
const menuItems = computeAppsAndMenuItems(
menu.getMenuAsTree('root')
)
const apps = menuItems.apps;
const menuConfig = JSON.parse(
user.settings?.homemenu_config || 'null'
);
if (menuConfig) {
reorderApps(apps, menuConfig);
}
return apps;
},
selectApp(app) {
menu.selectMenu(app);
}
};
},
};
registry.category("services").add("app_menu", appMenuService);

View File

@@ -0,0 +1,6 @@
// = Sidebar Dark Mode
// ============================================================================
// Dark mode sidebar colors ($o-fusion-color-sidebar-text, $o-fusion-color-sidebar-background)
// are defined in primary_variables.dark.scss and automatically applied
// to the sidebar component styles.

View File

@@ -0,0 +1,34 @@
import { url } from '@web/core/utils/urls';
import { useService } from '@web/core/utils/hooks';
import { user } from "@web/core/user";
import { Component, onWillUnmount } from '@odoo/owl';
export class Sidebar extends Component {
static template = 'fusion_backend_theme.Sidebar';
static props = {};
setup() {
this.appMenuService = useService('app_menu');
if (user.activeCompany.has_appsbar_image) {
this.sidebarImageUrl = url('/web/image', {
model: 'res.company',
field: 'appbar_image',
id: user.activeCompany.id,
});
}
const renderAfterMenuChange = () => {
this.render();
};
this.env.bus.addEventListener(
'MENUS:APP-CHANGED', renderAfterMenuChange
);
onWillUnmount(() => {
this.env.bus.removeEventListener(
'MENUS:APP-CHANGED', renderAfterMenuChange
);
});
}
_onAppClick(app) {
return this.appMenuService.selectApp(app);
}
}

View File

@@ -0,0 +1,95 @@
.o_fusion_sidebar_panel {
@include o-fusion-disable-scrollbar();
background-color: $o-fusion-color-sidebar-background;
width: var(--o-fusion-sidebar-width, 0);
overflow-y: auto;
.o_fusion_sidebar {
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
white-space: nowrap;
.o_fusion_sidebar_menu {
padding: 0;
> li > a {
cursor: pointer;
font-size: 13px;
font-weight: 300;
overflow: hidden;
padding: 8px 11px;
text-decoration: none;
color: $o-fusion-color-sidebar-text;
text-overflow: ellipsis;
.o_fusion_sidebar_icon {
width: 22px;
height: 22px;
margin-right: 5px;
}
}
> li.active > a {
background: $o-fusion-color-sidebar-active;
}
> li:hover > a {
background: $o-fusion-color-sidebar-active;
}
}
}
}
.o_fusion_sidebar_type_large {
--o-fusion-sidebar-width: #{$o-fusion-sidebar-large-width};
}
.o_fusion_sidebar_type_small {
--o-fusion-sidebar-width: #{$o-fusion-sidebar-small-width};
.o_fusion_sidebar_name {
display: none;
}
.o_fusion_sidebar_icon {
margin-right: 0 !important;
}
.o_fusion_sidebar_logo {
display: none;
}
}
.o_fusion_sidebar_type_invisible {
--o-fusion-sidebar-width: 0;
}
.editor_has_snippets_hide_backend_navbar,
.o_home_menu_background,
.o_fullscreen {
--o-fusion-sidebar-width: 0;
}
.editor_has_snippets_hide_backend_navbar .o_fusion_sidebar_panel {
transition: width 300ms;
}
@include media-breakpoint-only(md) {
.o_fusion_sidebar_type_large {
--o-fusion-sidebar-width: #{$o-fusion-sidebar-small-width};
.o_fusion_sidebar_name {
display: none;
}
.o_fusion_sidebar_icon {
margin-right: 0 !important;
}
.o_fusion_sidebar_logo {
display: none;
}
}
}
@include media-breakpoint-down(md) {
.o_fusion_sidebar_type_large, .o_fusion_sidebar_type_small {
--o-fusion-sidebar-width: 0;
}
}
@media print {
.o_fusion_sidebar_type_large, .o_fusion_sidebar_type_small {
--o-fusion-sidebar-width: 0;
}
}

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-name="fusion_backend_theme.Sidebar">
<div class="o_fusion_sidebar_panel">
<div class="o_fusion_sidebar">
<ul class="o_fusion_sidebar_menu">
<t t-foreach="this.appMenuService.getAppsMenuItems()" t-as="app" t-key="app.id">
<li t-attf-class="nav-item {{ app.id === this.appMenuService.getCurrentApp()?.id ? 'active' : '' }}">
<a
t-att-href="app.href"
t-att-data-menu-id="app.id"
t-att-data-menu-xmlid="app.xmlid"
t-att-data-action-id="app.actionID"
t-on-click.prevent="() => this._onAppClick(app)"
class="nav-link"
role="menuitem"
>
<img
t-if="app.webIconData"
class="o_fusion_sidebar_icon"
t-att-src="app.webIconData"
/>
<img
t-else=""
class="o_fusion_sidebar_icon"
src="/base/static/description/icon.png"
/>
<span class="o_fusion_sidebar_name">
<t t-out="app.label"/>
</span>
</a>
</li>
</t>
</ul>
<div t-if="sidebarImageUrl" class="o_fusion_sidebar_logo p-2">
<img class="img-fluid mx-auto" t-att-src="sidebarImageUrl" alt="Logo"/>
</div>
</div>
</div>
</t>
</templates>