diff --git a/app/coffee/modules/nav.coffee b/app/coffee/modules/nav.coffee
index c8393845..bba02b29 100644
--- a/app/coffee/modules/nav.coffee
+++ b/app/coffee/modules/nav.coffee
@@ -29,9 +29,9 @@ module = angular.module("taigaNavMenu", [])
## Projects Navigation
#############################################################################
class ProjectsNavigationController extends taiga.Controller
- @.$inject = ["$scope", "$tgResources", "$tgNavUrls"]
+ @.$inject = ["$scope", "$rootScope", "$tgResources", "$tgNavUrls"]
- constructor: (@scope, @rs, @navurls) ->
+ constructor: (@scope, @rootscope, @rs, @navurls) ->
promise = @.loadInitialData()
promise.then null, ->
console.log "FAIL"
@@ -39,7 +39,6 @@ class ProjectsNavigationController extends taiga.Controller
loadInitialData: ->
return @rs.projects.list().then (projects) =>
- @scope.projects = projects
for project in projects
if project.is_backlog_activated and project.my_permissions.indexOf("view_us")>-1
url = @navurls.resolve("project-backlog")
@@ -53,12 +52,64 @@ class ProjectsNavigationController extends taiga.Controller
url = @navurls.resolve("project")
project.url = @navurls.formatUrl(url, {'project': project.slug})
+
+ @scope.projects = projects
+ @scope.filteredProjects = projects
+ @scope.filterText = ""
return projects
+ newProject: ->
+ @rootscope.$broadcast("projects:create")
+
+ filterProjects: (text) ->
+ @scope.filteredProjects = _.filter(@scope.projects, (project) -> project.name.toLowerCase().indexOf(text) > -1)
+ @scope.filterText = text
+ @rootscope.$broadcast("projects:filtered")
+
+module.controller("ProjectsNavigationController", ProjectsNavigationController)
+
+
+ProjectsNavigationDirective = ($rootscope, animationFrame, $timeout) ->
+ baseTemplate = _.template("""
+
Your projects
+
+
+
+
+
+ """) # TODO: i18n
+
+ projectsTemplate = _.template("""
+ <% _.each(projects, function(project) { %>
+
+
+ <%- project.name %>
+
+
+
+ <% }) %>
+ """) # TODO: i18n
-ProjectsNavigationDirective = ($rootscope, animationFrame) ->
overlay = $(".projects-nav-overlay")
loadingStart = 0
+
hideMenu = () ->
if overlay.is(':visible')
difftime = new Date().getTime() - loadingStart
@@ -75,7 +126,18 @@ ProjectsNavigationDirective = ($rootscope, animationFrame) ->
.removeClass("loading-project open-projects-nav")
), timeout
+ renderProjects = ($el, projects) ->
+ html = projectsTemplate({projects: projects})
+ $el.find(".projects-list").html(html)
+
+ render = ($el, projects) ->
+ html = baseTemplate()
+ $el.html(html)
+ renderProjects($el, projects)
+
link = ($scope, $el, $attrs, $ctrl) ->
+ $ctrl = $el.controller()
+
$rootscope.$on("project:loaded", hideMenu)
overlay.on 'click', () ->
@@ -95,13 +157,96 @@ ProjectsNavigationDirective = ($rootscope, animationFrame) ->
loadingStart = new Date().getTime()
+ $el.on "click", ".create-project-button .button", (event) ->
+ event.preventDefault()
+ $ctrl.newProject()
+
+ $el.on "keyup", ".search-project", (event) ->
+ target = angular.element(event.currentTarget)
+ $ctrl.filterProjects(target.val())
+
+ $scope.$watch "projects", (projects) ->
+ render($el, $scope.projects) if projects?
+
+ bindOnce $scope, "projects", (projects) ->
+ prevBtn = $el.find(".v-pagination-previous")
+ nextBtn = $el.find(".v-pagination-next")
+ container = $el.find("ul")
+ pageSize = 0
+ containerSize = 0
+
+ nextPage = (element, pageSize, callback) ->
+ top = parseInt(element.css('top'), 10)
+ newTop = top - pageSize
+
+ element.animate({"top": newTop}, callback);
+
+ return newTop
+
+ prevPage = (element, pageSize, callback) ->
+ top = parseInt(element.css('top'), 10)
+ newTop = top + pageSize
+
+ element.animate({"top": newTop}, callback);
+
+ return newTop
+
+ visible = (element) ->
+ element.css('visibility', 'visible')
+
+ hide = (element) ->
+ element.css('visibility', 'hidden')
+
+ remove = () ->
+ container.css('top', 0)
+ hide(prevBtn)
+ hide(nextBtn)
+
+ $el.on "click", ".v-pagination-previous", (event) ->
+ event.preventDefault()
+
+ if container.is(':animated')
+ return
+
+ visible(nextBtn)
+
+ newTop = prevPage(container, pageSize)
+
+ if newTop == 0
+ hide(prevBtn)
+
+ $el.on "click", ".v-pagination-next", (event) ->
+ event.preventDefault()
+
+ if container.is(':animated')
+ return
+
+ visible(prevBtn)
+
+ newTop = nextPage(container, pageSize)
+
+ if -newTop + pageSize > containerSize
+ hide(nextBtn)
+
+ $scope.$on "projects:filtered", ->
+ renderProjects($el, $scope.filteredProjects)
+ #wait digest end
+ $timeout () ->
+ if $scope.filteredProjects
+ pageSize = $el.find(".v-pagination-list").height()
+ containerSize = container.height()
+ if containerSize > pageSize
+ visible(nextBtn)
+ else
+ remove()
+ else
+ remove()
+
return {
link: link
- controller: ProjectsNavigationController
}
-
-module.directive("tgProjectsNav", ["$rootScope", "animationFrame", ProjectsNavigationDirective])
+module.directive("tgProjectsNav", ["$rootScope", "animationFrame", "$timeout", ProjectsNavigationDirective])
#############################################################################
diff --git a/app/coffee/modules/projects/main.coffee b/app/coffee/modules/projects/main.coffee
index 8cf6cf29..40a6ad2b 100644
--- a/app/coffee/modules/projects/main.coffee
+++ b/app/coffee/modules/projects/main.coffee
@@ -1,15 +1,6 @@
taiga = @.taiga
module = angular.module("taigaProject")
-class ProjectNavController extends taiga.Controller
- @.$inject = ["$rootScope"]
-
- constructor: (@rootscope) ->
-
- newProject: ->
- @rootscope.$broadcast("projects:create")
-
-module.controller("ProjectNavController", ProjectNavController)
class ProjectsController extends taiga.Controller
@.$inject = ["$scope", "$tgResources", "$rootScope", "$tgNavUrls", "$tgAuth", "$location", "$appTitle"]
@@ -82,94 +73,3 @@ class ProjectController extends taiga.Controller
module.controller("ProjectController", ProjectController)
-
-ProjectsPaginationDirective = ($timeout) ->
- nextPage = (element, pageSize, callback) ->
- top = parseInt(element.css('top'), 10)
- newTop = top - pageSize
-
- element.animate({"top": newTop}, callback)
-
- return newTop
-
- prevPage = (element, pageSize, callback) ->
- top = parseInt(element.css('top'), 10)
- newTop = top + pageSize
-
- element.animate({"top": newTop}, callback)
-
- return newTop
-
- visible = (element) ->
- element.css('visibility', 'visible')
-
- hide = (element) ->
- element.css('visibility', 'hidden')
-
- link = ($scope, $el, $attrs) ->
- prevBtn = $el.find(".v-pagination-previous")
- nextBtn = $el.find(".v-pagination-next")
- container = $el.find("ul")
-
- pageSize = 0
- containerSize = 0
-
- remove = () ->
- container.css('top', 0)
- hide(prevBtn)
- hide(nextBtn)
-
- prevBtn.on "click", (event) ->
- event.preventDefault()
-
- if container.is(':animated')
- return
-
- visible(nextBtn)
-
- newTop = prevPage(container, pageSize)
-
- if newTop == 0
- hide(prevBtn)
-
- nextBtn.on "click", (event) ->
- event.preventDefault()
-
- if container.is(':animated')
- return
-
- visible(prevBtn)
-
- newTop = nextPage(container, pageSize)
-
- if -newTop + pageSize > containerSize
- hide(nextBtn)
-
- $scope.$watch 'active', () ->
- #wait digest end
- $timeout () ->
- if $scope.active
- pageSize = $el.find(".v-pagination-list").height()
- containerSize = container.height()
-
- if containerSize > pageSize
- visible(nextBtn)
- else
- remove()
- else
- remove()
-
- return {
- scope: {
- active: '='
- },
- link: link,
- transclude: true,
- template: """
-
-
-
- """
- }
-
-module.directive("tgProjectsPagination", ['$timeout', ProjectsPaginationDirective])
diff --git a/app/partials/views/modules/projects-nav.jade b/app/partials/views/modules/projects-nav.jade
index ee6acc95..d0c39cec 100644
--- a/app/partials/views/modules/projects-nav.jade
+++ b/app/partials/views/modules/projects-nav.jade
@@ -6,18 +6,4 @@
div.lightbox.lightbox_create-project.hidden(tg-lb-create-project)
include lightbox_create-project
-nav.projects-nav(ng-controller="ProjectNavController as ctrl", tg-projects-nav)
- h1 Your projects
- form
- fieldset
- input(type="text" placeholder="Search in...", ng-model="projectsSearch.$")
- a.icon.icon-search
-
- .create-project-button
- a.button.button-green(href="", ng-click="ctrl.newProject()") Create project
-
- div.projects-pagination(tg-projects-pagination, active="projects.length && !projectsSearch.$.length")
- ul.projects-list
- li(ng-repeat="project in projects|filter:projectsSearch:strict track by project.id")
- a(href="", tg-bo-bind="project.name", ng-href="{{ project.url }}")
- span.icon.icon-arrow-right
+nav.projects-nav(ng-controller="ProjectsNavigationController", tg-projects-nav)