Browse Source

Oct 22: [FIX] Bug fixed 'backend_theme_odoo12'

18.0
Risvana Cybro 1 day ago
parent
commit
f94242cbf9
  1. 3
      backend_theme_odoo12/__manifest__.py
  2. 8
      backend_theme_odoo12/doc/RELEASE_NOTES.md
  3. 107
      backend_theme_odoo12/static/src/js/search_apps.js
  4. 33
      backend_theme_odoo12/static/src/js/sidebar_menu.js
  5. 36
      backend_theme_odoo12/static/src/xml/sidebar_menu_templates.xml

3
backend_theme_odoo12/__manifest__.py

@ -21,7 +21,7 @@
############################################################################# #############################################################################
{ {
"name": "Blueberry Backend Theme", "name": "Blueberry Backend Theme",
"version": "18.0.1.0.0", "version": "18.0.1.0.1",
"category": "Themes/Backend", "category": "Themes/Backend",
"summary": """Backend theme for Odoo 18.0 community edition""", "summary": """Backend theme for Odoo 18.0 community edition""",
"description": "Blueberry Backend Theme Is A Ultimate Theme for Odoo 17." "description": "Blueberry Backend Theme Is A Ultimate Theme for Odoo 17."
@ -34,7 +34,6 @@
'web.assets_backend': [ 'web.assets_backend': [
'/backend_theme_odoo12/static/src/scss/theme_style_backend.scss', '/backend_theme_odoo12/static/src/scss/theme_style_backend.scss',
'/backend_theme_odoo12/static/src/js/search_apps.js', '/backend_theme_odoo12/static/src/js/search_apps.js',
'/backend_theme_odoo12/static/src/js/sidebar_menu.js',
'/backend_theme_odoo12/static/src/xml/sidebar_menu_templates.xml', '/backend_theme_odoo12/static/src/xml/sidebar_menu_templates.xml',
], ],
'web.assets_frontend': [ 'web.assets_frontend': [

8
backend_theme_odoo12/doc/RELEASE_NOTES.md

@ -4,3 +4,11 @@
#### ADD #### ADD
- Initial Commit For Blueberry Backend Theme - Initial Commit For Blueberry Backend Theme
#### 22.10.2025
#### Version 18.0.1.0.1
#### FIX
- Updated the search functionality in search bar.

107
backend_theme_odoo12/static/src/js/search_apps.js

@ -1,34 +1,109 @@
/** @odoo-module **/ /** @odoo-module **/
import { NavBar } from "@web/webclient/navbar/navbar"; import { NavBar } from "@web/webclient/navbar/navbar";
const { fuzzyLookup } = require('@web/core/utils/search');
import { computeAppsAndMenuItems } from "@web/webclient/menus/menu_helpers";
const { onMounted, useState, useRef } = owl;
import { patch } from "@web/core/utils/patch"; import { patch } from "@web/core/utils/patch";
import { useRef, onMounted } from "@odoo/owl";
patch(NavBar.prototype, { patch(NavBar.prototype, {
setup() { setup() {
super.setup(); super.setup();
// Attach a ref for the root element // Attach a ref for the root element
this.sideRoot = useRef("side_root"); this.searchState = useState({
searchResults: [],
hasResults: false,
showResults: false,
query: ""
});
this.searchInputRef = useRef("searchInput");
this._searchTimeout = null;
let { apps, menuItems } = computeAppsAndMenuItems(this.menuService.getMenuAsTree("root"));
this._apps = apps;
this._searchableMenus = menuItems;
},
// Ensure that DOM manipulation happens after mounting openSidebar(ev) {
onMounted(this.handleMounted.bind(this)); const sidebarPanel = ev.target.closest('header').querySelector('#sidebar_panel');
const actionManager = document.body.querySelector('.o_action_manager');
if (!ev.target.classList.contains('opened')) {
sidebarPanel.style.display = 'block';
ev.target.classList.toggle('opened');
actionManager.style.marginLeft = '320px';
actionManager.style.transition = 'all .1s linear';
} else {
sidebarPanel.style.display = 'none';
ev.target.classList.toggle('opened');
actionManager.style.marginLeft = '0px';
}
},
clickSidebar(ev) {
this.searchState.query = "";
this.searchInputRef.el.value = "";
this.searchState.searchResults = [];
this.searchState.hasResults = false;
this.searchState.showResults = false;
const sidebarPanel = ev.target.closest('header').querySelector('#sidebar_panel');
const actionManager = document.body.querySelector('.o_action_manager');
sidebarPanel.style.display = 'none';
actionManager.style.marginLeft = '0px';
}, },
handleMounted() { _searchMenusSchedule(ev) {
// Access the DOM element for the sidebar panel const query = ev.target.value;
if (!this.sideRoot.el) { this.searchState.query = query;
console.error("sideRoot.el is not defined. Check the template structure.");
return; // Clear previous timeout
if (this._searchTimeout) {
clearTimeout(this._searchTimeout);
} }
this.$searchContainer = this.sideRoot.el.querySelector(".search-container"); // Debounce search
this.$searchInput = this.sideRoot.el.querySelector(".search-input"); this._searchTimeout = setTimeout(() => {
this.$searchResults = this.sideRoot.el.querySelector(".search-results"); this._searchMenus(query);
this.$appMenu = this.sideRoot.el.querySelector(".app-menu"); }, 50);
},
if (!this.$searchContainer || !this.$searchInput) { _searchMenus(query) {
console.error("Required elements not found in the DOM."); if (query === "") {
this.searchState.searchResults = [];
this.searchState.hasResults = false;
this.searchState.showResults = false;
return;
} }
this.searchState.showResults = true;
var results = [];
// Search for all apps
fuzzyLookup(query, this._apps, (menu) => menu.label)
.forEach((menu) => {
results.push({
category: "apps",
name: menu.label,
actionID: menu.actionID,
id: menu.id,
webIconData: menu.webIconData,
});
});
// Search for all content
fuzzyLookup(query, this._searchableMenus, (menu) =>
(menu.parents + " / " + menu.label).split("/").reverse().join("/")
).forEach((menu) => {
results.push({
category: "menu_items",
name: menu.parents + " / " + menu.label,
actionID: menu.actionID,
id: menu.id,
});
});
this.searchState.searchResults = results;
this.searchState.hasResults = results.length > 0;
},
getMenuUrl(actionID, menuId) {
return `/web#action=${actionID}&menu_id=${menuId}`;
}, },
}); });

33
backend_theme_odoo12/static/src/js/sidebar_menu.js

@ -1,33 +0,0 @@
/** @odoo-module **/
import { NavBar } from "@web/webclient/navbar/navbar";
import { patch } from "@web/core/utils/patch";
// Patch NavBar for adding new sidebar functionality
patch(NavBar.prototype, {
setup() {
super.setup();
},
// Toggle sidebar on click
openSidebar(ev) {
const sidebarPanel = ev.target.closest('header').querySelector('#sidebar_panel');
const actionManager = document.body.querySelector('.o_action_manager');
if (!ev.target.classList.contains('opened')) {
sidebarPanel.style.display = 'block';
ev.target.classList.toggle('opened');
actionManager.style.marginLeft = '320px';
actionManager.style.transition = 'all .1s linear';
} else {
sidebarPanel.style.display = 'none';
ev.target.classList.toggle('opened');
actionManager.style.marginLeft = '0px';
}
},
clickSidebar(ev) {
const sidebarPanel = ev.target.closest('header').querySelector('#sidebar_panel');
const actionManager = document.body.querySelector('.o_action_manager');
sidebarPanel.style.display = 'none';
actionManager.style.marginLeft = '0px';
},
});

36
backend_theme_odoo12/static/src/xml/sidebar_menu_templates.xml

@ -3,7 +3,7 @@
<t t-inherit="web.NavBar" t-inherit-mode="extension" owl="1"> <t t-inherit="web.NavBar" t-inherit-mode="extension" owl="1">
<xpath expr="//nav[hasclass('o_main_navbar')]" position="after"> <xpath expr="//nav[hasclass('o_main_navbar')]" position="after">
<!-- Advanced Sidebar for app search --> <!-- Advanced Sidebar for app search -->
<div class="sidebar_panel" id="sidebar_panel" t-ref="side_root"> <div class="sidebar_panel" id="sidebar_panel">
<div class="sidebar"> <div class="sidebar">
<div class="search-container form-row align-items-center m-auto mb-5 col-12" <div class="search-container form-row align-items-center m-auto mb-5 col-12"
style="padding-top: 32px;"> style="padding-top: 32px;">
@ -18,9 +18,25 @@
<input type="search" <input type="search"
autocomplete="off" autocomplete="off"
placeholder="Search menus..." placeholder="Search menus..."
t-ref="searchInput"
class="form-control"/> class="form-control"/>
</div> </div>
</div> </div>
<div class="search-results col-md-12 ml-auto mr-auto"
t-attf-class="{{ !searchState.showResults ? 'o_hidden' : '' }}"
>
<t t-foreach="searchState.searchResults" t-as="result" t-key="result.id">
<p class="search-items">
<a t-att-data-tooltip-info="result.name"
style="color: #ffffff !important"
t-att-href="getMenuUrl(result.actionID, result.id)"
t-on-click="clickSidebar"
t-esc="result.name"/>
</p>
</t>
</div>
<div class="search-results col-md-10 ml-auto mr-auto"/></div> <div class="search-results col-md-10 ml-auto mr-auto"/></div>
<ul class="sidebar_menu"> <ul class="sidebar_menu">
<t t-foreach="menuService.getApps()" t-as="app" <t t-foreach="menuService.getApps()" t-as="app"
@ -32,7 +48,8 @@
t-att-data-menu-id="app.menuID" t-att-data-menu-id="app.menuID"
t-att-data-menu-xmlid="app.xmlID" t-att-data-menu-xmlid="app.xmlID"
t-att-data-action-id="app.actionID"> t-att-data-action-id="app.actionID">
<img t-att-title="app.name" style="height: 3em;" t-if="app.webIconData" class="o_app_icon me-2" t-attf-src="{{app.webIconData}}"/> <img t-att-title="app.name" style="height: 3em;" t-if="app.webIconData"
class="o_app_icon me-2" t-attf-src="{{app.webIconData}}"/>
<b class="a_app_menu_title"> <b class="a_app_menu_title">
<t t-esc="app.name"/> <t t-esc="app.name"/>
</b> </b>
@ -58,19 +75,4 @@
</li> </li>
</xpath> </xpath>
</t> </t>
<!-- view for search result -->
<t t-name="backend_theme_odoo12.SearchResults">
<t t-foreach="results" t-as="result">
<t t-log="this"/>
<div class="search_icons">
<a t-attf-class="o-menu-search-result dropdown-item
col-12 ml-auto mr-auto #{result_first ? 'active' : ''}"
t-attf-style="background-image:url('data:image/png;base64,#{result.webIconData}')"
t-att-data-menu-id="result.id"
t-att-data-action-id="result.actionID"
t-raw="result.name"
/>
</div>
</t>
</t>
</templates> </templates>

Loading…
Cancel
Save