Fixing main navigation.
parent
a02b49b971
commit
d34a216207
|
@ -39,7 +39,60 @@ class MainTaigaController extends taiga.Controller
|
||||||
@scope.mainSection = name
|
@scope.mainSection = name
|
||||||
|
|
||||||
|
|
||||||
MainTaigaDirective = ($log) ->
|
MainTaigaDirective = ($log, $compile) ->
|
||||||
|
template = _.template("""
|
||||||
|
<h1 class="logo"><a href="" title="Home"><img src="/images/logo.png" alt="Taiga"/></a></h1>
|
||||||
|
<ul class="main-nav">
|
||||||
|
<li data-name="search">
|
||||||
|
<a href="" title="Search" tg-nav="project-search:project=project.slug">
|
||||||
|
<span class="icon icon-search"></span><span class="item">Search</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li data-name="backlog" tg-nav="project-backlog:project=project.slug">
|
||||||
|
<a href="" title="Backlog" class="active">
|
||||||
|
<span class="icon icon-backlog"></span>
|
||||||
|
<span class="item">Backlog</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li data-name="kanban">
|
||||||
|
<a href="" title="Kanban">
|
||||||
|
<span class="icon icon-kanban"></span><span class="item">Kanban</span></a></li>
|
||||||
|
<li data-name="issues">
|
||||||
|
<a href="" title="Issues" tg-nav="project-issues:project=project.slug">
|
||||||
|
<span class="icon icon-issues"></span><span class="item">Issues</span></a></li>
|
||||||
|
<li data-name="wiki">
|
||||||
|
<a href="" title="Wiki">
|
||||||
|
<span class="icon icon-wiki"></span>
|
||||||
|
<span class="item">Wiki</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li data-name="video">
|
||||||
|
<a href="" title="Video">
|
||||||
|
<span class="icon icon-video"></span>
|
||||||
|
<span class="item">Video</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="user">
|
||||||
|
<div class="user-settings">
|
||||||
|
<ul class="popover">
|
||||||
|
<li><a href="" title="Change profile photo">Change profile photo</a></li>
|
||||||
|
<li><a href="" title="Account settings">Account settings</a></li>
|
||||||
|
<li><a href="" title="Logout">Logout</a></li>
|
||||||
|
</ul>
|
||||||
|
<a href="" title="User preferences" class="avatar">
|
||||||
|
<img src="http://thecodeplayer.com/u/uifaces/12.jpg" alt="username"/>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="settings">
|
||||||
|
<a href="" title="User preferences">Pilar</a>
|
||||||
|
<a href="" title="Site preferences">
|
||||||
|
<span class="icon icon-settings"></span>
|
||||||
|
</a>
|
||||||
|
</div>""")
|
||||||
|
|
||||||
|
|
||||||
linkMainNav = ($scope, $el, $attrs, $ctrl) ->
|
linkMainNav = ($scope, $el, $attrs, $ctrl) ->
|
||||||
menuEntriesSelector = $el.find("ul.main-nav > li")
|
menuEntriesSelector = $el.find("ul.main-nav > li")
|
||||||
menuEntries = _.map(menuEntriesSelector, (x) -> angular.element(x))
|
menuEntries = _.map(menuEntriesSelector, (x) -> angular.element(x))
|
||||||
|
@ -47,7 +100,6 @@ MainTaigaDirective = ($log) ->
|
||||||
|
|
||||||
$scope.$watch "mainSection", (sectionName) ->
|
$scope.$watch "mainSection", (sectionName) ->
|
||||||
$el.find("ul.main-nav a.active").removeClass("active")
|
$el.find("ul.main-nav a.active").removeClass("active")
|
||||||
|
|
||||||
entry = menuEntriesByName[sectionName]
|
entry = menuEntriesByName[sectionName]
|
||||||
entry.find("> a").addClass("active")
|
entry.find("> a").addClass("active")
|
||||||
|
|
||||||
|
@ -55,6 +107,19 @@ MainTaigaDirective = ($log) ->
|
||||||
$log.debug "Taiga main directive initialized."
|
$log.debug "Taiga main directive initialized."
|
||||||
linkMainNav($scope, $el, $attrs, $ctrl)
|
linkMainNav($scope, $el, $attrs, $ctrl)
|
||||||
|
|
||||||
|
# WARNING: this code has traces of slighty hacky parts
|
||||||
|
# This rerenders and compiles the navigation when ng-view
|
||||||
|
# content loaded signal is raised using inner scope.
|
||||||
|
$scope.$on "$viewContentLoaded", ->
|
||||||
|
body = angular.element("body")
|
||||||
|
wScope = body.find(".wrapper").scope()
|
||||||
|
html = template({})
|
||||||
|
dom = $compile(html)(wScope)
|
||||||
|
|
||||||
|
menuDom = $el.find("nav.menu")
|
||||||
|
menuDom.empty()
|
||||||
|
menuDom.append(dom)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
controller: MainTaigaController
|
controller: MainTaigaController
|
||||||
link: link
|
link: link
|
||||||
|
@ -71,7 +136,7 @@ SectionMarkerDirective = ($log) ->
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
module.directive("tgMain", ["$log", MainTaigaDirective])
|
module.directive("tgMain", ["$log", "$compile", MainTaigaDirective])
|
||||||
module.directive("tgSectionMarker", ["$log", SectionMarkerDirective])
|
module.directive("tgSectionMarker", ["$log", SectionMarkerDirective])
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,26 +24,6 @@ taiga = @.taiga
|
||||||
trim = @.taiga.trim
|
trim = @.taiga.trim
|
||||||
bindOnce = @.taiga.bindOnce
|
bindOnce = @.taiga.bindOnce
|
||||||
|
|
||||||
parseNav = (data, scope) ->
|
|
||||||
options = {}
|
|
||||||
|
|
||||||
[name, params] = _.map(data.split(":"), trim)
|
|
||||||
params = _.map(params.split(","), trim)
|
|
||||||
|
|
||||||
for item in params
|
|
||||||
[key, value] = _.map(item.split("="), trim)
|
|
||||||
options[key] = scope.$eval(value)
|
|
||||||
|
|
||||||
return [name, options]
|
|
||||||
|
|
||||||
|
|
||||||
formatUrl = (url, ctx={}) ->
|
|
||||||
replacer = (match) ->
|
|
||||||
match = trim(match, ":")
|
|
||||||
return ctx[match] or "undefined"
|
|
||||||
return url.replace(/(:\w+)/g, replacer)
|
|
||||||
|
|
||||||
|
|
||||||
class NavigationUrlsService extends taiga.Service
|
class NavigationUrlsService extends taiga.Service
|
||||||
constructor: ->
|
constructor: ->
|
||||||
@.urls = {}
|
@.urls = {}
|
||||||
|
@ -59,27 +39,43 @@ NavigationUrlsDirective = ($navurls, $auth, $q) ->
|
||||||
# Example:
|
# Example:
|
||||||
# link(tg-nav="project-backlog:project='sss',")
|
# link(tg-nav="project-backlog:project='sss',")
|
||||||
|
|
||||||
|
# bindOnce version that uses $q for offer
|
||||||
|
# promise based api
|
||||||
|
bindOnceP = ($scope, attr) ->
|
||||||
|
defered = $q.defer()
|
||||||
|
bindOnce $scope, attr, (v) ->
|
||||||
|
defered.resolve(v)
|
||||||
|
return defered.promise
|
||||||
|
|
||||||
# TODO: almost all menu entries requires project
|
parseNav = (data, $scope) ->
|
||||||
# model available in scope, but project is only
|
[name, params] = _.map(data.split(":"), trim)
|
||||||
# eventually available on child scopes
|
params = _.map(params.split(","), trim)
|
||||||
# TODO: this need an other aproximation :(((
|
values = _.map(params, (x) -> trim(x.split("=")[1]))
|
||||||
|
promises = _.map(values, (x) -> bindOnceP($scope, x))
|
||||||
|
|
||||||
# bindOnceP = ($scope, attr) ->
|
return $q.all.apply($q, promises).then ->
|
||||||
# defered = $q.defer()
|
options = {}
|
||||||
|
for item in params
|
||||||
|
[key, value] = _.map(item.split("="), trim)
|
||||||
|
options[key] = $scope.$eval(value)
|
||||||
|
return [name, options]
|
||||||
|
|
||||||
|
formatUrl = (url, ctx={}) ->
|
||||||
|
replacer = (match) ->
|
||||||
|
match = trim(match, ":")
|
||||||
|
return ctx[match] or "undefined"
|
||||||
|
return url.replace(/(:\w+)/g, replacer)
|
||||||
|
|
||||||
link = ($scope, $el, $attrs) ->
|
link = ($scope, $el, $attrs) ->
|
||||||
[name, options] = parseNav($attrs.tgNav, $scope)
|
parseNav($attrs.tgNav, $scope).then (result) ->
|
||||||
|
[name, options] = result
|
||||||
|
|
||||||
user = $auth.getUser()
|
user = $auth.getUser()
|
||||||
options.user = user.username if user
|
options.user = user.username if user
|
||||||
|
|
||||||
url = $navurls.resolve(name)
|
url = $navurls.resolve(name)
|
||||||
fullUrl = formatUrl(url, options)
|
fullUrl = formatUrl(url, options)
|
||||||
|
$el.attr("href", fullUrl)
|
||||||
console.log url, $attrs.tgNav
|
|
||||||
|
|
||||||
$el.attr("href", fullUrl)
|
|
||||||
|
|
||||||
return {link: link}
|
return {link: link}
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,7 @@ html(lang="en", ng-app="taiga")
|
||||||
meta(name="viewport", content="width=device-width, user-scalable=no")
|
meta(name="viewport", content="width=device-width, user-scalable=no")
|
||||||
link(rel="stylesheet", href="/styles/main.css")
|
link(rel="stylesheet", href="/styles/main.css")
|
||||||
body(tg-main)
|
body(tg-main)
|
||||||
// TODO: move to inner of ng-view
|
nav.menu
|
||||||
include partials/views/modules/nav
|
|
||||||
include partials/views/components/notification-message
|
include partials/views/components/notification-message
|
||||||
div.master(ng-view)
|
div.master(ng-view)
|
||||||
div.hidden.lightbox.lightbox_confirm-delete
|
div.hidden.lightbox.lightbox_confirm-delete
|
||||||
|
|
Loading…
Reference in New Issue