use strict;
use parent qw(SL::Layout::Base);
-use URI;
-
use List::MoreUtils qw(apply);
+use SL::JSON qw(to_json);
+use URI;
-sub stylesheets {
- qw(css/icons16.css css/icons24.css)
+sub static_stylesheets {
+ qw(icons16.css icons24.css menu.css)
}
sub javascripts_inline {
- my $self = shift;
- my $sections = [ section_menu($self->menu) ];
- $self->render('menu/menu', { partial => 1, no_output => 1 },
- sections => $sections,
- )
-}
-
-sub pre_content {
- "<div id='html-menu'></div>\n";
+ "\$(function(){kivi.LeftMenu.init(@{[ to_json([ section_menu($_[0]->menu) ]) ]})});"
}
-sub start_content {
- "<div id='content' class='html-menu'>\n";
+sub static_javascripts {
+ qw(
+ js/jquery.cookie.js
+ js/kivi.LeftMenu.js
+ );
}
-sub end_content {
- "</div>\n";
+sub pre_content {
+ "<div id='html-menu'></div>\n";
}
sub section_menu {
- $::lxdebug->enter_sub(2);
- my ($menu, $level, $id_prefix) = @_;
- my @menuorder = $menu->access_control(\%::myconfig, $level);
+ my ($menu) = @_;
my @items;
+ my @id_stack = (-1);
- my $id = 0;
-
- for my $item (@menuorder) {
- my $menuitem = $menu->{$item};
- my $olabel = apply { s/.*--// } $item;
- my $ml = apply { s/--.*// } $item;
- my $icon_class = apply { y/ /-/ } $item;
- my $spacer = "s" . (0 + $item =~ s/--/--/g);
+ for my $node ($menu->tree_walk) {
+ my $level = $node->{level};
- next if $level && $item ne "$level--$olabel";
+ # do id stack
+ push @id_stack, -1 if $level > $#id_stack;
+ pop @id_stack while $level < $#id_stack;
+ $id_stack[-1]++;
- my $label = $::locale->text($olabel);
+ my $label = $::locale->text($node->{name});
+ my $href = $menu->href_for_node($node);
- $menuitem->{module} ||= $::form->{script};
- $menuitem->{action} ||= "section_menu";
- $menuitem->{href} ||= "$menuitem->{module}?action=$menuitem->{action}";
+ my @common_args = ($label, "s" . $level, join '_', @id_stack);
- # add other params
- foreach my $key (keys %$menuitem) {
- next if $key =~ /target|module|action|href/;
- $menuitem->{href} .= "&" . $::form->escape($key, 1) . "=";
- my ($value, $conf) = split(/=/, $menuitem->{$key}, 2);
- $value = $::myconfig{$value} . "/$conf" if ($conf);
- $menuitem->{href} .= $::form->escape($value, 1);
- }
-
- my $anchor = $menuitem->{href};
-
- my @common_args = ($label, $spacer, "$id_prefix\_$id");
-
- if (!$level) { # toplevel
- push @items, [ @common_args, "icon24 $icon_class", 'm' ];
- # make_image(size => 24, label => $item),
- push @items, section_menu($menu, $item, "$id_prefix\_$id");
- } elsif ($menuitem->{submenu}) {
+ if (!$node->{parent}) { # toplevel
+ push @items, [ @common_args, "icon24 $node->{icon}", 'm' ];
+ } elsif ($node->{children}) {
push @items, [ @common_args, "icon16 submenu", 'sm' ];
- #make_image(label => 'submenu'),
- push @items, section_menu($menu, $item, "$id_prefix\_$id");
- } elsif ($menuitem->{module}) {
- push @items, [ @common_args, "icon16 $icon_class", 'i', $anchor ];
- #make_image(size => 16, label => $item),
+ } else {
+ push @items, [ @common_args, "icon16 $node->{icon}", 'i', $href, $node->{target} ];
}
- } continue {
- $id++;
}
- $::lxdebug->leave_sub(2);
return @items;
}
}
1;
+
+__END__
+
+=encoding utf-8
+
+=head1 NAME
+
+SL::Layout::MenuLeft - ex html meanu, now only left menu
+
+=head1 DOM MODEL
+
+Data will be embedded into the page as a json array of entries.
+Each entry is another array with the following fields:
+
+ 0: title
+ 1: indentation classes
+ 2: unique id
+ 3: icon classes
+ 4: role classes
+ 5: href
+ 6: target
+
+From each entry the following dom will be generated, with [0] being entry 0 of
+the data array:
+
+ <div id="mi[2]" class="mi [4] [1]">
+ <a class="ml">
+ <span class="mii ms">
+ <div class="[3]"></div>
+ </span>
+ <span class="mic">[0]</span>
+ </a>
+ </div>
+
+The classes are minified to keep the json somewhat in check, their meaning is as follows:
+
+=over 4
+
+=item Indentation Classes
+
+ s0: No indentation
+ s1: One level of indentation
+ s2: Two levels of indentation
+
+=item Icon Classes
+
+Each icon consists of two classes, one for the icon, and one for the size.
+The icon classes are taken from the file names, for example C<Master-Data> is
+the icon for master data, and refers to Master-Icon.png.
+
+ icon16: 16x16 icon
+ icon24: 24x24 icon
+ icon32: 32x32 icon
+
+=item Role Classes
+
+Role classes may be used to style types of links differently. Currently used:
+
+ ml: menu link, any <a> tag will have this
+ mi: menu item, the enclosing div for each entry has this
+ mii: menu item icon, the enclosing div for the icons has this
+ ms: menu spacer, the first <span> in the link will have this
+ m: menu, only top level entries have this
+ i: item, only leaf entries have this
+ sm: sub menu, eveything that is not top nor leaf has this
+ mic: menu item content, the span with the human readable description has this
+
+=back
+
+=head1 BUGS
+
+none yet
+
+=head1 AUTHOR
+
+Sven Schoeling E<lt>s.schoeling@linet-services.deE<gt>
+
+=cut