Overslaan naar inhoud
Odoo Menu
  • Aanmelden
  • Probeer het gratis
  • Apps
    Financiën
    • Boekhouding
    • Facturatie
    • Onkosten
    • Spreadsheet (BI)
    • Documenten
    • Ondertekenen
    Verkoop
    • CRM
    • Verkoop
    • Kassasysteem winkel
    • Kassasysteem Restaurant
    • Abonnementen
    • Verhuur
    Websites
    • Websitebouwer
    • E-commerce
    • Blog
    • Forum
    • Live Chat
    • eLearning
    Bevoorradingsketen
    • Voorraad
    • Productie
    • PLM
    • Inkoop
    • Onderhoud
    • Kwaliteit
    Personeelsbeheer
    • Werknemers
    • Werving & Selectie
    • Verlof
    • Evaluaties
    • Aanbevelingen
    • Wagenpark
    Marketing
    • Social media Marketing
    • E-mailmarketing
    • SMS Marketing
    • Evenementen
    • Marketingautomatisering
    • Enquêtes
    Diensten
    • Project
    • Urenstaten
    • Buitendienst
    • Helpdesk
    • Planning
    • Afspraken
    Productiviteit
    • Chat
    • Goedkeuringen
    • IoT
    • VoIP
    • Kennis
    • WhatsApp
    Apps van derden Odoo Studio Odoo Cloud Platform
  • Bedrijfstakken
    Detailhandel
    • Boekhandel
    • kledingwinkel
    • Meubelzaak
    • Supermarkt
    • Bouwmarkt
    • Speelgoedwinkel
    Food & Hospitality
    • Bar en Pub
    • Restaurant
    • Fastfood
    • Gastenverblijf
    • Drankenhandelaar
    • Hotel
    Vastgoed
    • Makelaarskantoor
    • Architectenbureau
    • Bouw
    • Vastgoedbeheer
    • Tuinieren
    • Vereniging van eigenaren
    Consulting
    • Accountantskantoor
    • Odoo Partner
    • Marketingbureau
    • Advocatenkantoor
    • Talentenwerving
    • Audit & Certificering
    Productie
    • Textiel
    • Metaal
    • Meubels
    • Eten
    • Brewery
    • Relatiegeschenken
    Gezondheid & Fitness
    • Sportclub
    • Opticien
    • Fitnesscentrum
    • Wellness-medewerkers
    • Apotheek
    • Kapper
    Trades
    • Klusjesman
    • IT-hardware & support
    • Zonne-energiesystemen
    • Schoenmaker
    • Schoonmaakdiensten
    • HVAC-diensten
    Andere
    • Non-profitorganisatie
    • Milieuagentschap
    • Verhuur van Billboards
    • Fotograaf
    • Fietsleasing
    • Softwareverkoper
    Browse all Industries
  • Community
    Leren
    • Tutorials
    • Documentatie
    • Certificeringen
    • Training
    • Blog
    • Podcast
    Versterk het onderwijs
    • Onderwijs- programma
    • Scale Up! Business Game
    • Bezoek Odoo
    Download de Software
    • Downloaden
    • Vergelijk edities
    • Releases
    Werk samen
    • Github
    • Forum
    • Evenementen
    • Vertalingen
    • Word een Partner
    • Services for Partners
    • Registreer je accountantskantoor
    Diensten
    • Vind een partner
    • Vind een boekhouder
    • Een adviseur ontmoeten
    • Implementatiediensten
    • Klantreferenties
    • Ondersteuning
    • Upgrades
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    Vraag een demo aan
  • Prijzen
  • Help

Odoo is the world's easiest all-in-one management software.
It includes hundreds of business apps:

  • CRM
  • e-Commerce
  • Boekhouding
  • Voorraad
  • PoS
  • Project
  • MRP
All apps
Je moet geregistreerd zijn om te kunnen communiceren met de community.
Alle posts Personen Badges
Labels (Bekijk alle)
odoo accounting v14 pos v15
Over dit forum
Je moet geregistreerd zijn om te kunnen communiceren met de community.
Alle posts Personen Badges
Labels (Bekijk alle)
odoo accounting v14 pos v15
Over dit forum
Help

Issue with understanding how Owl template integrate in odoo 14

Inschrijven

Ontvang een bericht wanneer er activiteit is op deze post

Deze vraag is gerapporteerd
javascriptdevelopmentowlodooV14
1 Beantwoorden
1658 Weergaven
Avatar
Daniel Palumbo

