X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FMenu.pm;h=42b08de48004d2fd4d6604351764930708c402ae;hb=c301c2b3be223fe384bea2d899c6a08de54c21de;hp=b91611242ff4c889791dcacaa72a8ab8bed47c67;hpb=02497699124fa6a3bd1a76104a3c39a5131ab981;p=kivitendo-erp.git diff --git a/SL/Menu.pm b/SL/Menu.pm index b91611242..42b08de48 100644 --- a/SL/Menu.pm +++ b/SL/Menu.pm @@ -73,6 +73,8 @@ sub _merge { for my $node (@$data) { my $id = $node->{id}; + die "menu: node with name '$node->{name}' does not have an id" if !$id; + my $merge_to = $by_id->{$id}; if (!$merge_to) { @@ -117,6 +119,19 @@ sub build_tree { push @{ $by_parent{ $node->{parent} // '' } //= [] }, $node; } + # autovivify order in by_parent, so that numerical sorting for entries without order + # preserves their order and position with respect to entries with order. + for (values %by_parent) { + my $last_order = 0; + for my $node (@$_) { + if (defined $node->{order} && $node->{order} * 1) { + $last_order = $node->{order}; + } else { + $node->{order} = ++$last_order; + } + } + } + my $tree = { }; $self->{by_id}{''} = $tree; @@ -165,7 +180,7 @@ sub parse_access_string { my $access = $node->{access}; - while ($access =~ m/^([a-z_\/]+|\||\&|\(|\)|\s+)/) { + while ($access =~ m/^([a-z_\/]+|\!|\||\&|\(|\)|\s+)/) { my $token = $1; substr($access, 0, length($1)) = ""; @@ -184,7 +199,7 @@ sub parse_access_string { } $cur_ary = $stack[-1]; - } elsif (($token eq "|") || ($token eq "&")) { + } elsif (($token eq "|") || ($token eq "&") || ($token eq "!")) { push @{$cur_ary}, $token; } else { @@ -258,4 +273,3 @@ sub set_access { } 1; -