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:
parent
2e36e09303
commit
2509b5984d
1 changed files with 31 additions and 30 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue