跳至内容
菜单
此问题已终结
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
















形象
丢弃
相关帖文 回复 查看 活动
3
6月 23
4928
1
2月 24
2861
1
2月 24
2061
0
1月 24
1641
0
12月 23
1735