Hello,

I am fairly new to developing on odoo with owl. I am currently working on a project that use odoo 14 and owl 1.4


I am trying to implement a component that will render in a page renderer by the backend controller. I have this timeline.js file


odoo.define('my_module.My2ChildTimeline', ['web.ajax'], function (require) {
"use strict";

const { Component } = owl;
const { useState, onWillStart, onMounted } = owl.hooks;
const ajax = require("web.ajax");

/**
* ChildTimeline component for displaying a timeline of records related to a specific child.
*/
class ChildTimeline extends Component {

setup() {
...

onWillStart(async () => {
try {
console.info("Loading initial records for ChildTimeline"); // Debug
await this.loadMore();
} catch (error) {
console.error("Error loading initial records:", error);
this.state.loading = false;
}
});

onMounted(() => {
window.addEventListener('scroll', this.onScroll.bind(this));
});
}

onScroll() {
const nearBottom = window.innerHeight + window.scrollY >= document.body.offsetHeight - 100;
if (!this.state.loading && this.state.hasMoreRecords && nearBottom) {
this.loadMore();
}
}

async loadMore() {
this.state.loading = true;

const res = await ajax.jsonRpc(`/somewhere`, "call", {
offset: this.state.offset,
limit: this.state.limit,
});
console.info("Loaded more records:", res); // Debug

const tempDiv = document.createElement('div');
tempDiv.innerHTML = res.html;

const newItems = [...tempDiv.children];
const container = this.el.querySelector('.timeline-list');

if (container) {
newItems.forEach(el => container.appendChild(el));
}

this.state.offset += this.state.limit;
this.state.hasMoreRecords = res.has_more_records;
this.state.loading = false;
}
};

ChildTimeline.template = "my_module.My2ChildTimelineComponent";

// Mount immediately when DOM is ready
if (document.getElementById("timeline-root")) {
const dataScript = document.getElementById("timeline-data");
const props = JSON.parse(dataScript.textContent);

owl.mount(ChildTimeline, {
target: document.getElementById("timeline-root"),
props,
});
}

return ChildTimeline;
});

and an xml component

<templates xml:space="preserve">
<t t-name="my_module.My2ChildTimelineComponent" owl="1">
<div class="timeline-list">
<t t-foreach="state.records" t-as="record" t-key="record.id">
<div class="timeline-card d-flex">
<t t-if="record.model == 'sponsorship_gift'">
<My2ChildTimelineRecordGiftComponent record="record"/>
</t>
<t t-elif="record.model == 'correspondence'">
<My2ChildTimelineRecordCorrespondenceComponent record="record"/>
</t>
<t t-else="">
<div>This record type is not supported in the timeline.</div>
</t>
</div>
</t>

<t t-if="state.loading">
<div class="text-center py-2">Loading more...</div>
</t>
</div>
</t>
</templates>


The script will be called in a my2_child_timeline.xml page

...
<div class="mb-3">
<div id="timeline-root">
<script type="application/json" id="timeline-data">
<t t-raw="json.dumps({
'child_id': child.id,
'records': records,
'pageable': pageable,
})"/>
</script>
<script type="module" src="/my_module/static/src/components/timeline/My2ChildTimeline.js"></script>
</div>
</div>
...


The issue is that it does not find the My2ChildTimelineComponent and I cannot figure it out what is the issue. Is there somebody who could help me?



0
Avatar
Annuleer
Daniel Palumbo
Auteur

Thanks for sharing! It got better but I had to change a few things like 

odoo.__ready.then

does not exist in odoo 14. But I got over it and unfortunately the template is recognized but not used by the system. There is another underlying problem. After so many hours spend on it, I talked to my senior and we decided to go vanilla js for our use case and maybe later go back to owl as we will upgrade to odoo 17 probably

Thanks anyway!

Avatar
D Enterprise
Beste antwoord

Hii,


Here is updated code 


my_module/views/timeline_templates.xml


<odoo>

  <!-- Register the template -->

  <template id="My2ChildTimelineComponent">

    <t t-name="my_module.My2ChildTimelineComponent" owl="1">

      <div class="timeline-list">

        <t t-if="state.loading">

          <div class="text-center py-2">Loading more...</div>

        </t>

      </div>

    </t>

  </template>

</odoo>


Update __manifest__.py

Make sure this is included:


'qweb': [

    'views/timeline_templates.xml',

],


JavaScript Component


