X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=inline;f=SL%2FLayout%2FActionBar.pm;h=25a62ccbec2f6e0594616cfeb9bd1072e46ccf02;hb=a6ce2c7f3f7ae10f7065fb86121c8d11049617ee;hp=3d9e4093a5a115e6baf9077023fb7956fcf33042;hpb=ccf94c5dca76b164beeba398d4c493018a9b535b;p=kivitendo-erp.git diff --git a/SL/Layout/ActionBar.pm b/SL/Layout/ActionBar.pm index 3d9e4093a..25a62ccbe 100644 --- a/SL/Layout/ActionBar.pm +++ b/SL/Layout/ActionBar.pm @@ -3,40 +3,77 @@ package SL::Layout::ActionBar; use strict; use parent qw(SL::Layout::Base); +use Carp; +use Scalar::Util qw(blessed); +use SL::Layout::ActionBar::Action; +use SL::Layout::ActionBar::ComboBox; +use SL::Layout::ActionBar::Link; +use SL::Layout::ActionBar::Separator; + use constant HTML_CLASS => 'layout-actionbar'; use Rose::Object::MakeMethods::Generic ( 'scalar --get_set_init' => [ qw(actions) ], ); +my %class_descriptors = ( + action => { class => 'SL::Layout::ActionBar::Action', num_params => 1, }, + combobox => { class => 'SL::Layout::ActionBar::ComboBox', num_params => 1, }, + link => { class => 'SL::Layout::ActionBar::Link', num_params => 1, }, + separator => { class => 'SL::Layout::ActionBar::Separator', num_params => 0, }, +); ###### Layout overrides sub pre_content { - $::request->presenter->html_tag('div', '', class => HTML_CLASS); + my ($self) = @_; + + my $content = join '', map { $_->render } @{ $self->actions }; + return if !$content; + $::request->presenter->html_tag('div', $content, class => HTML_CLASS); } -sub inline_javascript { - # data for bar +sub javascripts_inline { + join '', map { $_->script } @{ $_[0]->actions }; } sub javascripts { - + 'kivi.ActionBar.js' } ###### interface -sub add_actions { +sub add { my ($self, @actions) = @_; - push @{ $self->actions }, @actions; -} -sub init_actions { - [] + push @{ $self->actions }, $self->parse_actions(@actions); + + return $self->actions->[-1]; } +sub parse_actions { + my ($self_or_class, @actions) = @_; + + my @parsed; + + while (my $type = shift(@actions)) { + if (blessed($type) && $type->isa('SL::Layout::ActionBar::Action')) { + push @parsed, $type; + continue; + } + my $descriptor = $class_descriptors{lc $type} || croak("Unknown action type '${type}'"); + my @params = splice(@actions, 0, $descriptor->{num_params}); + push @parsed, $descriptor->{class}->from_params(@params); + } + + return @parsed; +} + +sub init_actions { + [] +} 1; @@ -78,22 +115,15 @@ Arrangement utility =over 4 -=item C - -Dispatches each each argument to C - -=item C - - -=item C +=item C -=item Clayout->actionbar + $::request->layout->get('actionbar') =head1 DOM MODEL