You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							110 lines
						
					
					
						
							5.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							110 lines
						
					
					
						
							5.2 KiB
						
					
					
				| /** @odoo-module **/ | |
| import { registry } from "@web/core/registry"; | |
| import { useInputField } from "@web/views/fields/input_field_hook"; | |
| const { Component, useRef, onMounted } = owl; | |
| import { standardFieldProps } from "@web/views/fields/standard_field_props"; | |
| import { AlertDialog } from "@web/core/confirmation_dialog/confirmation_dialog"; | |
| import { _t } from "@web/core/l10n/translation"; | |
| 
 | |
| /** | |
|  * Define this module for the function of creating a time picker widget | |
|  */ | |
| export class FieldTimePicker extends Component { | |
|     static template = 'FieldTimePicker'; | |
| 
 | |
|     setup() { | |
|         this.input = useRef('input_time'); | |
|         // Ensure the element is accessible after the component is mounted | |
|         onMounted(() => { | |
|             if (!this.input.el) { | |
|                 console.error("Input element is not available."); | |
|             } | |
|         }); | |
|         useInputField({ | |
|             getValue: () => this.props.record.data[this.props.name] || "", | |
|             refName: "input_time" | |
|         }); | |
|     } | |
|     /** | |
|      * Function to open a time picker and set the time. | |
|      */ | |
|     _onClickTimeField(ev) { | |
|         const timePicker = this.input.el; | |
|         if (!timePicker) { | |
|             console.error("Input element is not available."); | |
|             return; | |
|         } | |
|         if (this.props.record.fields[this.props.name].type === "char" && timePicker) { | |
|             const currentTime = timePicker.value || "00:00:00"; | |
|             const [hour, minute, second] = currentTime.split(':').map(Number); | |
|             // Create a container for the time picker near the input field | |
|             const timePickerContainer = document.createElement("div"); | |
|             timePickerContainer.className = "time-picker-container"; | |
|             document.body.appendChild(timePickerContainer); | |
|             // Position the time picker container relative to the input field | |
|             const rect = timePicker.getBoundingClientRect(); | |
|             timePickerContainer.style.position = "absolute"; | |
|             timePickerContainer.style.top = `${rect.bottom + window.scrollY}px`; | |
|             timePickerContainer.style.left = `${rect.left + window.scrollX}px`; | |
|             const createTimeBox = (label, value, max) => { | |
|                 const wrapper = document.createElement("div"); | |
|                 wrapper.className = "time-box-wrapper"; | |
|                 const incrementButton = document.createElement("button"); | |
|                 incrementButton.textContent = "+"; | |
|                 incrementButton.className = "time-box-button"; | |
|                 wrapper.appendChild(incrementButton); | |
|                 const display = document.createElement("div"); | |
|                 display.textContent = value < 10 ? `0${value}` : value; | |
|                 display.className = "time-box-display"; | |
|                 wrapper.appendChild(display); | |
|                 const decrementButton = document.createElement("button"); | |
|                 decrementButton.textContent = "-"; | |
|                 decrementButton.className = "time-box-button"; | |
|                 wrapper.appendChild(decrementButton); | |
|                 incrementButton.addEventListener("click", () => { | |
|                     let newValue = (parseInt(display.textContent, 10) + 1) % (max + 1); | |
|                     display.textContent = newValue < 10 ? `0${newValue}` : newValue; | |
|                 }); | |
|                 decrementButton.addEventListener("click", () => { | |
|                     let newValue = (parseInt(display.textContent, 10) - 1 + (max + 1)) % (max + 1); | |
|                     display.textContent = newValue < 10 ? `0${newValue}` : newValue; | |
|                 }); | |
|                 return wrapper; | |
|             }; | |
|             const hourBox = createTimeBox("Hour", hour, 23); | |
|             const minuteBox = createTimeBox("Minute", minute, 59); | |
|             const secondBox = createTimeBox("Second", second, 59); | |
|             timePickerContainer.appendChild(hourBox); | |
|             timePickerContainer.appendChild(minuteBox); | |
|             timePickerContainer.appendChild(secondBox); | |
|             const confirmButton = document.createElement("button"); | |
|             confirmButton.textContent = _t("Set Time"); | |
|             confirmButton.className = "time-picker-confirm-button"; | |
|             timePickerContainer.appendChild(confirmButton); | |
|             confirmButton.addEventListener("click", () => { | |
|                 if (this.input?.el) { | |
|                     const selectedTime = `${hourBox.querySelector('.time-box-display').textContent}:${minuteBox.querySelector('.time-box-display').textContent}:${secondBox.querySelector('.time-box-display').textContent}`; | |
|                     this.input.el.value = selectedTime; | |
|                     this.props.record.update({ | |
|                         [this.props.name]: selectedTime | |
|                     }); | |
|                     document.body.removeChild(timePickerContainer); | |
|                 } else { | |
|                     document.body.removeChild(timePickerContainer); | |
|                 } | |
|             }); | |
|         } else { | |
|             this.env.model.dialog.add(AlertDialog, { | |
|                 body: _t("This widget can only be added to 'Char' field"), | |
|             }); | |
|         } | |
|     } | |
| } | |
| FieldTimePicker.props = { | |
|     ...standardFieldProps, | |
| }; | |
| export const TimePickerField = { | |
|     component: FieldTimePicker, | |
|     supportedTypes: ["char"], | |
| }; | |
| registry.category("fields").add("timepicker", TimePickerField); |