odoo.define('my_module.My2ChildTimeline', function (require) {

    "use strict";


    const { Component } = owl;

    const { useState, onWillStart, onMounted } = owl.hooks;

    const ajax = require("web.ajax");


    class ChildTimeline extends Component {

        setup() {

            this.state = useState({

                loading: false,

                offset: 0,

                limit: 10,

                hasMoreRecords: true,

            });


            onWillStart(() => this.loadMore());

            onMounted(() => window.addEventListener('scroll', this.onScroll.bind(this)));

        }


        async loadMore() {

            this.state.loading = true;

            const res = await ajax.jsonRpc(`/somewhere`, "call", {

                offset: this.state.offset,

                limit: this.state.limit,

            });


            const container = this.el.querySelector('.timeline-list');

            const tempDiv = document.createElement('div');

            tempDiv.innerHTML = res.html;

            [...tempDiv.children].forEach(el => container.appendChild(el));


            this.state.offset += this.state.limit;

            this.state.hasMoreRecords = res.has_more_records;

            this.state.loading = false;

        }


        onScroll() {

            const nearBottom = window.innerHeight + window.scrollY >= document.body.offsetHeight - 100;

            if (!this.state.loading && this.state.hasMoreRecords && nearBottom) {

                this.loadMore();

            }

        }

    }


    ChildTimeline.template = "my_module.My2ChildTimelineComponent";


    odoo.__ready.then(() => {

        const target = document.getElementById("timeline-root");

        const script = document.getElementById("timeline-data");


        if (target && script) {

            const props = JSON.parse(script.textContent);

            owl.mount(ChildTimeline, { target, props });

        }

    });


    return ChildTimeline;

});


In views/assets.xml:

<odoo>

  <template id="assets_frontend" inherit_id="web.assets_frontend" name="Timeline Assets">

    <xpath expr="." position="inside">

      <script type="module" src="/my_module/static/src/components/timeline/My2ChildTimeline.js"/>

    </xpath>

  </template>

</odoo>

And include assets.xml in __manifest__.py under data.


i hope it is use full

0
Avatar
Annuleer
Geniet je van het gesprek? Blijf niet alleen lezen, doe ook mee!

Maak vandaag nog een account aan om te profiteren van exclusieve functies en deel uit te maken van onze geweldige community!

Aanmelden
Gerelateerde posts Antwoorden Weergaven Activiteit
How can I use my only web url domain using odoo?
javascript development
Avatar
Avatar
1
sep. 25
1507
How to Load Related Many2Many Data (pos.ticket.type) into the Frontend?
javascript development
Avatar
0
jun. 25
1821
Odoo 18 POS - Discount Button Group Permissions Not Working
javascript development
Avatar
Avatar
2
jun. 25
1983
¿Cómo puedo crear un Dashboard con KPIs y gráficos con Chart.js?
javascript development
Avatar
0
apr. 25
1953
Odoo icon change Opgelost
javascript development
Avatar
Avatar
2
jan. 25
2501
Community
  • Tutorials
  • Documentatie
  • Forum
Open Source
  • Downloaden
  • Github
  • Runbot
  • Vertalingen
Diensten
  • Odoo.sh Hosting
  • Ondersteuning
  • Upgrade
  • Gepersonaliseerde ontwikkelingen
  • Onderwijs
  • Vind een boekhouder
  • Vind een partner
  • Word een Partner
Over ons
  • Ons bedrijf
  • Merkelementen
  • Neem contact met ons op
  • Vacatures
  • Evenementen
  • Podcast
  • Blog
  • Klanten
  • Juridisch • Privacy
  • Beveiliging
الْعَرَبيّة Català 简体中文 繁體中文 (台灣) Čeština Dansk Nederlands English Suomi Français Deutsch हिंदी Bahasa Indonesia Italiano 日本語 한국어 (KR) Lietuvių kalba Język polski Português (BR) română русский язык Slovenský jazyk slovenščina Español (América Latina) Español ภาษาไทย Türkçe українська Tiếng Việt

Odoo is een suite van open source zakelijke apps die aan al je bedrijfsbehoeften voldoet: CRM, E-commerce, boekhouding, inventaris, kassasysteem, projectbeheer, enz.

Odoo's unieke waardepropositie is om tegelijkertijd zeer gebruiksvriendelijk en volledig geïntegreerd te zijn.

Website made with

Odoo Experience on YouTube

1. Use the live chat to ask your questions.
2. The operator answers within a few minutes.

Live support on Youtube
Watch now