source: tailbone/tailbone/templates/themes/bobcat/base.mako @ 75bddc8

Last change on this file since 75bddc8 was 75bddc8, checked in by Lance Edgar <ledgar@…>, 12 months ago

Use configured background color for 'bobcat' theme

  • Property mode set to 100644
File size: 10.4 KB
Line 
1## -*- coding: utf-8; -*-
2<%namespace file="/grids/nav.mako" import="grid_index_nav" />
3<%namespace file="/feedback_dialog.mako" import="feedback_dialog" />
4<%namespace name="base_meta" file="/base_meta.mako" />
5<!DOCTYPE html>
6<html lang="en">
7  <head>
8    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
9    <title>${base_meta.global_title()} &raquo; ${capture(self.title)|n}</title>
10    ${base_meta.favicon()}
11    ${self.header_core()}
12
13    % if background_color:
14        <style type="text/css">
15          body { background-color: ${background_color}; }
16        </style>
17    % endif
18
19    % if not request.rattail_config.production():
20        <style type="text/css">
21          body { background-image: url(${request.static_url('tailbone:static/img/testing.png')}); }
22        </style>
23    % endif
24
25    ${self.head_tags()}
26  </head>
27
28  <body>
29    <header>
30
31      <nav class="navbar" role="navigation" aria-label="main navigation">
32        <div class="navbar-menu">
33          <div class="navbar-start">
34
35            % for topitem in menus:
36                % if topitem.is_link:
37                    ${h.link_to(topitem.title, topitem.url, target=topitem.target, class_='navbar-item')}
38                % else:
39                    <div class="navbar-item has-dropdown is-hoverable">
40                      <a class="navbar-link">${topitem.title}</a>
41                      <div class="navbar-dropdown">
42                        % for subitem in topitem.items:
43                            % if subitem.is_sep:
44                                <hr class="navbar-divider">
45                            % else:
46                                ${h.link_to(subitem.title, subitem.url, class_='navbar-item', target=subitem.target)}
47                            % endif
48                        % endfor
49                      </div>
50                    </div>
51                % endif
52            % endfor
53
54          </div><!-- navbar-start -->
55          <div class="navbar-end">
56
57            ## User Menu
58            % if request.user:
59                <div class="navbar-item has-dropdown is-hoverable">
60                  % if messaging_enabled:
61                      <a class="navbar-link ${'root-user' if request.is_root else ''}">${request.user}${" ({})".format(inbox_count) if inbox_count else ''}</a>
62                  % else:
63                      <a class="navbar-link ${'root-user' if request.is_root else ''}">${request.user}</a>
64                  % endif
65                  <div class="navbar-dropdown">
66                    % if request.is_root:
67                        ${h.link_to("Stop being root", url('stop_root'), class_='navbar-item root-user')}
68                    % elif request.is_admin:
69                        ${h.link_to("Become root", url('become_root'), class_='navbar-item root-user')}
70                    % endif
71                    % if messaging_enabled:
72                        ${h.link_to("Messages{}".format(" ({})".format(inbox_count) if inbox_count else ''), url('messages.inbox'), class_='navbar-item')}
73                    % endif
74                    ${h.link_to("Change Password", url('change_password'), class_='navbar-item')}
75                    ${h.link_to("Logout", url('logout'), class_='navbar-item')}
76                  </div>
77                </div>
78            % else:
79                ${h.link_to("Login", url('login'), class_='navbar-item')}
80            % endif
81
82          </div><!-- navbar-end -->
83        </div>
84      </nav>
85
86      <nav class="level">
87        <div class="level-left">
88
89          ## App Logo / Name
90          <div class="level-item">
91            <a class="home" href="${url('home')}">
92              <div id="header-logo">${base_meta.header_logo()}</div>
93              <span class="global-title">${base_meta.global_title()}</span>
94            </a>
95          </div>
96
97          ## Current Context
98          <div id="current-context" class="level-item">
99            % if master:
100                <span>&raquo;</span>
101                % if master.listing:
102                    <span>${index_title}</span>
103                % else:
104                    ${h.link_to(index_title, index_url)}
105                    % if parent_url is not Undefined:
106                        <span>&raquo;</span>
107                        ${h.link_to(parent_title, parent_url)}
108                    % elif instance_url is not Undefined:
109                        <span>&raquo;</span>
110                        ${h.link_to(instance_title, instance_url)}
111                    % endif
112                    % if master.viewing and grid_index:
113                        ${grid_index_nav()}
114                    % endif
115                % endif
116            % elif index_title:
117                <span>&raquo;</span>
118                <span>${index_title}</span>
119            % endif
120          </div>
121
122        </div><!-- level-left -->
123        <div class="level-right">
124
125          ## Theme Picker
126          % if expose_theme_picker and request.has_perm('common.change_app_theme'):
127              <div class="level-item">
128                ${h.form(url('change_theme'), method="post")}
129                ${h.csrf_token(request)}
130                Theme:
131                <div class="theme-picker">
132                  <div class="select">
133                    ${h.select('theme', theme, options=theme_picker_options, id='theme-picker')}
134                  </div>
135                </div>
136                ${h.end_form()}
137              </div>
138          % endif
139
140          ## Help Button
141          % if help_url is not Undefined and help_url:
142              <div class="level-item">
143                ${h.link_to("Help", help_url, target='_blank', class_='button')}
144              </div>
145          % endif
146
147          ## Feedback Button
148          <div class="level-item">
149            <button type="button" class="button is-primary" id="feedback">Feedback</button>
150          </div>
151
152        </div><!-- level-right -->
153      </nav><!-- level -->
154    </header>
155
156    ## Page Title
157    <section id="content-title" class="hero is-primary">
158      <div class="container">
159        ${self.content_title()}
160      </div>
161    </section>
162
163    ## Page Body
164    <section id="page-body">
165
166      % if request.session.peek_flash('error'):
167          % for error in request.session.pop_flash('error'):
168              <div class="notification is-warning">
169                <!-- <button class="delete"></button> -->
170                ${error}
171              </div>
172          % endfor
173      % endif
174
175      % if request.session.peek_flash():
176          % for msg in request.session.pop_flash():
177              <div class="notification is-info">
178                <!-- <button class="delete"></button> -->
179                ${msg}
180              </div>
181          % endfor
182      % endif
183
184      ${self.body()}
185    </section>
186
187    ## Feedback Dialog
188    ${feedback_dialog()}
189
190    ## Footer
191    <footer class="footer">
192      <div class="content">
193        ${base_meta.footer()}
194      </div>
195    </footer>
196
197  </body>
198</html>
199
200<%def name="title()"></%def>
201
202<%def name="content_title()">
203  <h1 class="title">${self.title()}</h1>
204</%def>
205
206<%def name="header_core()">
207
208  ${self.core_javascript()}
209  ${self.extra_javascript()}
210  ${self.core_styles()}
211  ${self.extra_styles()}
212
213  ## TODO: should this be elsewhere / more customizable?
214  % if dform is not Undefined:
215      <% resources = dform.get_widget_resources() %>
216      % for path in resources['js']:
217          ${h.javascript_link(request.static_url(path))}
218      % endfor
219      % for path in resources['css']:
220          ${h.stylesheet_link(request.static_url(path))}
221      % endfor
222  % endif
223</%def>
224
225<%def name="core_javascript()">
226  ${self.jquery()}
227  ${h.javascript_link(request.static_url('tailbone:static/js/lib/jquery.loadmask.min.js'))}
228  ${h.javascript_link(request.static_url('tailbone:static/js/lib/jquery.ui.timepicker.js'))}
229  <script type="text/javascript">
230    var session_timeout = ${request.get_session_timeout() or 'null'};
231    var logout_url = '${request.route_url('logout')}';
232    var noop_url = '${request.route_url('noop')}';
233    % if expose_theme_picker and request.has_perm('common.change_app_theme'):
234        $(function() {
235            $('#theme-picker').change(function() {
236                $(this).parents('form:first').submit();
237            });
238        });
239    % endif
240  </script>
241  ${h.javascript_link(request.static_url('tailbone:static/js/tailbone.js') + '?ver={}'.format(tailbone.__version__))}
242  ${h.javascript_link(request.static_url('tailbone:static/js/tailbone.feedback.js') + '?ver={}'.format(tailbone.__version__))}
243  ${h.javascript_link(request.static_url('tailbone:static/js/jquery.ui.tailbone.js') + '?ver={}'.format(tailbone.__version__))}
244</%def>
245
246<%def name="jquery()">
247  ${h.javascript_link('https://code.jquery.com/jquery-1.12.4.min.js')}
248  ${h.javascript_link('https://code.jquery.com/ui/{}/jquery-ui.min.js'.format(request.rattail_config.get('tailbone', 'jquery_ui.version', default='1.11.4')))}
249</%def>
250
251<%def name="extra_javascript()"></%def>
252
253<%def name="core_styles()">
254
255  ${h.stylesheet_link('https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css')}
256
257  ${self.jquery_theme()}
258  ${h.stylesheet_link(request.static_url('tailbone:static/css/jquery.loadmask.css'))}
259  ${h.stylesheet_link(request.static_url('tailbone:static/css/jquery.ui.timepicker.css'))}
260  ${h.stylesheet_link(request.static_url('tailbone:static/css/jquery.ui.tailbone.css') + '?ver={}'.format(tailbone.__version__))}
261
262  ${h.stylesheet_link(request.static_url('tailbone:static/themes/bobcat/css/base.css') + '?ver={}'.format(tailbone.__version__))}
263  ${h.stylesheet_link(request.static_url('tailbone:static/themes/bobcat/css/layout.css') + '?ver={}'.format(tailbone.__version__))}
264  ${h.stylesheet_link(request.static_url('tailbone:static/css/grids.css') + '?ver={}'.format(tailbone.__version__))}
265  ${h.stylesheet_link(request.static_url('tailbone:static/css/filters.css') + '?ver={}'.format(tailbone.__version__))}
266  ${h.stylesheet_link(request.static_url('tailbone:static/themes/bobcat/css/forms.css') + '?ver={}'.format(tailbone.__version__))}
267  ${h.stylesheet_link(request.static_url('tailbone:static/css/diffs.css') + '?ver={}'.format(tailbone.__version__))}
268</%def>
269
270<%def name="jquery_theme()">
271  ${h.stylesheet_link('https://code.jquery.com/ui/1.11.4/themes/dark-hive/jquery-ui.css')}
272</%def>
273
274<%def name="extra_styles()"></%def>
275
276<%def name="head_tags()"></%def>
277
278<%def name="wtfield(form, name, **kwargs)">
279  <div class="field-wrapper${' error' if form[name].errors else ''}">
280    <label for="${name}">${form[name].label}</label>
281    <div class="field">
282      ${form[name](**kwargs)}
283    </div>
284  </div>
285</%def>
Note: See TracBrowser for help on using the repository browser.