luci-base: dispatcher: use consistent ordering

Use the same ordering logic for building the dispatch tree and for
querying the children of a given node.

Fixes #2338.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2018-11-27 15:23:41 +01:00
parent 2e36e09303
commit 2509b5984d

View file

@ -40,6 +40,28 @@ function build_url(...)
return table.concat(url, "") return table.concat(url, "")
end end
function _ordered_children(node)
local name, child, children = nil, nil, {}
for name, child in pairs(node.nodes) do
children[#children+1] = {
name = name,
node = child,
order = child.order or 100
}
end
table.sort(children, function(a, b)
if a.order == b.order then
return a.name < b.name
else
return a.order < b.order
end
end)
return children
end
function node_visible(node) function node_visible(node)
if node then if node then
return not ( return not (
@ -55,15 +77,10 @@ end
function node_childs(node) function node_childs(node)
local rv = { } local rv = { }
if node then if node then
local k, v local _, child
for k, v in util.spairs(node.nodes, for _, child in ipairs(_ordered_children(node)) do
function(a, b) if node_visible(child.node) then
return (node.nodes[a].order or 100) rv[#rv+1] = child.name
< (node.nodes[b].order or 100)
end)
do
if node_visible(v) then
rv[#rv+1] = k
end end
end end
end end
@ -699,24 +716,7 @@ end
-- Subdispatchers -- -- Subdispatchers --
function _find_eligible_node(root, prefix, deep, types, descend) function _find_eligible_node(root, prefix, deep, types, descend)
local _, cur_name, cur_node local children = _ordered_children(root)
local childs = { }
for cur_name, cur_node in pairs(root.nodes) do
childs[#childs+1] = {
node = cur_node,
name = cur_name,
order = cur_node.order or 100
}
end
table.sort(childs, function(a, b)
if a.order == b.order then
return a.name < b.name
else
return a.order < b.order
end
end)
if not root.leaf and deep ~= nil then if not root.leaf and deep ~= nil then
local sub_path = { unpack(prefix) } local sub_path = { unpack(prefix) }
@ -725,10 +725,11 @@ function _find_eligible_node(root, prefix, deep, types, descend)
deep = nil deep = nil
end end
for _, cur_node in ipairs(childs) do local _, child
sub_path[#prefix+1] = cur_node.name for _, child in ipairs(children) do
sub_path[#prefix+1] = child.name
local res_path = _find_eligible_node(cur_node.node, sub_path, local res_path = _find_eligible_node(child.node, sub_path,
deep, types, true) deep, types, true)
if res_path then if res_path then