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