1 package SL::Layout::Base;
 
   4 use parent qw(SL::Controller::Base);
 
   6 use List::MoreUtils qw(uniq);
 
   9 use Rose::Object::MakeMethods::Generic (
 
  10   'scalar --get_set_init' => [ qw(menu auto_reload_resources_param) ],
 
  11   'scalar'                => qw(focus),
 
  13     'add_stylesheets_inline' => { interface => 'add', hash_key => 'stylesheets_inline' },
 
  14     'add_javascripts_inline' => { interface => 'add', hash_key => 'javascripts_inline' },
 
  15     'sub_layouts',           => { interface => 'get_set_init' },
 
  16     'add_sub_layouts'        => { interface => 'add', hash_key => 'sub_layouts' },
 
  25   my ($class, @slurp) = @_;
 
  27   my $self = $class->SUPER::new(@slurp);
 
  31   Menu->new('menu.ini');
 
  34 sub init_auto_reload_resources_param {
 
  35   return '' unless $::lx_office_conf{debug}->{auto_reload_resources};
 
  36   return sprintf('?rand=%d-%d-%d', Time::HiRes::gettimeofday(), int(rand 1000000000000));
 
  39 ##########################################
 
  40 #  inheritable/overridable
 
  41 ##########################################
 
  44   join '', map { $_->pre_content } $_[0]->sub_layouts;
 
  48   join '', map { $_->start_content } $_[0]->sub_layouts;
 
  52   join '', map { $_->end_content } $_[0]->sub_layouts;
 
  56   join '', map { $_->post_content } $_[0]->sub_layouts;
 
  59 sub stylesheets_inline {
 
  60   uniq ( map { $_->stylesheets_inline } $_[0]->sub_layouts ),
 
  61   @{ $_[0]->{stylesheets_inline} || [] };
 
  64 sub javascripts_inline {
 
  65   uniq ( map { $_->javascripts_inline } $_[0]->sub_layouts ),
 
  66   @{ $_[0]->{javascripts_inline} || [] };
 
  69 sub init_sub_layouts { [] }
 
  72 #########################################
 
  74 ########################################
 
  82   push @{ $self->{stylesheets} ||= [] }, @_ if @_;
 
  83   @{ $self->{stylesheets} ||= [] };
 
  88   my $css_path = $self->get_stylesheet_for_user;
 
  90   return uniq grep { $_ } map { $self->_find_stylesheet($_, $css_path)  }
 
  91     $self->use_stylesheet, map { $_->stylesheets } $self->sub_layouts;
 
  94 sub _find_stylesheet {
 
  95   my ($self, $stylesheet, $css_path) = @_;
 
  97   return "$css_path/$stylesheet" if -f "$css_path/$stylesheet";
 
  98   return "css/$stylesheet"       if -f "css/$stylesheet";
 
  99   return $stylesheet             if -f $stylesheet;
 
 102 sub get_stylesheet_for_user {
 
 103   my $css_path = 'css';
 
 104   if (my $user_style = $::myconfig{stylesheet}) {
 
 105     $user_style =~ s/\.css$//; # nuke trailing .css, this is a remnand of pre 2.7.0 stylesheet handling
 
 106     if (-d "$css_path/$user_style" &&
 
 107         -f "$css_path/$user_style/main.css") {
 
 108       $css_path = "$css_path/$user_style";
 
 110       $css_path = "$css_path/kivitendo";
 
 113     $css_path = "$css_path/kivitendo";
 
 115   $::myconfig{css_path} = $css_path; # needed for menunew, FIXME: don't do this here
 
 120 sub add_javascripts {
 
 126   push @{ $self->{javascripts} ||= [] }, @_ if @_;
 
 127   @{ $self->{javascripts} ||= [] };
 
 133   return uniq grep { $_ } map { $self->_find_javascript($_)  }
 
 134     map({ $_->javascripts } $self->sub_layouts), $self->use_javascript;
 
 137 sub _find_javascript {
 
 138   my ($self, $javascript) = @_;
 
 140   return "js/$javascript"        if -f "js/$javascript";
 
 141   return $javascript             if -f $javascript;
 
 145 ############################################
 
 146 # track state of form header
 
 147 ############################################
 
 150   $_[0]{_header_done} = 1;