İçereği Atla
Menü
Bu soru işaretlendi
I am creating timer widget in my custom module odoo16, the timer widget is okay but i want to do that when we drag the kanban to the other state other then In Progress then timer should be pause but in my case time is clearing the time 00:00:00 like this, please help me to achieve the time pause functionality.

start-timer.js
/** @odoo-module **/
import { registry } from "@web/core/registry" ;
import { useService } from "@web/core/utils/hooks" ;
import { parseFloatTime } from "@web/views/fields/parsers" ;
import { useInputField } from "@web/views/fields/input_field_hook" ;

const { Component, useState, onWillUpdateProps, onWillStart, onWillDestroy } = owl;

function formatMinutes(value) {
if (value === false ) {
return "" ;
}
const isNegative = value < 0 ;
if (isNegative) {
value = Math.abs(value);
}
let hours = Math.floor(value / 60 );
let minutes = Math.round(value % 60 );
let seconds = Math.round((value % 1 ) * 60 );
seconds = `${seconds}`.padStart( 2 , "0" );
minutes = `${minutes}`.padStart( 2 , "0" );
hours = `${hours}`.padStart( 2 , "0" );
return `${isNegative ? "-" : "" }${hours}:${minutes}:${seconds}`;
}

export class StartTimer extends Component {
setup() {
this .orm = useService( 'orm' );
this .state = useState({
// duration is expected to be given in hours
duration:
this .props.value !== undefined ? this .props.value : this .props.record.data.duration,
});
useInputField({
getValue: () => this .durationFormatted,
refName: "numpadDecimal" ,
parse: (v) => parseFloatTime(v),
});

this .ongoing = this .props.record.data.is_user_working;

onWillStart(async () => {
if ( this .props.record.data.is_user_working && this .props.record.resModel === "emp_track.project" ) {
const additionalDuration = await this .orm.call( 'emp_track.project' , 'get_working_duration' , [ this .props.record.resId]);
this .state.duration += additionalDuration;
}
else if ( this .props.record.data.is_user_working && this .props.record.resModel === "qa_track.project" ){
const additionalDuration = await this .orm.'qa_track.project' , 'get_working_duration' , [ this .props.record.resId]);
this .state.duration += additionalDuration;
}
if ( this .ongoing) {
this ._runTimer();
this .test = true ;
}

});
onWillUpdateProps((nextProps) => {
const newOngoing =
"ongoing" in nextProps
? nextProps.ongoing
: "record" in nextProps && nextProps.record.data.is_user_working;
const rerun = ! this .ongoing && newOngoing;
this .ongoing = newOngoing;
if (rerun) {
this .state.duration = nextProps.value;
this ._runTimer();
}
});
onWillDestroy(() => clearTimeout( this .timer));
}

get durationFormatted() {
if ( this .props.value!= this .state.duration && this .props.record && this .props.record.isDirty){
if ( typeof this .props.setDirty=== 'function' ) this.props.setDirty( false );
this .state.duration= this .props.value
}
return formatMinutes( this .state.duration);
}

_runTimer() {
this .timer = setTimeout(() => {
if ( this .ongoing) {
this .state.duration += 1 / 60 ;
this ._runTimer();
}
}, 1000 );
}

stopTimer() {
clearTimeout( this .timer);
this .ongoing = false;
}
}

StartTimer.supportedTypes = [ "float" ];
StartTimer.template = "employee_tracking.StartTimer" ;

registry.category( "fields" ).add( "start_timer" , StartTimer);
registry.category( "formatters" ).add( "start_timer" , formatMinutes);

start_timer.xml
















Avatar
Vazgeç
İlgili Gönderiler Cevaplar Görünümler Aktivite
3
Haz 23
4935
1
Şub 24
2872
1
Şub 24
2066
0
Oca 24
1649
0
Ara 23
1748