diff --git a/django/website/tabbed_page/tab_pool.py b/django/website/tabbed_page/tab_pool.py index f3aa1ee98c86eb18852e9dd1ee12d4cf843b7a11..cf8e2c7f826b14c50c8323f8f1a05a823635a3f5 100644 --- a/django/website/tabbed_page/tab_pool.py +++ b/django/website/tabbed_page/tab_pool.py @@ -24,3 +24,26 @@ def clear_tabs(): global _pool _pool = {} + + +class BasicHtmlTab(object): + """ A simple tab to display html + + Settings: + title: The title of the tab + (in the header, not in + the tab) + body: The tab html + """ + template_name = 'tabbed_page/basic_html_tab.html' + + def get_context_data(self, **kwargs): + title = kwargs.get('title', '(no title)') + body = kwargs.get('body', '(no body)') + return { + 'title': title, + 'body': body + } + + +register_tab('basic-html-tab', BasicHtmlTab()) diff --git a/django/website/tabbed_page/templates/tabbed_page/basic_html_tab.html b/django/website/tabbed_page/templates/tabbed_page/basic_html_tab.html new file mode 100644 index 0000000000000000000000000000000000000000..c9542322538a214cbd945aa3642e929e4a918a49 --- /dev/null +++ b/django/website/tabbed_page/templates/tabbed_page/basic_html_tab.html @@ -0,0 +1,12 @@ +{% load i18n %} +<div class="panel panel-default"> + <div class="panel-heading container-fluid"> + <div class="col-sm-5 col-xs-12"> + <span class="fa fa-align-justify fa-fw"></span> + {% trans title %} + </div> + </div> + <div class="panel-body"> + {{ body|safe }} + </div> +</div> diff --git a/django/website/tabbed_page/templates/tabbed_page/tabbed_page.html b/django/website/tabbed_page/templates/tabbed_page/tabbed_page.html index 0e67aa8d761c1c8d02679a327385f83b9419eb99..a7c0781ed007a6917229ca2d691946baddbb716a 100644 --- a/django/website/tabbed_page/templates/tabbed_page/tabbed_page.html +++ b/django/website/tabbed_page/templates/tabbed_page/tabbed_page.html @@ -1,15 +1,27 @@ {% extends "base_side.html" %} {% load i18n %} -{% load bootstrap3 %} -{% load render_widget %} +{% load render_tab %} {% block maincontent %} - <h1 class="page-header"><span class="fa fa-tabbed-page fa-fw"></span>{% trans "Tabbed Page" %}</h1> - <h2>Page = {{ view.page }}</h2> +<div class="row"> + <div class="col-xs-12"> + <h1 class="page-header header-tabs"><span class="fa fa-pencil fa-fw"></span>{% trans "View & Edit" %}</h1> + <ul class="nav nav-tabs pull-right" role="tablist"> + {% for tab in view.tabs %} + <li role="presentation" + {% if tab == view.active_tab %}class="active"{% endif %}> + <a href="#" aria-controls="..." role="tab" data-toggle="tab"> + {% trans tab.label %} + </a> + </li> + {% endfor %} + </ul> + </div> +</div> - <ul> - {% for tab in view.tabs %} - <li>{{ tab }}</li> - {% endfor %} - </ul> +<div class='row'> + <div class="col-lg-12"> + {{ view.active_tab|render_tab }} + </div> +</div> {% endblock maincontent %} diff --git a/django/website/tabbed_page/urls.py b/django/website/tabbed_page/urls.py index 58eae80928ebd4202d6b541b7947b1fc018406d9..883261c485a4faa128e917ba9efdfe3899445f18 100644 --- a/django/website/tabbed_page/urls.py +++ b/django/website/tabbed_page/urls.py @@ -4,7 +4,9 @@ from django.contrib.auth.decorators import login_required from .views import TabbedPageView urlpatterns = [ - url(r'^(?P<name>[^/]*)(/(?P<tab_name>.*))?$', - TabbedPageView.as_view(), + url(r'^/$', login_required(TabbedPageView.as_view())), + url(r'^(?P<name>\w+)/$', login_required(TabbedPageView.as_view())), + url(r'^(?P<name>\w+)/(?P<tab_name>\w+)/$', + login_required(TabbedPageView.as_view()), name='tabbed-page') ] diff --git a/django/website/tabbed_page/views.py b/django/website/tabbed_page/views.py index ffb1e34649bcd0eebc4588c833ff0838f12451d2..b6ba7901d929042f9b57dcf9763e9f8334463c40 100644 --- a/django/website/tabbed_page/views.py +++ b/django/website/tabbed_page/views.py @@ -6,6 +6,7 @@ from .models import TabbedPage class TabbedPageView(TemplateView): template_name = "tabbed_page/tabbed_page.html" _page = None + _active_tab = None @property def tabs(self): @@ -24,3 +25,18 @@ class TabbedPageView(TemplateView): self._page = TabbedPage.objects.get(name=name) return self._page + + @property + def active_tab(self): + if self._active_tab is None: + candidates = [] + tab_name = self.kwargs.get('tab_name') + if tab_name: + candidates = self.page.tabs.all().filter(name=tab_name) + if len(candidates) == 0: + candidates = self.page.tabs.all().filter(default=True) + if len(candidates) == 0: + candidates = self.page.tabs.all() + if len(candidates) > 0: + self._active_tab = candidates[0] + return self._active_tab