Layout package names refactored
[kivitendo-erp.git] / SL / Layout / Base.pm
1 package SL::Layout::Base;
2
3 use strict;
4 use parent qw(SL::Controller::Base);
5
6 use Rose::Object::MakeMethods::Generic (
7   'scalar --get_set_init' => qw(menu),
8   'scalar'                => qw(focus),
9   'array'                 => [
10     'add_stylesheets_inline' => { interface => 'add', hash_key => 'stylesheets_inline' },
11     'add_javascripts_inline' => { interface => 'add', hash_key => 'javascripts_inline' },
12     'sub_layouts',
13     'add_sub_layouts'         => { interface => 'add', hash_key => 'sub_layouts' },
14   ],
15 );
16
17 use SL::Menu;
18
19 my %menu_cache;
20
21 sub new {
22   my ($class, @slurp) = @_;
23
24   my $self = $class->SUPER::new(@slurp);
25 }
26
27 sub init_menu {
28   Menu->new('menu.ini');
29 }
30
31 ##########################################
32 #  inheritable/overridable
33 ##########################################
34
35 sub pre_content {
36   join '', map { $_->pre_content } $_[0]->sub_layouts;
37 }
38
39 sub start_content {
40   join '', map { $_->start_content } $_[0]->sub_layouts;
41 }
42
43 sub end_content {
44   join '', map { $_->end_content } $_[0]->sub_layouts;
45 }
46
47 sub post_content {
48   join '', map { $_->post_content } $_[0]->sub_layouts;
49 }
50
51 sub stylesheets_inline {
52   ( map { $_->stylesheets_inline } $_[0]->sub_layouts ),
53   @{ $_[0]->{stylesheets_inline} || [] };
54 }
55
56 sub javascripts_inline {
57   ( map { $_->javascripts_inline } $_[0]->sub_layouts ),
58   @{ $_[0]->{javascripts_inline} || [] };
59 }
60
61
62 #########################################
63 # Interface
64 ########################################
65
66 sub use_stylesheet {
67   my $self = shift;
68   push @{ $self->{stylesheets} ||= [] }, @_ if @_;
69   @{ $self->{stylesheets} ||= [] };
70 }
71
72 sub stylesheets {
73   my ($self) = @_;
74   my $css_path = $self->get_stylesheet_for_user;
75
76   return grep { $_ } map { $self->_find_stylesheet($_, $css_path)  }
77     $self->use_stylesheet, map { $_->stylesheets } $self->sub_layouts;
78 }
79
80 sub _find_stylesheet {
81   my ($self, $stylesheet, $css_path) = @_;
82
83   return "$css_path/$stylesheet" if -f "$css_path/$stylesheet";
84   return "css/$stylesheet"       if -f "css/$stylesheet";
85   return $stylesheet             if -f $stylesheet;
86 }
87
88 sub get_stylesheet_for_user {
89   my $css_path = 'css';
90   if (my $user_style = $::myconfig{stylesheet}) {
91     $user_style =~ s/\.css$//; # nuke trailing .css, this is a remnand of pre 2.7.0 stylesheet handling
92     if (-d "$css_path/$user_style" &&
93         -f "$css_path/$user_style/main.css") {
94       $css_path = "$css_path/$user_style";
95     } else {
96       $css_path = "$css_path/lx-office-erp";
97     }
98   } else {
99     $css_path = "$css_path/lx-office-erp";
100   }
101   $::myconfig{css_path} = $css_path; # needed for menunew, FIXME: don't do this here
102
103   return $css_path;
104 }
105
106
107 sub use_javascript {
108   my $self = shift;
109   push @{ $self->{javascripts} ||= [] }, @_ if @_;
110   @{ $self->{javascripts} ||= [] };
111 }
112
113 sub javascripts {
114   my ($self) = @_;
115
116   return map { $self->_find_javascript($_)  }
117     $self->use_javascript, map { $_->javascripts } $self->sub_layouts;
118 }
119
120 sub _find_javascript {
121   my ($self, $javascript) = @_;
122
123   return "js/$javascript"        if -f "js/$javascript";
124   return $javascript             if -f $javascript;
125 }
126
127
128 ############################################
129 # track state of form header
130 ############################################
131
132 sub header_done {
133   $_[0]{_header_done} = 1;
134 }
135
136 sub need_footer {
137   $_[0]{_header_done};
138 }
139
140 1;