/** @odoo-module */ import { Component, useRef, useState, xml } from "@odoo/owl"; import { logLevels } from "../core/logger"; import { refresh } from "../core/url"; import { useAutofocus, useWindowListener } from "../hoot_utils"; import { generateSeed, internalRandom } from "../mock/math"; import { toggleColorScheme, useColorScheme } from "./hoot_colors"; import { HootCopyButton } from "./hoot_copy_button"; /** * @typedef {"dark" | "light"} ColorScheme * * @typedef {{ * }} HootConfigDropdownProps */ //----------------------------------------------------------------------------- // Global //----------------------------------------------------------------------------- const { Object: { entries: $entries }, } = globalThis; //----------------------------------------------------------------------------- // Exports //----------------------------------------------------------------------------- /** @extends {Component} */ export class HootConfigDropdown extends Component { static components = { HootCopyButton }; static props = {}; static template = xml`
Execution order
Seed: Failed tests: Level:
`; executionOrders = [ { value: "fifo", title: "First in, first out", icon: "fa-sort-numeric-asc" }, { value: "lifo", title: "Last in, first out", icon: "fa-sort-numeric-desc" }, { value: "random", title: "Random", icon: "fa-random" }, ]; logLevels = $entries(logLevels) .filter(([, value]) => value) .map(([label, value]) => ({ label, value })); refresh = refresh; toggleColorScheme = toggleColorScheme; setup() { this.rootRef = useRef("root"); this.togglerRef = useRef("toggler"); this.color = useColorScheme(); this.config = useState(this.env.runner.config); this.state = useState({ open: false }); useAutofocus(this.rootRef); useWindowListener("keydown", (ev) => { if (this.state.open && ev.key === "Escape") { ev.preventDefault(); this.state.open = false; } }); useWindowListener( "click", (ev) => { const path = ev.composedPath(); if (!path.includes(this.rootRef.el)) { this.state.open = false; } else if (path.includes(this.togglerRef.el)) { this.state.open = !this.state.open; } }, { capture: true } ); } /** * @param {Event & { currentTarget: HTMLInputElement }} ev */ onBailChange(ev) { this.config.bail = ev.currentTarget.checked ? 1 : 0; } /** * @param {Event & { currentTarget: HTMLInputElement }} ev */ onLogLevelChange(ev) { this.config.loglevel = ev.currentTarget.checked ? logLevels.SUITES : logLevels.RUNNER; } /** * @param {Event & { currentTarget: HTMLInputElement }} ev */ onRandomChange(ev) { if (ev.currentTarget.checked) { this.resetSeed(); } else { this.config.random = 0; } } resetSeed() { const newSeed = generateSeed(); this.config.random = newSeed; internalRandom.seed = newSeed; } /** * @param {"fifo" | "lifo" | "random"} order */ setExecutionOrder(order) { this.config.order = order; } }