blob: e3dde77d0477a68cefa57db4ec5ddbd54344a63a [file] [log] [blame]
class Heading extends ComponentBase {
constructor()
{
super('page-heading');
this._title = '';
this._pageGroups = [];
this._renderedCurrentPage = null;
this._toolbar = null;
this._toolbarChanged = false;
this._router = null;
}
title() { return this._title; }
setTitle(title) { this._title = title; }
addPageGroup(group)
{
for (var page of group)
page.setHeading(this);
this._pageGroups.push(group);
}
setToolbar(toolbar)
{
console.assert(!toolbar || toolbar instanceof Toolbar);
this._toolbar = toolbar;
if (toolbar)
toolbar.setRouter(this._router);
this._toolbarChanged = true;
}
setRouter(router)
{
this._router = router;
if (this._toolbar)
this._toolbar.setRouter(router);
}
render()
{
console.assert(this._router);
super.render();
if (this._toolbarChanged) {
this.renderReplace(this.content().querySelector('.heading-toolbar'),
this._toolbar ? this._toolbar.element() : null);
this._toolbarChanged = false;
}
if (this._toolbar)
this._toolbar.enqueueToRender();
var currentPage = this._router.currentPage();
if (this._renderedCurrentPage == currentPage)
return;
this._renderedCurrentPage = currentPage;
var title = this.content().querySelector('.heading-title a');
title.textContent = this._title;
var element = ComponentBase.createElement;
var link = ComponentBase.createLink;
var router = this._router;
this.renderReplace(this.content().querySelector('.heading-navigation-list'),
this._pageGroups.map(function (group) {
return element('ul', group.map(function (page) {
return element('li',
{ class: currentPage.belongsTo(page) ? 'selected' : '', },
link(page.name(), router.url(page.routeName(), page.serializeState())));
}));
}));
}
static htmlTemplate()
{
return `
<nav class="heading-navigation" role="navigation">
<h1 class="heading-title"><a href="#"></a></h1>
<div class="heading-navigation-list"></div>
<div class="heading-toolbar"></div>
</nav>
`;
}
static cssTemplate()
{
return `
.heading-navigation {
position: relative;
font-size: 1rem;
line-height: 1rem;
}
.heading-title {
position: relative;
z-index: 2;
margin: 0;
padding: 1rem;
border-bottom: solid 1px #ccc;
background: #fff;
color: #c93;
font-size: 1.5rem;
font-weight: inherit;
}
.heading-title a {
text-decoration: none;
color: inherit;
}
.heading-navigation-list {
display: block;
white-space: nowrap;
border-bottom: solid 1px #ccc;
text-align: center;
margin: 0;
margin-bottom: 1rem;
padding: 0;
padding-bottom: 0.3rem;
}
.heading-navigation-list ul {
display: inline;
margin: 0;
padding: 0;
margin-left: 1rem;
border-left: solid 1px #ccc;
padding-left: 1rem;
}
.heading-navigation-list ul:first-child {
border-left: none;
}
.heading-navigation-list li {
display: inline-block;
position: relative;
list-style: none;
margin: 0.3rem 0.5rem;
padding: 0;
}
.heading-navigation-list a {
text-decoration: none;
color: inherit;
color: #666;
}
.heading-navigation-list a:hover {
color: #369;
}
.heading-navigation-list li.selected a {
color: #000;
}
.heading-navigation-list li.selected a:before {
content: '';
display: block;
border: solid 5px #ccc;
border-color: transparent transparent #ccc transparent;
width: 0px;
height: 0px;
position: absolute;
left: 50%;
margin-left: -5px;
bottom: -0.55rem;
}
.heading-toolbar {
position: absolute;
right: 1rem;
top: 0.8rem;
z-index: 3;
}`;
}
}