97 lines
2.9 KiB
JavaScript
97 lines
2.9 KiB
JavaScript
/* global document */
|
|
import {
|
|
condition,
|
|
connector,
|
|
domainFromTree,
|
|
formatValue,
|
|
normalizeValue,
|
|
treeFromDomain,
|
|
} from "@web/core/tree_editor/condition_tree";
|
|
|
|
function addChild(parent, child) {
|
|
if (child.type === "connector" && !child.negate && child.value === parent.value) {
|
|
parent.children.push(...child.children);
|
|
} else {
|
|
parent.children.push(child);
|
|
}
|
|
}
|
|
|
|
export function removeDateRangeOperators(tree) {
|
|
if (tree.type === "complex_condition") {
|
|
return tree;
|
|
}
|
|
if (tree.type === "condition") {
|
|
if (!tree.operator.includes("daterange")) {
|
|
return tree;
|
|
}
|
|
const {negate, path, value} = tree;
|
|
return connector(
|
|
"&",
|
|
[condition(path, "<=", value[0]), condition(path, ">=", value[1])],
|
|
negate
|
|
);
|
|
}
|
|
const processedChildren = tree.children.map(removeDateRangeOperators);
|
|
if (tree.value === "|") {
|
|
return {...tree, children: processedChildren};
|
|
}
|
|
const newTree = {...tree, children: []};
|
|
// After processing a child might have become a connector "&" --> normalize
|
|
for (let i = 0; i < processedChildren.length; i++) {
|
|
addChild(newTree, processedChildren[i]);
|
|
}
|
|
return newTree;
|
|
}
|
|
|
|
function createDateRangeOperators(tree) {
|
|
if (["condition", "complex_condition"].includes(tree.type)) {
|
|
return tree;
|
|
}
|
|
const processedChildren = tree.children.map(createDateRangeOperators);
|
|
if (tree.value === "|") {
|
|
return {...tree, children: processedChildren};
|
|
}
|
|
const children = [];
|
|
let operator = "daterange";
|
|
if (document.getElementsByTagName("select").length) {
|
|
operator = document
|
|
.getElementsByTagName("select")[0]
|
|
.selectedOptions[0].value.replace(/^"|"$/g, "");
|
|
}
|
|
for (let i = 0; i < processedChildren.length; i++) {
|
|
const child1 = processedChildren[i];
|
|
const child2 = processedChildren[i + 1];
|
|
if (
|
|
child1.type === "condition" &&
|
|
child2 &&
|
|
child2.type === "condition" &&
|
|
formatValue(child1.path) === formatValue(child2.path) &&
|
|
child1.operator === "<=" &&
|
|
child2.operator === ">="
|
|
) {
|
|
children.push(
|
|
condition(
|
|
child1.path,
|
|
operator,
|
|
normalizeValue([child1.value, child2.value])
|
|
)
|
|
);
|
|
i += 1;
|
|
} else {
|
|
children.push(child1);
|
|
}
|
|
}
|
|
if (children.length === 1) {
|
|
return {...children[0]};
|
|
}
|
|
return {...tree, children};
|
|
}
|
|
|
|
export function domainFromTreeDateRange(tree) {
|
|
return domainFromTree(removeDateRangeOperators(tree));
|
|
}
|
|
|
|
export function treeFromDomainDateRange(domain, options = {}) {
|
|
return createDateRangeOperators(treeFromDomain(domain, options));
|
|
}
|