diff --git a/app/coffee/app.coffee b/app/coffee/app.coffee
index 55ae46d0..d7f34ada 100644
--- a/app/coffee/app.coffee
+++ b/app/coffee/app.coffee
@@ -38,111 +38,111 @@ taiga.sessionId = taiga.generateUniqueSessionIdentifier()
configure = ($routeProvider, $locationProvider, $httpProvider, $provide, $tgEventsProvider, tgLoaderProvider) ->
$routeProvider.when("/",
- {templateUrl: "/partials/projects.html", resolve: {loader: tgLoaderProvider.add()}})
+ {templateUrl: "project/projects.html", resolve: {loader: tgLoaderProvider.add()}})
$routeProvider.when("/project/:pslug/",
- {templateUrl: "/partials/project.html"})
+ {templateUrl: "project/project.html"})
$routeProvider.when("/project/:pslug/backlog",
- {templateUrl: "/partials/backlog.html", resolve: {loader: tgLoaderProvider.add()}})
+ {templateUrl: "backlog/backlog.html", resolve: {loader: tgLoaderProvider.add()}})
$routeProvider.when("/project/:pslug/taskboard/:sslug",
- {templateUrl: "/partials/taskboard.html", resolve: {loader: tgLoaderProvider.add()}})
+ {templateUrl: "taskboard/taskboard.html", resolve: {loader: tgLoaderProvider.add()}})
$routeProvider.when("/project/:pslug/search",
- {templateUrl: "/partials/search.html", reloadOnSearch: false})
+ {templateUrl: "search/search.html", reloadOnSearch: false})
$routeProvider.when("/project/:pslug/kanban",
- {templateUrl: "/partials/kanban.html", resolve: {loader: tgLoaderProvider.add()}})
+ {templateUrl: "kanban/kanban.html", resolve: {loader: tgLoaderProvider.add()}})
# User stories
$routeProvider.when("/project/:pslug/us/:usref",
- {templateUrl: "/partials/us-detail.html", resolve: {loader: tgLoaderProvider.add()}})
+ {templateUrl: "us/us-detail.html", resolve: {loader: tgLoaderProvider.add()}})
# Tasks
$routeProvider.when("/project/:pslug/task/:taskref",
- {templateUrl: "/partials/task-detail.html", resolve: {loader: tgLoaderProvider.add()}})
+ {templateUrl: "task/task-detail.html", resolve: {loader: tgLoaderProvider.add()}})
# Wiki
$routeProvider.when("/project/:pslug/wiki",
{redirectTo: (params) -> "/project/#{params.pslug}/wiki/home"}, )
$routeProvider.when("/project/:pslug/wiki/:slug",
- {templateUrl: "/partials/wiki.html", resolve: {loader: tgLoaderProvider.add()}})
+ {templateUrl: "wiki/wiki.html", resolve: {loader: tgLoaderProvider.add()}})
# Team
$routeProvider.when("/project/:pslug/team",
- {templateUrl: "/partials/views/team/team.html", resolve: {loader: tgLoaderProvider.add()}})
+ {templateUrl: "team/team.html", resolve: {loader: tgLoaderProvider.add()}})
# Issues
$routeProvider.when("/project/:pslug/issues",
- {templateUrl: "/partials/issues.html", resolve: {loader: tgLoaderProvider.add()}})
+ {templateUrl: "issue/issues.html", resolve: {loader: tgLoaderProvider.add()}})
$routeProvider.when("/project/:pslug/issue/:issueref",
- {templateUrl: "/partials/issues-detail.html", resolve: {loader: tgLoaderProvider.add()}})
+ {templateUrl: "issue/issues-detail.html", resolve: {loader: tgLoaderProvider.add()}})
# Admin
$routeProvider.when("/project/:pslug/admin/project-profile/details",
- {templateUrl: "/partials/admin-project-profile.html"})
+ {templateUrl: "admin/admin-project-profile.html"})
$routeProvider.when("/project/:pslug/admin/project-profile/default-values",
- {templateUrl: "/partials/admin-project-default-values.html"})
+ {templateUrl: "admin/admin-project-default-values.html"})
$routeProvider.when("/project/:pslug/admin/project-profile/modules",
- {templateUrl: "/partials/admin-project-modules.html"})
+ {templateUrl: "admin/admin-project-modules.html"})
$routeProvider.when("/project/:pslug/admin/project-values/us-status",
- {templateUrl: "/partials/admin-project-values-us-status.html"})
+ {templateUrl: "admin/admin-project-values-us-status.html"})
$routeProvider.when("/project/:pslug/admin/project-values/us-points",
- {templateUrl: "/partials/admin-project-values-us-points.html"})
+ {templateUrl: "admin/admin-project-values-us-points.html"})
$routeProvider.when("/project/:pslug/admin/project-values/task-status",
- {templateUrl: "/partials/admin-project-values-task-status.html"})
+ {templateUrl: "admin/admin-project-values-task-status.html"})
$routeProvider.when("/project/:pslug/admin/project-values/issue-status",
- {templateUrl: "/partials/admin-project-values-issue-status.html"})
+ {templateUrl: "admin/admin-project-values-issue-status.html"})
$routeProvider.when("/project/:pslug/admin/project-values/issue-types",
- {templateUrl: "/partials/admin-project-values-issue-types.html"})
+ {templateUrl: "admin/admin-project-values-issue-types.html"})
$routeProvider.when("/project/:pslug/admin/project-values/issue-priorities",
- {templateUrl: "/partials/admin-project-values-issue-priorities.html"})
+ {templateUrl: "admin/admin-project-values-issue-priorities.html"})
$routeProvider.when("/project/:pslug/admin/project-values/issue-severities",
- {templateUrl: "/partials/admin-project-values-issue-severities.html"})
+ {templateUrl: "admin/admin-project-values-issue-severities.html"})
$routeProvider.when("/project/:pslug/admin/memberships",
- {templateUrl: "/partials/admin-memberships.html"})
+ {templateUrl: "admin/admin-memberships.html"})
$routeProvider.when("/project/:pslug/admin/roles",
- {templateUrl: "/partials/admin-roles.html"})
+ {templateUrl: "admin/admin-roles.html"})
$routeProvider.when("/project/:pslug/admin/third-parties/github",
- {templateUrl: "/partials/admin-third-parties-github.html"})
+ {templateUrl: "admin/admin-third-parties-github.html"})
$routeProvider.when("/project/:pslug/admin/third-parties/gitlab",
- {templateUrl: "/partials/admin-third-parties-gitlab.html"})
+ {templateUrl: "admin/admin-third-parties-gitlab.html"})
$routeProvider.when("/project/:pslug/admin/third-parties/bitbucket",
- {templateUrl: "/partials/admin-third-parties-bitbucket.html"})
+ {templateUrl: "admin/admin-third-parties-bitbucket.html"})
$routeProvider.when("/project/:pslug/admin/contrib/:plugin",
- {templateUrl: "/partials/contrib/main.html"})
+ {templateUrl: "contrib/main.html"})
# User settings
$routeProvider.when("/project/:pslug/user-settings/user-profile",
- {templateUrl: "/partials/user-profile.html"})
+ {templateUrl: "user/user-profile.html"})
$routeProvider.when("/project/:pslug/user-settings/user-change-password",
- {templateUrl: "/partials/user-change-password.html"})
+ {templateUrl: "user/user-change-password.html"})
$routeProvider.when("/project/:pslug/user-settings/user-avatar",
- {templateUrl: "/partials/user-avatar.html"})
+ {templateUrl: "user/user-avatar.html"})
$routeProvider.when("/project/:pslug/user-settings/mail-notifications",
- {templateUrl: "/partials/mail-notifications.html"})
+ {templateUrl: "user/mail-notifications.html"})
$routeProvider.when("/change-email/:email_token",
- {templateUrl: "/partials/change-email.html"})
+ {templateUrl: "user/change-email.html"})
$routeProvider.when("/cancel-account/:cancel_token",
- {templateUrl: "/partials/cancel-account.html"})
+ {templateUrl: "user/cancel-account.html"})
# Auth
$routeProvider.when("/login",
- {templateUrl: "/partials/login.html"})
+ {templateUrl: "auth/login.html"})
$routeProvider.when("/register",
- {templateUrl: "/partials/register.html"})
+ {templateUrl: "auth/register.html"})
$routeProvider.when("/forgot-password",
- {templateUrl: "/partials/forgot-password.html"})
+ {templateUrl: "auth/forgot-password.html"})
$routeProvider.when("/change-password",
- {templateUrl: "/partials/change-password-from-recovery.html"})
+ {templateUrl: "auth/change-password-from-recovery.html"})
$routeProvider.when("/change-password/:token",
- {templateUrl: "/partials/change-password-from-recovery.html"})
+ {templateUrl: "auth/change-password-from-recovery.html"})
$routeProvider.when("/invitation/:token",
- {templateUrl: "/partials/invitation.html"})
+ {templateUrl: "auth/invitation.html"})
# Errors/Exceptions
$routeProvider.when("/error",
- {templateUrl: "/partials/error.html"})
+ {templateUrl: "error/error.html"})
$routeProvider.when("/not-found",
- {templateUrl: "/partials/not-found.html"})
+ {templateUrl: "error/not-found.html"})
$routeProvider.when("/permission-denied",
- {templateUrl: "/partials/permission-denied.html"})
+ {templateUrl: "error/permission-denied.html"})
$routeProvider.otherwise({redirectTo: '/not-found'})
$locationProvider.html5Mode({enabled: true, requireBase: false})
@@ -257,6 +257,9 @@ modules = [
"taigaPlugins",
"taigaIntegrations",
+ # template cache
+ "templates"
+
# Vendor modules
"ngRoute",
"ngAnimate",
diff --git a/app/coffee/modules/admin/memberships.coffee b/app/coffee/modules/admin/memberships.coffee
index 7a7f8988..dc21cfa3 100644
--- a/app/coffee/modules/admin/memberships.coffee
+++ b/app/coffee/modules/admin/memberships.coffee
@@ -105,40 +105,8 @@ module.controller("MembershipsController", MembershipsController)
## Member Avatar Directive
#############################################################################
-paginatorTemplate = """
-
- Empty space is so boring...
- go on be descriptive...
- A rose by any other name would smell as sweet...
-
- """ # TODO: i18n
- noDescriptionMegReadMode = """
-
@@ -416,4 +305,4 @@ ProjectMenuDirective = ($log, $compile, $auth, $rootscope, $tgAuth, $location, $
return {link: link}
module.directive("tgProjectMenu", ["$log", "$compile", "$tgAuth", "$rootScope", "$tgAuth", "$tgLocation",
- "$tgNavUrls", "$tgConfig", ProjectMenuDirective])
+ "$tgNavUrls", "$tgConfig", "$tgTemplate", ProjectMenuDirective])
diff --git a/app/coffee/modules/projects/main.coffee b/app/coffee/modules/projects/main.coffee
index 1cc49951..97d68d77 100644
--- a/app/coffee/modules/projects/main.coffee
+++ b/app/coffee/modules/projects/main.coffee
@@ -249,26 +249,8 @@ ProjectsPaginationDirective = ($timeout) ->
module.directive("tgProjectsPagination", ['$timeout', ProjectsPaginationDirective])
-ProjectsListDirective = ($compile) ->
- template = _.template("""
-
-
-
- """)
+ProjectsListDirective = ($compile, $template) ->
+ template = $template.get('project/project-list.html', true)
link = ($scope, $el, $attrs, $ctrls) ->
render = (projects) ->
@@ -282,4 +264,4 @@ ProjectsListDirective = ($compile) ->
link: link
}
-module.directive("tgProjectsList", ["$compile", ProjectsListDirective])
+module.directive("tgProjectsList", ["$compile", "$tgTemplate", ProjectsListDirective])
diff --git a/app/coffee/modules/related-tasks.coffee b/app/coffee/modules/related-tasks.coffee
index c7acbffe..740f12d9 100644
--- a/app/coffee/modules/related-tasks.coffee
+++ b/app/coffee/modules/related-tasks.coffee
@@ -25,66 +25,9 @@ debounce = @.taiga.debounce
module = angular.module("taigaRelatedTasks", [])
-RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading) ->
- templateView = _.template("""
-
-
-
-
-
- <% if(perms.modify_task) { %>
-
- <% } %>
-
-
- """)
-
- templateEdit = _.template("""
-
-
-
- """)
+RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $template) ->
+ templateView = $template.get("task/related-task-row.html", true)
+ templateEdit = $template.get("task/related-task-row-edit.html", true)
link = ($scope, $el, $attrs, $model) ->
saveTask = debounce 2000, (task) ->
@@ -166,32 +109,10 @@ RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading) ->
return {link:link, require:"ngModel"}
-module.directive("tgRelatedTaskRow", ["$tgRepo", "$compile", "$tgConfirm", "$rootScope", "$tgLoading", "$tgAnalytics", RelatedTaskRowDirective])
+module.directive("tgRelatedTaskRow", ["$tgRepo", "$compile", "$tgConfirm", "$rootScope", "$tgLoading", "$tgTemplate", RelatedTaskRowDirective])
-RelatedTaskCreateFormDirective = ($repo, $compile, $confirm, $tgmodel, $loading, $analytics) ->
- template = _.template("""
-
-
-
- """)
+RelatedTaskCreateFormDirective = ($repo, $compile, $confirm, $tgmodel, $loading, $analytics, $template) ->
+ template = $template.get("task/related-task-create-form.html", true)
newTask = {
subject: ""
@@ -256,7 +177,7 @@ RelatedTaskCreateFormDirective = ($repo, $compile, $confirm, $tgmodel, $loading,
$el.off()
return {link: link}
-module.directive("tgRelatedTaskCreateForm", ["$tgRepo", "$compile", "$tgConfirm", "$tgModel", "$tgLoading", "$tgAnalytics", RelatedTaskCreateFormDirective])
+module.directive("tgRelatedTaskCreateForm", ["$tgRepo", "$compile", "$tgConfirm", "$tgModel", "$tgLoading", "$tgAnalytics", "$tgTemplate", RelatedTaskCreateFormDirective])
RelatedTaskCreateButtonDirective = ($repo, $compile, $confirm, $tgmodel) ->
template = _.template("""
diff --git a/app/coffee/modules/taskboard/main.coffee b/app/coffee/modules/taskboard/main.coffee
index 04e91ba1..71d9c968 100644
--- a/app/coffee/modules/taskboard/main.coffee
+++ b/app/coffee/modules/taskboard/main.coffee
@@ -416,20 +416,6 @@ module.directive("tgTaskboardSquishColumn", ["$tgResources", TaskboardSquishColu
#############################################################################
TaskboardUserDirective = ($log) ->
- template = """
-
-
-
-
-
-
-
-
-
-
-
- """ # TODO: i18n
-
clickable = false
link = ($scope, $el, $attrs) ->
@@ -464,7 +450,7 @@ TaskboardUserDirective = ($log) ->
return {
link: link,
- template: template,
+ template: "taskboard/taskboard-user.html",
scope: {
"usersById": "=users",
"project": "=",
diff --git a/app/coffee/modules/tasks/detail.coffee b/app/coffee/modules/tasks/detail.coffee
index 0ca7fe84..1dd56d59 100644
--- a/app/coffee/modules/tasks/detail.coffee
+++ b/app/coffee/modules/tasks/detail.coffee
@@ -143,7 +143,7 @@ module.controller("TaskDetailController", TaskDetailController)
## Task status display directive
#############################################################################
-TaskStatusDisplayDirective = ->
+TaskStatusDisplayDirective = ($template) ->
# Display if a Task is open or closed and its taskboard status.
#
# Example:
@@ -153,18 +153,7 @@ TaskStatusDisplayDirective = ->
# - Task object (ng-model)
# - scope.statusById object
- template = _.template("""
-
- <% if (status.is_closed) { %>
- Closed
- <% } else { %>
- Open
- <% } %>
-
-
- <%- status.name %>
-
- """) # TODO: i18n
+ template = $template.get("common/components/status-display.html", true)
link = ($scope, $el, $attrs) ->
render = (task) ->
@@ -185,7 +174,7 @@ TaskStatusDisplayDirective = ->
require: "ngModel"
}
-module.directive("tgTaskStatusDisplay", TaskStatusDisplayDirective)
+module.directive("tgTaskStatusDisplay", ["$tgTemplate", TaskStatusDisplayDirective])
#############################################################################
diff --git a/app/coffee/modules/team/main.coffee b/app/coffee/modules/team/main.coffee
index 3250e09a..805432fa 100644
--- a/app/coffee/modules/team/main.coffee
+++ b/app/coffee/modules/team/main.coffee
@@ -142,25 +142,8 @@ module.controller("TeamController", TeamController)
#############################################################################
TeamFiltersDirective = () ->
- template = """
-
- """
-
return {
- template: template
+ templateUrl: "team/team-filter.html"
}
module.directive("tgTeamFilters", [TeamFiltersDirective])
@@ -170,28 +153,8 @@ module.directive("tgTeamFilters", [TeamFiltersDirective])
#############################################################################
TeamMemberStatsDirective = () ->
- template = """
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- """
return {
- template: template,
+ templateUrl: "team/team-member-stats.html",
scope: {
stats: "=",
userId: "=user"
@@ -208,23 +171,8 @@ module.directive("tgTeamMemberStats", TeamMemberStatsDirective)
#############################################################################
TeamMemberCurrentUserDirective = () ->
- template = """
-
-
-
-
-
-
-
-
-
-
-
-
-
- """
return {
- template: template
+ templateUrl: "team/team-member-current-user.html"
scope: {
projectId: "=projectid",
currentUser: "=currentuser",
@@ -242,22 +190,10 @@ module.directive("tgTeamCurrentUser", TeamMemberCurrentUserDirective)
#############################################################################
TeamMembersDirective = () ->
- template = """
-
-
-
-
-
-
-
-
-
-
-
-
- """
+ template = "team/team-members.html"
+
return {
- template: template
+ templateUrl: template
scope: {
memberships: "=",
filtersQ: "=filtersq",
@@ -276,12 +212,6 @@ module.directive("tgTeamMembers", TeamMembersDirective)
#############################################################################
LeaveProjectDirective = ($repo, $confirm, $location, $rs, $navurls) ->
- template= """
-
- Leave this project
-
- """ #TODO: i18n
-
link = ($scope, $el, $attrs) ->
$scope.leave = () ->
#TODO: i18n
@@ -299,7 +229,7 @@ LeaveProjectDirective = ($repo, $confirm, $location, $rs, $navurls) ->
return {
scope: {},
- template: template,
+ templateUrl: "team/leave-project.html",
link: link
}
diff --git a/app/coffee/modules/user-settings/lightboxes.coffee b/app/coffee/modules/user-settings/lightboxes.coffee
index 102c3c1d..5a7d6ccc 100644
--- a/app/coffee/modules/user-settings/lightboxes.coffee
+++ b/app/coffee/modules/user-settings/lightboxes.coffee
@@ -60,7 +60,7 @@ DeleteUserDirective = ($repo, $rootscope, $auth, $location, $navUrls, lightboxSe
return {
link: link,
- templateUrl: "/partials/views/modules/lightbox-delete-account.html"
+ templateUrl: "user/lightbox/lightbox-delete-account.html"
}
module.directive("tgLbDeleteUser", ["$tgRepo", "$rootScope", "$tgAuth", "$tgLocation", "$tgNavUrls",
diff --git a/app/coffee/modules/userstories/detail.coffee b/app/coffee/modules/userstories/detail.coffee
index 5b46767e..6db4ccac 100644
--- a/app/coffee/modules/userstories/detail.coffee
+++ b/app/coffee/modules/userstories/detail.coffee
@@ -151,7 +151,7 @@ module.controller("UserStoryDetailController", UserStoryDetailController)
## User story status display directive
#############################################################################
-UsStatusDisplayDirective = ->
+UsStatusDisplayDirective = ($template) ->
# Display if a US is open or closed and its kanban status.
#
# Example:
@@ -161,18 +161,7 @@ UsStatusDisplayDirective = ->
# - US object (ng-model)
# - scope.statusById object
- template = _.template("""
-
- <% if (is_closed) { %>
- Closed
- <% } else { %>
- Open
- <% } %>
-
-
- <%- status.name %>
-
- """) # TODO: i18n
+ template = $template.get("common/components/status-display.html", true)
link = ($scope, $el, $attrs) ->
render = (us) ->
@@ -194,14 +183,14 @@ UsStatusDisplayDirective = ->
require: "ngModel"
}
-module.directive("tgUsStatusDisplay", UsStatusDisplayDirective)
+module.directive("tgUsStatusDisplay", ["$tgTemplate", UsStatusDisplayDirective])
#############################################################################
## User story related tasts progress splay Directive
#############################################################################
-UsTasksProgressDisplayDirective = ->
+UsTasksProgressDisplayDirective = ($template) ->
# Display a progress bar with the stats of completed tasks.
#
# Example:
@@ -211,12 +200,7 @@ UsTasksProgressDisplayDirective = ->
# - Task object list (ng-model)
# - scope.taskStatusById object
- template = _.template("""
-
-
- <%- totalClosedTasks %>/<%- totalTasks %> tasks completed
-
- """) # TODO: i18n
+ template = $template.get("us/us-task-progress.html", true)
link = ($scope, $el, $attrs) ->
render = (tasks) ->
@@ -244,14 +228,14 @@ UsTasksProgressDisplayDirective = ->
require: "ngModel"
}
-module.directive("tgUsTasksProgressDisplay", UsTasksProgressDisplayDirective)
+module.directive("tgUsTasksProgressDisplay", ["$tgTemplate", UsTasksProgressDisplayDirective])
#############################################################################
## User story status button directive
#############################################################################
-UsStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue) ->
+UsStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template) ->
# Display the status of a US and you can edit it.
#
# Example:
@@ -262,21 +246,7 @@ UsStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue) ->
# - scope.statusById object
# - $scope.project.my_permissions
- template = _.template("""
-
-
-
<%- status.name %>
- <% if(editable){ %>
<% }%>
-
status
-
-
- <% _.each(statuses, function(st) { %>
- - <%- st.name %>
- <% }); %>
-
-
- """) #TODO: i18n
+ template = $template.get("us/us-status-button.html", true)
link = ($scope, $el, $attrs, $model) ->
isEditable = ->
@@ -345,7 +315,7 @@ UsStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue) ->
require: "ngModel"
}
-module.directive("tgUsStatusButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading","$tgQqueue",
+module.directive("tgUsStatusButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading","$tgQqueue", "$tgTemplate",
UsStatusButtonDirective])
@@ -353,14 +323,8 @@ module.directive("tgUsStatusButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$t
## User story team requirements button directive
#############################################################################
-UsTeamRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue) ->
- template = _.template("""
-
-
- """) #TODO: i18n
+UsTeamRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template) ->
+ template = $template.get("us/us-team-requirement-button.html", true)
link = ($scope, $el, $attrs, $model) ->
canEdit = ->
@@ -416,20 +380,14 @@ UsTeamRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qq
require: "ngModel"
}
-module.directive("tgUsTeamRequirementButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", UsTeamRequirementButtonDirective])
+module.directive("tgUsTeamRequirementButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", UsTeamRequirementButtonDirective])
#############################################################################
## User story client requirements button directive
#############################################################################
-UsClientRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue) ->
- template = _.template("""
-
-
- """) #TODO: i18n
+UsClientRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template) ->
+ template = $template.get("us/us-client-requirement-button.html", true)
link = ($scope, $el, $attrs, $model) ->
canEdit = ->
@@ -482,5 +440,5 @@ UsClientRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $
require: "ngModel"
}
-module.directive("tgUsClientRequirementButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue",
+module.directive("tgUsClientRequirementButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate",
UsClientRequirementButtonDirective])
diff --git a/app/coffee/modules/wiki/main.coffee b/app/coffee/modules/wiki/main.coffee
index ebf20a6c..6eec61a5 100644
--- a/app/coffee/modules/wiki/main.coffee
+++ b/app/coffee/modules/wiki/main.coffee
@@ -132,26 +132,8 @@ module.controller("WikiDetailController", WikiDetailController)
## Wiki Summary Directive
#############################################################################
-WikiSummaryDirective = ($log) ->
- template = _.template("""
-
- -
- <%- totalEditions %>
- times
edited
-
- -
- <%- lastModifiedDate %>
- last
edit
-
- -
-
-
-
- last modification
- <%- user.name %>
-
-
- """)
+WikiSummaryDirective = ($log, $template) ->
+ template = $template.get("wiki/wiki-summary.html", true)
link = ($scope, $el, $attrs, $model) ->
render = (wiki) ->
@@ -189,7 +171,7 @@ WikiSummaryDirective = ($log) ->
require: "ngModel"
}
-module.directive("tgWikiSummary", ["$log", WikiSummaryDirective])
+module.directive("tgWikiSummary", ["$log", "$tgTemplate", WikiSummaryDirective])
#############################################################################
@@ -198,25 +180,6 @@ module.directive("tgWikiSummary", ["$log", WikiSummaryDirective])
EditableWikiContentDirective = ($window, $document, $repo, $confirm, $loading, $location, $navUrls,
$analytics, $qqueue) ->
- template = """
-
-
-
-
-
- """ # TODO: i18n
link = ($scope, $el, $attrs, $model) ->
isEditable = ->
@@ -325,7 +288,7 @@ EditableWikiContentDirective = ($window, $document, $repo, $confirm, $loading, $
link: link
restrict: "EA"
require: "ngModel"
- template: template
+ templateUrl: "wiki/editable-wiki-content.html"
}
module.directive("tgEditableWikiContent", ["$window", "$document", "$tgRepo", "$tgConfirm", "$tgLoading",
diff --git a/app/coffee/modules/wiki/nav.coffee b/app/coffee/modules/wiki/nav.coffee
index 4daf00bd..21cd19e6 100644
--- a/app/coffee/modules/wiki/nav.coffee
+++ b/app/coffee/modules/wiki/nav.coffee
@@ -34,33 +34,8 @@ module = angular.module("taigaWiki")
## Wiki Main Directive
#############################################################################
-WikiNavDirective = ($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $loading) ->
- template = _.template("""
-
-
- <% if (addWikiLinkPermission) { %>
-
Add link
- <% } %>
- """)
+WikiNavDirective = ($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $loading, $template) ->
+ template = $template.get("wiki/wiki-nav.html", true)
link = ($scope, $el, $attrs) ->
$ctrl = $el.controller()
@@ -168,4 +143,4 @@ WikiNavDirective = ($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $l
return {link:link}
module.directive("tgWikiNav", ["$tgRepo", "$log", "$tgLocation", "$tgConfirm", "$tgNavUrls",
- "$tgAnalytics", "$tgLoading", WikiNavDirective])
+ "$tgAnalytics", "$tgLoading", "$tgTemplate", WikiNavDirective])
diff --git a/app/index.jade b/app/index.jade
index 8bfaee6c..0c31b58a 100644
--- a/app/index.jade
+++ b/app/index.jade
@@ -12,29 +12,30 @@ html(lang="en")
body(tg-main)
- include partials/views/modules/projects-nav
+ include partials/includes/modules/projects-nav
//- the content of nav.menu is in coffe.modules.base TaigaMain directive
nav.menu.hidden(tg-project-menu)
- include partials/views/components/notification-message
+ include partials/includes/components/notification-message
div.master(ng-view)
div.lightbox.lightbox-generic-ask
- include partials/views/modules/lightbox-generic-ask
+ include partials/includes/modules/lightbox-generic-ask
div.lightbox.lightbox-ask-choice
- include partials/views/modules/lightbox-ask-choice
+ include partials/includes/modules/lightbox-ask-choice
div.lightbox.lightbox-generic-success
- include partials/views/modules/lightbox-generic-success
+ include partials/includes/modules/lightbox-generic-success
div.lightbox.lightbox-generic-error
- include partials/views/modules/lightbox-generic-error
+ include partials/includes/modules/lightbox-generic-error
div.lightbox.lightbox-search(tg-search-box)
- include partials/views/modules/lightbox-search
+ include partials/includes/modules/lightbox-search
div.lightbox.lightbox-feedback.lightbox-generic-form(tg-lb-feedback)
- include partials/views/modules/lightbox-feedback
+ include partials/includes/modules/lightbox-feedback
- include partials/views/modules/loader
+ include partials/includes/modules/loader
script(src="/js/libs.js?v=#{v}")
script(src="/js/app-loader.js?v=#{v}")
+ script(src="/js/templates.js?v=#{v}")
diff --git a/app/partials/admin-memberships.jade b/app/partials/admin-memberships.jade
deleted file mode 100644
index 4ba6109a..00000000
--- a/app/partials/admin-memberships.jade
+++ /dev/null
@@ -1,26 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper.memberships(ng-controller="MembershipsController as ctrl",
- ng-init="section='admin'", tg-memberships)
- sidebar.menu-secondary.sidebar(tg-admin-navigation="memberships")
- include views/modules/admin-menu
-
- section.main.admin-membership
- .header-with-actions
- header
- include views/components/mainTitle
-
- .action-buttons
- a.button.button-green(title="Add new member" href="" ng-click="ctrl.addNewMembers()")
- span.text + New member
-
- include views/modules/admin/admin-membership-table
-
- div.paginator.memberships-paginator
-
- div.lightbox.lightbox-add-member(tg-lb-create-members)
- include views/modules/lightbox-add-member
diff --git a/app/partials/admin-project-default-values.jade b/app/partials/admin-project-default-values.jade
deleted file mode 100644
index 59afdbca..00000000
--- a/app/partials/admin-project-default-values.jade
+++ /dev/null
@@ -1,21 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-project-default-values, ng-controller="ProjectProfileController as ctrl",
- ng-init="section='admin'; sectionName='Default values'")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="default-values")
- include views/modules/admin-submenu-project-profile
-
- section.main.admin-common
- header
- include views/components/mainTitle
-
- p.total Default Values
-
- include views/modules/admin/default-values
diff --git a/app/partials/admin-project-modules.jade b/app/partials/admin-project-modules.jade
deleted file mode 100644
index deea51d6..00000000
--- a/app/partials/admin-project-modules.jade
+++ /dev/null
@@ -1,97 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-project-modules, ng-controller="ProjectProfileController as ctrl",
- ng-init="section='admin'; sectionName='Modules'")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="modules")
- include views/modules/admin-submenu-project-profile
-
- section.main.admin-functionalities
- header
- include views/components/mainTitle
-
- form
- div.functionality(ng-class="{true:'active', false:''}[project.is_backlog_activated]")
- div.icon.icon-backlog
- div.desc
- p
- span Backlog
- | Manage your user stories to maintain an organized view of upcoming and prioritized work.
- div.activate
- input.activate-input(type="checkbox", id="functionality-backlog",
- ng-model="project.is_backlog_activated")
- label.button.button-gray(ng-switch="project.is_backlog_activated",
- for="functionality-backlog")
- span(ng-switch-when="true") Disable
- span(ng-switch-when="false") Enable
-
- div.functionality(ng-class="{true:'active', false:''}[project.is_kanban_activated]")
- div.icon.icon-kanban
- div.desc
- p
- span Kanban
- | Organize your project in a lean way with this board.
- div.activate
- input.activate-input(type="checkbox", id="functionality-kanban",
- ng-model="project.is_kanban_activated")
- label.button.button-gray(ng-switch="project.is_kanban_activated",
- for="functionality-kanban")
- span(ng-switch-when="true") Disable
- span(ng-switch-when="false") Enable
-
- div.functionality(ng-class="{true:'active', false:''}[project.is_issues_activated]")
- div.icon.icon-issues
- div.desc
- p
- span Issues
- | Track the bugs, questions and enhancements related to your project. Don't miss anything!
- div.activate
- input.activate-input(type="checkbox", id="functionality-issues",
- ng-model="project.is_issues_activated")
- label.button.button-gray(ng-switch="project.is_issues_activated",
- for="functionality-issues")
- span(ng-switch-when="true") Disable
- span(ng-switch-when="false") Enable
-
- div.functionality(ng-class="{true:'active', false:''}[project.is_wiki_activated]")
- div.icon.icon-wiki
- div.desc
- p
- span Wiki
- | Add, modify, or delete content in collaboration with others. This is the right place for your project documentation.
- div.activate
- input.activate-input(type="checkbox", id="functionality-wiki",
- ng-model="project.is_wiki_activated")
- label.button.button-gray(ng-switch="project.is_wiki_activated",
- for="functionality-wiki")
- span(ng-switch-when="true") Disable
- span(ng-switch-when="false") Enable
-
- div.functionality(ng-class="{true:'active', false:''}[isVideoconferenceActivated]")
- div.icon.icon-video
- div.desc
- p
- span Meet Up
- | Choose your videoconference system. Even developers need face to face contact.
- div.activate
- input.activate-input(type="checkbox", id="functionality-video",
- ng-model="isVideoconferenceActivated")
- label.button.button-gray(ng-switch="isVideoconferenceActivated",
- for="functionality-video")
- span(ng-switch-when="true") Disable
- span(ng-switch-when="false") Enable
-
- div.videoconference-attributes.hidden
- select(ng-model="project.videoconferences",
- ng-options="e.id as e.name for e in [{'id':'appear-in', 'name':'AppearIn'},{'id':'talky', 'name': 'Talky'}]")
- option(value="") Select a videoconference system
- input(type="text", ng-model="project.videoconferences_salt",
- placeholder="If you want you can append a salt code to the name of the chat room")
- button(type="submit", class="hidden")
- a.button.button-green.submit-button(href="", title="Save") Save
diff --git a/app/partials/admin-project-profile.jade b/app/partials/admin-project-profile.jade
deleted file mode 100644
index 7a94aed4..00000000
--- a/app/partials/admin-project-profile.jade
+++ /dev/null
@@ -1,62 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-project-profile, ng-controller="ProjectProfileController as ctrl",
- ng-init="section='admin'; sectionName='Project details'")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="details")
- include views/modules/admin-submenu-project-profile
-
- section.main.project-details
- header
- include views/components/mainTitle
-
- form
- fieldset
- label(for="project-name") Project Name
- input(type="text", name="name", placeholder="Project name", id="project-name",
- ng-model="project.name", data-required="true", maxlength="45")
-
- fieldset
- label(for="project-slug") Project Slug
- input(type="text", name="slug", placeholder="Slug", id="project-slug",
- ng-model="project.slug", data-required="true")
-
- fieldset
- label(for="project-sprints") Number of sprints
- input(type="number", name="total_milestones", min="0", placeholder="Number of sprints",
- id="project-sprints", ng-model="project.total_milestones", data-type="digits")
-
- fieldset
- label(for="total-story-points") Number of US points
- input(type="number", name="total_story_points", min="0", placeholder="Number of US points",
- id="total-story-points", ng-model="project.total_story_points",
- data-type="digits", data-required="true")
-
- fieldset
- label(for="project-description") Description
- textarea(name="description", placeholder="Description", id="project-description",
- ng-model="project.description", data-required="true")
-
- tg-privacy-settings-inputs
- div.privacy-settings
- div
- input.hidden(type="radio", disabled="disabled")
- label.button(for="public-project") Public Project
- div
- input.hidden(type="radio", checked="checked", disabled="disabled")
- label.button(for="private-project") Private Project
-
- p All projects are private during Taiga's beta period.
-
- button(type="submit", class="hidden")
- a.button.button-green.submit-button(href="", title="Save") Save
- a.delete-project(href="", title="Delete this project", ng-click="ctrl.openDeleteLightbox()") Delete this project
-
- div.lightbox.lightbox-delete-project(tg-lb-delete-project)
- include views/modules/lightbox-delete-project
diff --git a/app/partials/admin-project-values-issue-priorities.jade b/app/partials/admin-project-values-issue-priorities.jade
deleted file mode 100644
index d0e06689..00000000
--- a/app/partials/admin-project-values-issue-priorities.jade
+++ /dev/null
@@ -1,24 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='issues'; type='priorities'; sectionName='Issue Priorities'",
- type="priorities")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-priorities")
- include views/modules/admin-submenu-project-values
-
- section.main.admin-common
- include views/components/mainTitle
- p.admin-subtitle Specify the priority levels users can assign to issues
-
- div.project-values-options
- a.button.button-green.show-add-new(href="", title="Add New")
- span Add new priority
-
- include views/modules/admin/project-types
diff --git a/app/partials/admin-project-values-issue-severities.jade b/app/partials/admin-project-values-issue-severities.jade
deleted file mode 100644
index db23a4cb..00000000
--- a/app/partials/admin-project-values-issue-severities.jade
+++ /dev/null
@@ -1,24 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='issues'; type='severities'; sectionName='Issue severities'",
- type="severities")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-severities")
- include views/modules/admin-submenu-project-values
-
- section.main.admin-common
- include views/components/mainTitle
- p.admin-subtitle Specify the severity level users can select to classify issues
-
- div.project-values-options
- a.button.button-green.show-add-new(href="", title="Add New")
- span Add new severity
-
- include views/modules/admin/project-types
diff --git a/app/partials/admin-project-values-issue-status.jade b/app/partials/admin-project-values-issue-status.jade
deleted file mode 100644
index be1440e1..00000000
--- a/app/partials/admin-project-values-issue-status.jade
+++ /dev/null
@@ -1,24 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='issues'; type='issue-statuses'; sectionName='Issue Statuses'",
- type="issue-statuses")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-issue-status")
- include views/modules/admin-submenu-project-values
-
- section.main.admin-common
- include views/components/mainTitle
- p.admin-subtitle Specify the column headers that you will use to classify Issues
-
- div.project-values-options
- a.button.button-green.show-add-new(href="", title="Add New")
- span Add new status
-
- include views/modules/admin/project-status
diff --git a/app/partials/admin-project-values-issue-types.jade b/app/partials/admin-project-values-issue-types.jade
deleted file mode 100644
index 5aa01057..00000000
--- a/app/partials/admin-project-values-issue-types.jade
+++ /dev/null
@@ -1,24 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='issues'; type='issue-types'; sectionName='Issue Types'",
- type="issue-types")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-issue-types")
- include views/modules/admin-submenu-project-values
-
- section.main.admin-common
- include views/components/mainTitle
- p.admin-subtitle Specify the categories users can select to classify issues
-
- div.project-values-options
- a.button.button-green.show-add-new(href="", title="Add New")
- span Add new type
-
- include views/modules/admin/project-types
diff --git a/app/partials/admin-project-values-task-status.jade b/app/partials/admin-project-values-task-status.jade
deleted file mode 100644
index 5f06174d..00000000
--- a/app/partials/admin-project-values-task-status.jade
+++ /dev/null
@@ -1,24 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='tasks'; type='task-statuses'; sectionName='Task Statuses'",
- type="task-statuses")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-task-status")
- include views/modules/admin-submenu-project-values
-
- section.main.admin-common
- include views/components/mainTitle
- p.admin-subtitle Specify the column headers that you will use to classify Tasks related to each User Stories
-
- div.project-values-options
- a.button.button-green.show-add-new(href="", title="Add New")
- span Add new status
-
- include views/modules/admin/project-status
diff --git a/app/partials/admin-project-values-us-points.jade b/app/partials/admin-project-values-us-points.jade
deleted file mode 100644
index 6cf8d83d..00000000
--- a/app/partials/admin-project-values-us-points.jade
+++ /dev/null
@@ -1,30 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='userstories'; type='points'; sectionName='Us points'",
- type="points")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-us-points")
- include views/modules/admin-submenu-project-values
-
- section.main.admin-common
- include views/components/mainTitle
- p.admin-subtitle Specify the numerical system you will use to indicate the level of difficulty for each User Story
-
- - var helpLightboxId = "notion-admin-project-values-us-points"
- include views/components/help-notion-button
-
- div.project-values-options
- a.button.button-green.show-add-new(href="", title="Add New")
- span Add new point
-
- include views/modules/admin/project-points
-
- div.lightbox.lightbox-generic-notion.notion-admin-project-values-us-points(id="notion-admin-project-values-us-points", tg-lb-notion)
- include views/modules/help-notions/lightbox-notion-admin-project-values-us-points
diff --git a/app/partials/admin-project-values-us-status.jade b/app/partials/admin-project-values-us-status.jade
deleted file mode 100644
index 3fc886ed..00000000
--- a/app/partials/admin-project-values-us-status.jade
+++ /dev/null
@@ -1,24 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='userstories'; type='userstory-statuses'; sectionName='Us Statuses'",
- type="userstory-statuses")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-us-status")
- include views/modules/admin-submenu-project-values
-
- section.main.admin-common
- include views/components/mainTitle
- p.admin-subtitle Specify the column headers that you will use to classify User Stories
-
- div.project-values-options
- a.button.button-green.show-add-new(href="", title="Add New")
- span Add new status
-
- include views/modules/admin/project-us-status
diff --git a/app/partials/admin-roles.jade b/app/partials/admin-roles.jade
deleted file mode 100644
index cb9010b2..00000000
--- a/app/partials/admin-roles.jade
+++ /dev/null
@@ -1,40 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper.roles(ng-controller="RolesController as ctrl",
- ng-init="section='admin'", tg-roles)
- sidebar.menu-secondary.sidebar(tg-admin-navigation="roles")
- include views/modules/admin-menu
- sidebar.menu-tertiary.sidebar
- include views/modules/admin-submenu-roles
-
- section.main.admin-roles.admin-common
- .header-with-actions
- include views/components/mainTitle
- .action-buttons
- a.button.button-red.delete-role(href="", title="Delete", ng-click="ctrl.delete()") Delete
-
-
- div(tg-edit-role)
- .edit-role
- input(type="text", value="{{ role.name }}")
- a.save.icon.icon-floppy(href="", title="Save")
-
- p.total
- span.role-name(title="{{ role.members_count }} members with this role") {{ role.name }}
- a.edit-value.icon.icon-edit
-
- div.any-computable-role(ng-hide="anyComputableRole") Be careful, no role in your project will be able to estimate the point value for user stories
-
- div.general-category
- | When enabled, members assigned to this role will be able to estimate the point value for user stories
- div.check
- input(type="checkbox", ng-model="role.computable", ng-change="ctrl.setComputable()")
- div
- span.check-text.check-yes Yes
- span.check-text.check-no No
-
- div(tg-role-permissions, ng-model="role")
diff --git a/app/partials/admin-third-parties-bitbucket.jade b/app/partials/admin-third-parties-bitbucket.jade
deleted file mode 100644
index 7e3ca8f8..00000000
--- a/app/partials/admin-third-parties-bitbucket.jade
+++ /dev/null
@@ -1,40 +0,0 @@
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper.roles(tg-bitbucket-webhooks, ng-controller="BitbucketController as ctrl",
- ng-init="section='admin'")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
- include views/modules/admin-menu
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="third-parties-bitbucket")
- include views/modules/admin-submenu-third-parties
-
- section.main.admin-common.admin-third-parties
- include views/components/mainTitle
-
- form
- fieldset
- label(for="secret-key") Secret key
- input(type="text", name="secret-key", ng-model="bitbucket.secret", placeholder="Secret key", id="secret-key")
-
- fieldset
- .select-input-text(tg-select-input-text)
- div
- label(for="payload-url") Payload URL
- .field-with-option
- input(type="text", ng-model="bitbucket.webhooks_url", name="payload-url", readonly="readonly", placeholder="Payload URL", id="payload-url")
- .option-wrapper.select-input-content
- .icon.icon-copy
- .help-copy Copy to clipboard: Ctrl+C
-
- fieldset
- label(for="valid-origin-ips") Valid origin ips (separated by ,)
- input(type="text", name="valid-origin-ips", tg-valid-origin-ips, ng-model="bitbucket.valid_origin_ips", placeholder="Bitbucket requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation.", id="valid-origin-ips")
-
- button(type="submit", class="hidden")
- a.button.button-green.submit-button(href="", title="Save") Save
-
-
- a.help-button(href="https://taiga.io/support/bitbucket-integration/", target="_blank")
- span.icon.icon-help
- span Do you need help? Check out our support page!
diff --git a/app/partials/admin-third-parties-github.jade b/app/partials/admin-third-parties-github.jade
deleted file mode 100644
index 53a3140a..00000000
--- a/app/partials/admin-third-parties-github.jade
+++ /dev/null
@@ -1,36 +0,0 @@
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper.roles(tg-github-webhooks, ng-controller="GithubController as ctrl",
- ng-init="section='admin'")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
- include views/modules/admin-menu
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="third-parties-github")
- include views/modules/admin-submenu-third-parties
-
- section.main.admin-common.admin-third-parties
- include views/components/mainTitle
-
- form
- fieldset
- label(for="secret-key") Secret key
- input(type="text", name="secret-key", ng-model="github.secret", placeholder="Secret key", id="secret-key")
-
- fieldset
- .select-input-text(tg-select-input-text)
- div
- label(for="payload-url") Payload URL
- .field-with-option
- input(type="text", ng-model="github.webhooks_url", name="payload-url", readonly="readonly", placeholder="Payload URL", id="payload-url")
- .option-wrapper.select-input-content
- .icon.icon-copy
- .help-copy Copy to clipboard: Ctrl+C
-
- button(type="submit", class="hidden")
- a.button.button-green.submit-button(href="", title="Save") Save
-
-
- a.help-button(href="https://taiga.io/support/github-integration/", target="_blank")
- span.icon.icon-help
- span Do you need help? Check out our support page!
diff --git a/app/partials/admin/admin-membership-paginator.jade b/app/partials/admin/admin-membership-paginator.jade
new file mode 100644
index 00000000..6d6a0aa0
--- /dev/null
+++ b/app/partials/admin/admin-membership-paginator.jade
@@ -0,0 +1,23 @@
+ul.paginator
+ <% if (showPrevious) { %>
+ li.previous
+ a(href="", class="previous next_prev_button", class="disabled")
+ span(i18next="pagination.prev") Prev
+ <% } %>
+
+ <% _.each(pages, function(item) { %>
+ li(class!="<%- item.classes %>")
+ <% if (item.type === "page") { %>
+ a(href="", data-pagenum!="<%- item.num %>") <%- item.num %>
+ <% } else if (item.type === "page-active") { %>
+ span(class="active") <%- item.num %>
+ <% } else { %>
+ span ...
+ <% } %>
+ <% }); %>
+
+ <% if (showNext) { %>
+ li.next
+ a(href="", class="next next_prev_button", class="disabled")
+ span(i18next="pagination.next") Next
+ <% } %>
diff --git a/app/partials/admin/admin-memberships-row-checkbox.jade b/app/partials/admin/admin-memberships-row-checkbox.jade
new file mode 100644
index 00000000..108bcd40
--- /dev/null
+++ b/app/partials/admin/admin-memberships-row-checkbox.jade
@@ -0,0 +1,5 @@
+.check
+ input(type="checkbox", id!="<%- inputId %>")
+ div
+ span.check-text.check-yes Yes
+ span.check-text.check-no No
diff --git a/app/partials/admin/admin-memberships.jade b/app/partials/admin/admin-memberships.jade
new file mode 100644
index 00000000..cf996944
--- /dev/null
+++ b/app/partials/admin/admin-memberships.jade
@@ -0,0 +1,20 @@
+div.wrapper.memberships(ng-controller="MembershipsController as ctrl",
+ ng-init="section='admin'", tg-memberships)
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="memberships")
+ include ../includes/modules/admin-menu
+
+ section.main.admin-membership
+ .header-with-actions
+ header
+ include ../includes/components/mainTitle
+
+ .action-buttons
+ a.button.button-green(title="Add new member" href="" ng-click="ctrl.addNewMembers()")
+ span.text + New member
+
+ include ../includes/modules/admin/admin-membership-table
+
+ div.paginator.memberships-paginator
+
+ div.lightbox.lightbox-add-member(tg-lb-create-members)
+ include ../includes/modules/lightbox-add-member
diff --git a/app/partials/admin/admin-project-default-values.jade b/app/partials/admin/admin-project-default-values.jade
new file mode 100644
index 00000000..14182365
--- /dev/null
+++ b/app/partials/admin/admin-project-default-values.jade
@@ -0,0 +1,15 @@
+div.wrapper(tg-project-default-values, ng-controller="ProjectProfileController as ctrl",
+ ng-init="section='admin'; sectionName='Default values'")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="default-values")
+ include ../includes/modules/admin-submenu-project-profile
+
+ section.main.admin-common
+ header
+ include ../includes/components/mainTitle
+
+ p.total Default Values
+
+ include ../includes/modules/admin/default-values
diff --git a/app/partials/admin/admin-project-modules.jade b/app/partials/admin/admin-project-modules.jade
new file mode 100644
index 00000000..21e1be00
--- /dev/null
+++ b/app/partials/admin/admin-project-modules.jade
@@ -0,0 +1,91 @@
+div.wrapper(tg-project-modules, ng-controller="ProjectProfileController as ctrl",
+ ng-init="section='admin'; sectionName='Modules'")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="modules")
+ include ../includes/modules/admin-submenu-project-profile
+
+ section.main.admin-functionalities
+ header
+ include ../includes/components/mainTitle
+
+ form
+ div.functionality(ng-class="{true:'active', false:''}[project.is_backlog_activated]")
+ div.icon.icon-backlog
+ div.desc
+ p
+ span Backlog
+ | Manage your user stories to maintain an organized view of upcoming and prioritized work.
+ div.activate
+ input.activate-input(type="checkbox", id="functionality-backlog",
+ ng-model="project.is_backlog_activated")
+ label.button.button-gray(ng-switch="project.is_backlog_activated",
+ for="functionality-backlog")
+ span(ng-switch-when="true") Disable
+ span(ng-switch-when="false") Enable
+
+ div.functionality(ng-class="{true:'active', false:''}[project.is_kanban_activated]")
+ div.icon.icon-kanban
+ div.desc
+ p
+ span Kanban
+ | Organize your project in a lean way with this board.
+ div.activate
+ input.activate-input(type="checkbox", id="functionality-kanban",
+ ng-model="project.is_kanban_activated")
+ label.button.button-gray(ng-switch="project.is_kanban_activated",
+ for="functionality-kanban")
+ span(ng-switch-when="true") Disable
+ span(ng-switch-when="false") Enable
+
+ div.functionality(ng-class="{true:'active', false:''}[project.is_issues_activated]")
+ div.icon.icon-issues
+ div.desc
+ p
+ span Issues
+ | Track the bugs, questions and enhancements related to your project. Don't miss anything!
+ div.activate
+ input.activate-input(type="checkbox", id="functionality-issues",
+ ng-model="project.is_issues_activated")
+ label.button.button-gray(ng-switch="project.is_issues_activated",
+ for="functionality-issues")
+ span(ng-switch-when="true") Disable
+ span(ng-switch-when="false") Enable
+
+ div.functionality(ng-class="{true:'active', false:''}[project.is_wiki_activated]")
+ div.icon.icon-wiki
+ div.desc
+ p
+ span Wiki
+ | Add, modify, or delete content in collaboration with others. This is the right place for your project documentation.
+ div.activate
+ input.activate-input(type="checkbox", id="functionality-wiki",
+ ng-model="project.is_wiki_activated")
+ label.button.button-gray(ng-switch="project.is_wiki_activated",
+ for="functionality-wiki")
+ span(ng-switch-when="true") Disable
+ span(ng-switch-when="false") Enable
+
+ div.functionality(ng-class="{true:'active', false:''}[isVideoconferenceActivated]")
+ div.icon.icon-video
+ div.desc
+ p
+ span Meet Up
+ | Choose your videoconference system. Even developers need face to face contact.
+ div.activate
+ input.activate-input(type="checkbox", id="functionality-video",
+ ng-model="isVideoconferenceActivated")
+ label.button.button-gray(ng-switch="isVideoconferenceActivated",
+ for="functionality-video")
+ span(ng-switch-when="true") Disable
+ span(ng-switch-when="false") Enable
+
+ div.videoconference-attributes.hidden
+ select(ng-model="project.videoconferences",
+ ng-options="e.id as e.name for e in [{'id':'appear-in', 'name':'AppearIn'},{'id':'talky', 'name': 'Talky'}]")
+ option(value="") Select a videoconference system
+ input(type="text", ng-model="project.videoconferences_salt",
+ placeholder="If you want you can append a salt code to the name of the chat room")
+ button(type="submit", class="hidden")
+ a.button.button-green.submit-button(href="", title="Save") Save
diff --git a/app/partials/admin/admin-project-profile.jade b/app/partials/admin/admin-project-profile.jade
new file mode 100644
index 00000000..a2e93726
--- /dev/null
+++ b/app/partials/admin/admin-project-profile.jade
@@ -0,0 +1,56 @@
+div.wrapper(tg-project-profile, ng-controller="ProjectProfileController as ctrl",
+ ng-init="section='admin'; sectionName='Project details'")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="details")
+ include ../includes/modules/admin-submenu-project-profile
+
+ section.main.project-details
+ header
+ include ../includes/components/mainTitle
+
+ form
+ fieldset
+ label(for="project-name") Project Name
+ input(type="text", name="name", placeholder="Project name", id="project-name",
+ ng-model="project.name", data-required="true", maxlength="45")
+
+ fieldset
+ label(for="project-slug") Project Slug
+ input(type="text", name="slug", placeholder="Slug", id="project-slug",
+ ng-model="project.slug", data-required="true")
+
+ fieldset
+ label(for="project-sprints") Number of sprints
+ input(type="number", name="total_milestones", min="0", placeholder="Number of sprints",
+ id="project-sprints", ng-model="project.total_milestones", data-type="digits")
+
+ fieldset
+ label(for="total-story-points") Number of US points
+ input(type="number", name="total_story_points", min="0", placeholder="Number of US points",
+ id="total-story-points", ng-model="project.total_story_points",
+ data-type="digits", data-required="true")
+
+ fieldset
+ label(for="project-description") Description
+ textarea(name="description", placeholder="Description", id="project-description",
+ ng-model="project.description", data-required="true")
+
+ tg-privacy-settings-inputs
+ div.privacy-settings
+ div
+ input.hidden(type="radio", disabled="disabled")
+ label.button(for="public-project") Public Project
+ div
+ input.hidden(type="radio", checked="checked", disabled="disabled")
+ label.button(for="private-project") Private Project
+
+ p All projects are private during Taiga's beta period.
+
+ button(type="submit", class="hidden")
+ a.button.button-green.submit-button(href="", title="Save") Save
+ a.delete-project(href="", title="Delete this project", ng-click="ctrl.openDeleteLightbox()") Delete this project
+
+div.lightbox.lightbox-delete-project(tg-lb-delete-project)
+ include ../includes/modules/lightbox-delete-project
diff --git a/app/partials/admin/admin-project-values-issue-priorities.jade b/app/partials/admin/admin-project-values-issue-priorities.jade
new file mode 100644
index 00000000..cb2a2116
--- /dev/null
+++ b/app/partials/admin/admin-project-values-issue-priorities.jade
@@ -0,0 +1,18 @@
+div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
+ ng-init="section='admin'; resource='issues'; type='priorities'; sectionName='Issue Priorities'",
+ type="priorities")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-priorities")
+ include ../includes/modules/admin-submenu-project-values
+
+ section.main.admin-common
+ include ../includes/components/mainTitle
+ p.admin-subtitle Specify the priority levels users can assign to issues
+
+ div.project-values-options
+ a.button.button-green.show-add-new(href="", title="Add New")
+ span Add new priority
+
+ include ../includes/modules/admin/project-types
diff --git a/app/partials/admin/admin-project-values-issue-severities.jade b/app/partials/admin/admin-project-values-issue-severities.jade
new file mode 100644
index 00000000..57fea5a7
--- /dev/null
+++ b/app/partials/admin/admin-project-values-issue-severities.jade
@@ -0,0 +1,18 @@
+div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
+ ng-init="section='admin'; resource='issues'; type='severities'; sectionName='Issue severities'",
+ type="severities")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-severities")
+ include ../includes/modules/admin-submenu-project-values
+
+ section.main.admin-common
+ include ../includes/components/mainTitle
+ p.admin-subtitle Specify the severity level users can select to classify issues
+
+ div.project-values-options
+ a.button.button-green.show-add-new(href="", title="Add New")
+ span Add new severity
+
+ include ../includes/modules/admin/project-types
diff --git a/app/partials/admin/admin-project-values-issue-status.jade b/app/partials/admin/admin-project-values-issue-status.jade
new file mode 100644
index 00000000..b02c72e6
--- /dev/null
+++ b/app/partials/admin/admin-project-values-issue-status.jade
@@ -0,0 +1,18 @@
+div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
+ ng-init="section='admin'; resource='issues'; type='issue-statuses'; sectionName='Issue Statuses'",
+ type="issue-statuses")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-issue-status")
+ include ../includes/modules/admin-submenu-project-values
+
+ section.main.admin-common
+ include ../includes/components/mainTitle
+ p.admin-subtitle Specify the column headers that you will use to classify Issues
+
+ div.project-values-options
+ a.button.button-green.show-add-new(href="", title="Add New")
+ span Add new status
+
+ include ../includes/modules/admin/project-status
diff --git a/app/partials/admin/admin-project-values-issue-types.jade b/app/partials/admin/admin-project-values-issue-types.jade
new file mode 100644
index 00000000..20072b9e
--- /dev/null
+++ b/app/partials/admin/admin-project-values-issue-types.jade
@@ -0,0 +1,18 @@
+div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
+ ng-init="section='admin'; resource='issues'; type='issue-types'; sectionName='Issue Types'",
+ type="issue-types")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-issue-types")
+ include ../includes/modules/admin-submenu-project-values
+
+ section.main.admin-common
+ include ../includes/components/mainTitle
+ p.admin-subtitle Specify the categories users can select to classify issues
+
+ div.project-values-options
+ a.button.button-green.show-add-new(href="", title="Add New")
+ span Add new type
+
+ include ../includes/modules/admin/project-types
diff --git a/app/partials/admin/admin-project-values-task-status.jade b/app/partials/admin/admin-project-values-task-status.jade
new file mode 100644
index 00000000..be883b1f
--- /dev/null
+++ b/app/partials/admin/admin-project-values-task-status.jade
@@ -0,0 +1,18 @@
+div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
+ ng-init="section='admin'; resource='tasks'; type='task-statuses'; sectionName='Task Statuses'",
+ type="task-statuses")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-task-status")
+ include ../includes/modules/admin-submenu-project-values
+
+ section.main.admin-common
+ include ../includes/components/mainTitle
+ p.admin-subtitle Specify the column headers that you will use to classify Tasks related to each User Stories
+
+ div.project-values-options
+ a.button.button-green.show-add-new(href="", title="Add New")
+ span Add new status
+
+ include ../includes/modules/admin/project-status
diff --git a/app/partials/admin/admin-project-values-us-points.jade b/app/partials/admin/admin-project-values-us-points.jade
new file mode 100644
index 00000000..4483a03f
--- /dev/null
+++ b/app/partials/admin/admin-project-values-us-points.jade
@@ -0,0 +1,24 @@
+div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
+ ng-init="section='admin'; resource='userstories'; type='points'; sectionName='Us points'",
+ type="points")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-us-points")
+ include ../includes/modules/admin-submenu-project-values
+
+ section.main.admin-common
+ include ../includes/components/mainTitle
+ p.admin-subtitle Specify the numerical system you will use to indicate the level of difficulty for each User Story
+
+ - var helpLightboxId = "notion-admin-project-values-us-points"
+ include ../includes/components/help-notion-button
+
+ div.project-values-options
+ a.button.button-green.show-add-new(href="", title="Add New")
+ span Add new point
+
+ include ../includes/modules/admin/project-points
+
+div.lightbox.lightbox-generic-notion.notion-admin-project-values-us-points(id="notion-admin-project-values-us-points", tg-lb-notion)
+ include ../includes/modules/help-notions/lightbox-notion-admin-project-values-us-points
diff --git a/app/partials/admin/admin-project-values-us-status.jade b/app/partials/admin/admin-project-values-us-status.jade
new file mode 100644
index 00000000..eb6980cc
--- /dev/null
+++ b/app/partials/admin/admin-project-values-us-status.jade
@@ -0,0 +1,18 @@
+div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
+ ng-init="section='admin'; resource='userstories'; type='userstory-statuses'; sectionName='Us Statuses'",
+ type="userstory-statuses")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-us-status")
+ include ../includes/modules/admin-submenu-project-values
+
+ section.main.admin-common
+ include ../includes/components/mainTitle
+ p.admin-subtitle Specify the column headers that you will use to classify User Stories
+
+ div.project-values-options
+ a.button.button-green.show-add-new(href="", title="Add New")
+ span Add new status
+
+ include ../includes/modules/admin/project-us-status
diff --git a/app/partials/admin/admin-roles.jade b/app/partials/admin/admin-roles.jade
new file mode 100644
index 00000000..335cef2d
--- /dev/null
+++ b/app/partials/admin/admin-roles.jade
@@ -0,0 +1,34 @@
+div.wrapper.roles(ng-controller="RolesController as ctrl",
+ ng-init="section='admin'", tg-roles)
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="roles")
+ include ../includes/modules/admin-menu
+ sidebar.menu-tertiary.sidebar
+ include ../includes/modules/admin-submenu-roles
+
+ section.main.admin-roles.admin-common
+ .header-with-actions
+ include ../includes/components/mainTitle
+ .action-buttons
+ a.button.button-red.delete-role(href="", title="Delete", ng-click="ctrl.delete()") Delete
+
+
+ div(tg-edit-role)
+ .edit-role
+ input(type="text", value="{{ role.name }}")
+ a.save.icon.icon-floppy(href="", title="Save")
+
+ p.total
+ span.role-name(title="{{ role.members_count }} members with this role") {{ role.name }}
+ a.edit-value.icon.icon-edit
+
+ div.any-computable-role(ng-hide="anyComputableRole") Be careful, no role in your project will be able to estimate the point value for user stories
+
+ div.general-category
+ | When enabled, members assigned to this role will be able to estimate the point value for user stories
+ div.check
+ input(type="checkbox", ng-model="role.computable", ng-change="ctrl.setComputable()")
+ div
+ span.check-text.check-yes Yes
+ span.check-text.check-no No
+
+ div(tg-role-permissions, ng-model="role")
diff --git a/app/partials/admin/admin-third-parties-bitbucket.jade b/app/partials/admin/admin-third-parties-bitbucket.jade
new file mode 100644
index 00000000..e2a1f05c
--- /dev/null
+++ b/app/partials/admin/admin-third-parties-bitbucket.jade
@@ -0,0 +1,36 @@
+div.wrapper.roles(tg-bitbucket-webhooks, ng-controller="BitbucketController as ctrl",
+ ng-init="section='admin'")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
+ include ../includes/modules/admin-menu
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="third-parties-bitbucket")
+ include ../includes/modules/admin-submenu-third-parties
+
+ section.main.admin-common.admin-third-parties
+ include ../includes/components/mainTitle
+
+ form
+ fieldset
+ label(for="secret-key") Secret key
+ input(type="text", name="secret-key", ng-model="bitbucket.secret", placeholder="Secret key", id="secret-key")
+
+ fieldset
+ .select-input-text(tg-select-input-text)
+ div
+ label(for="payload-url") Payload URL
+ .field-with-option
+ input(type="text", ng-model="bitbucket.webhooks_url", name="payload-url", readonly="readonly", placeholder="Payload URL", id="payload-url")
+ .option-wrapper.select-input-content
+ .icon.icon-copy
+ .help-copy Copy to clipboard: Ctrl+C
+
+ fieldset
+ label(for="valid-origin-ips") Valid origin ips (separated by ,)
+ input(type="text", name="valid-origin-ips", tg-valid-origin-ips, ng-model="bitbucket.valid_origin_ips", placeholder="Bitbucket requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation.", id="valid-origin-ips")
+
+ button(type="submit", class="hidden")
+ a.button.button-green.submit-button(href="", title="Save") Save
+
+
+ a.help-button(href="https://taiga.io/support/bitbucket-integration/", target="_blank")
+ span.icon.icon-help
+ span Do you need help? Check out our support page!
diff --git a/app/partials/admin/admin-third-parties-github.jade b/app/partials/admin/admin-third-parties-github.jade
new file mode 100644
index 00000000..ae92c1fa
--- /dev/null
+++ b/app/partials/admin/admin-third-parties-github.jade
@@ -0,0 +1,32 @@
+div.wrapper.roles(tg-github-webhooks, ng-controller="GithubController as ctrl",
+ ng-init="section='admin'")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
+ include ../includes/modules/admin-menu
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="third-parties-github")
+ include ../includes/modules/admin-submenu-third-parties
+
+ section.main.admin-common.admin-third-parties
+ include ../includes/components/mainTitle
+
+ form
+ fieldset
+ label(for="secret-key") Secret key
+ input(type="text", name="secret-key", ng-model="github.secret", placeholder="Secret key", id="secret-key")
+
+ fieldset
+ .select-input-text(tg-select-input-text)
+ div
+ label(for="payload-url") Payload URL
+ .field-with-option
+ input(type="text", ng-model="github.webhooks_url", name="payload-url", readonly="readonly", placeholder="Payload URL", id="payload-url")
+ .option-wrapper.select-input-content
+ .icon.icon-copy
+ .help-copy Copy to clipboard: Ctrl+C
+
+ button(type="submit", class="hidden")
+ a.button.button-green.submit-button(href="", title="Save") Save
+
+
+ a.help-button(href="https://taiga.io/support/github-integration/", target="_blank")
+ span.icon.icon-help
+ span Do you need help? Check out our support page!
diff --git a/app/partials/admin-third-parties-gitlab.jade b/app/partials/admin/admin-third-parties-gitlab.jade
similarity index 92%
rename from app/partials/admin-third-parties-gitlab.jade
rename to app/partials/admin/admin-third-parties-gitlab.jade
index c85b2165..dc89117f 100644
--- a/app/partials/admin-third-parties-gitlab.jade
+++ b/app/partials/admin/admin-third-parties-gitlab.jade
@@ -5,12 +5,12 @@ block content
div.wrapper.roles(tg-gitlab-webhooks, ng-controller="GitlabController as ctrl",
ng-init="section='admin'")
sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
- include views/modules/admin-menu
+ include ../includes/modules/admin-menu
sidebar.menu-tertiary.sidebar(tg-admin-navigation="third-parties-gitlab")
- include views/modules/admin-submenu-third-parties
+ include ../includes/modules/admin-submenu-third-parties
section.main.admin-common.admin-third-parties
- include views/components/mainTitle
+ include ../includes/components/mainTitle
form
fieldset
diff --git a/app/partials/admin/memberships-row-avatar.jade b/app/partials/admin/memberships-row-avatar.jade
new file mode 100644
index 00000000..97491394
--- /dev/null
+++ b/app/partials/admin/memberships-row-avatar.jade
@@ -0,0 +1,5 @@
+figure.avatar
+ img(src!="<%- imgurl %>", alt!="<%- full_name %>")
+ figcaption
+ span.name <%- full_name %>
+ span.email <%- email %>
diff --git a/app/partials/attachment/attachment-edit.jade b/app/partials/attachment/attachment-edit.jade
new file mode 100644
index 00000000..6c0f4ed8
--- /dev/null
+++ b/app/partials/attachment/attachment-edit.jade
@@ -0,0 +1,19 @@
+.attachment-name
+ span.icon.icon-document
+ a(href!="<%- url %>", title!="<%- name %> uploaded on <%- created_date %>", target="_blank")
+ | <%- name %>
+.attachment-size
+ span <%- size %>
+
+.editable.editable-attachment-comment
+ input(type="text", name="description", maxlength="140",
+ value!="<%- description %>", placeholder="Type a short description")
+
+.editable.editable-attachment-deprecated
+ input(type="checkbox", name="is-deprecated",
+ id!="attach-<%- id %>-is-deprecated")
+ label(for!="attach-<%- id %>-is-deprecated") Deprecated?
+
+.attachment-settings
+ a.editable-settings.icon.icon-floppy(href="", title="Save")
+ a.editable-settings.icon.icon-delete(href="", title="Cancel")
diff --git a/app/partials/attachment/attachment.jade b/app/partials/attachment/attachment.jade
new file mode 100644
index 00000000..840e0ac0
--- /dev/null
+++ b/app/partials/attachment/attachment.jade
@@ -0,0 +1,19 @@
+.attachment-name
+ a(href!="<%- url %>", title!="<%- name %> uploaded on <%- created_date %>", target="_blank")
+ span.icon.icon-documents
+ span <%- name %>
+.attachment-size
+ span <%- size %>
+
+.attachment-comments
+ <% if (isDeprecated){ %>
+ span.deprecated-file (deprecated)
+ <% } %>
+ span <%- description %>
+
+<% if (modifyPermission) {%>
+.attachment-settings
+ a.settings.icon.icon-edit(href="", title="Edit")
+ a.settings.icon.icon-delete(href="", title="Delete")
+ a.settings.icon.icon-drag-v(href="", title="Drag")
+<% } %>
\ No newline at end of file
diff --git a/app/partials/attachment/attachments.jade b/app/partials/attachment/attachments.jade
new file mode 100644
index 00000000..363b71a8
--- /dev/null
+++ b/app/partials/attachment/attachments.jade
@@ -0,0 +1,30 @@
+section.attachments
+ .attachments-header
+ h3.attachments-title
+ span.attachments-num(tg-bind-html="ctrl.attachmentsCount")
+ span.attachments-text attachments
+ .add-attach(tg-check-permission!="modify_<%- type %>", title!="Add new attachment. <%- maxFileSizeMsg %>")
+ <% if (maxFileSize){ %>
+ span.size-info.hidden [Max. size: <%- maxFileSize %>]
+ <% }; %>
+ label(for="add-attach", class="icon icon-plus related-tasks-buttons")
+ input(id="add-attach", type="file", multiple="multiple")
+
+ .attachment-body.sortable
+ .single-attachment(ng-repeat="attach in ctrl.attachments|filter:ctrl.filterAttachments track by attach.id" tg-attachment="attach")
+
+ .single-attachment(ng-repeat="file in ctrl.uploadingAttachments")
+ .attachment-name
+ a(href="", tg-bo-title="file.name", tg-bo-bind="file.name")
+ .attachment-size
+ span.attachment-size(tg-bo-bind="file.size")
+ .attachment-comments
+ span(ng-bind="file.progressMessage")
+ .percentage(ng-style="{'width': file.progressPercent}")
+
+ a.more-attachments(href="", title="show deprecated atachments", ng-if="ctrl.deprecatedAttachmentsCount > 0")
+ span.text(data-type="show") + show deprecated atachments
+ span.text.hidden(data-type="hide")
+ | - hide deprecated atachments
+ span.more-attachments-num
+ | ({{ctrl.deprecatedAttachmentsCount }} deprecated)
diff --git a/app/partials/auth/change-password-from-recovery.jade b/app/partials/auth/change-password-from-recovery.jade
new file mode 100644
index 00000000..19781326
--- /dev/null
+++ b/app/partials/auth/change-password-from-recovery.jade
@@ -0,0 +1,8 @@
+div.wrapper
+ div.login-main
+ div.login-container
+ h1.logo
+ img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
+ p.tagline Your agile, free, and open source project management tool
+
+ include ../includes/modules/change-password-from-recovery-form
diff --git a/app/partials/auth/forgot-password.jade b/app/partials/auth/forgot-password.jade
new file mode 100644
index 00000000..b9e848cb
--- /dev/null
+++ b/app/partials/auth/forgot-password.jade
@@ -0,0 +1,9 @@
+include ../includes/components/beta
+div.wrapper
+ div.login-main
+ div.login-container
+ img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
+ h1.logo Taiga
+ h2.tagline LOVE YOUR PROJECT
+
+ include ../includes/modules/forgot-form
diff --git a/app/partials/auth/invitation.jade b/app/partials/auth/invitation.jade
new file mode 100644
index 00000000..18270792
--- /dev/null
+++ b/app/partials/auth/invitation.jade
@@ -0,0 +1,16 @@
+div.wrapper
+ div.invitation-main
+ div.invitation-container(tg-invitation)
+ figure.avatar
+ a(href="", tg-bo-title="invitation.invited_by.full_name_display")
+ img.avatar(tg-bo-src="invitation.invited_by.photo",
+ tg-bo-alt="invitation.invited_by.full_name_display")
+ span.person-name(tg-bo-bind="invitation.invited_by.full_name_display")
+
+ span.invitation-text
+ p has invited you to join the project
+ p.project-name(tg-bo-bind="invitation.project_name")
+
+ div.invitation-form
+ include ../includes/modules/invitation-login-form
+ include ../includes/modules/invitation-register-form
diff --git a/app/partials/auth/login-text.jade b/app/partials/auth/login-text.jade
new file mode 100644
index 00000000..79bb7497
--- /dev/null
+++ b/app/partials/auth/login-text.jade
@@ -0,0 +1,3 @@
+p.login-text
+ span Not registered yet?
+ a(href='<%- url %>', tg-nav='register', title='Register') create your free account here
diff --git a/app/partials/auth/login.jade b/app/partials/auth/login.jade
new file mode 100644
index 00000000..26ab4ac4
--- /dev/null
+++ b/app/partials/auth/login.jade
@@ -0,0 +1,9 @@
+include ../includes/components/beta
+div.wrapper
+ div.login-main
+ div.login-container
+ img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
+ h1.logo Taiga
+ h2.tagline LOVE YOUR PROJECT
+
+ include ../includes/modules/login-form
diff --git a/app/partials/auth/register.jade b/app/partials/auth/register.jade
new file mode 100644
index 00000000..95eb00d2
--- /dev/null
+++ b/app/partials/auth/register.jade
@@ -0,0 +1,8 @@
+div.wrapper
+ div.login-main
+ div.login-container
+ img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
+ h1.logo Taiga
+ h2.tagline LOVE YOUR PROJECT
+
+ include ../includes/modules/register-form
diff --git a/app/partials/backlog.jade b/app/partials/backlog.jade
deleted file mode 100644
index 1e77370e..00000000
--- a/app/partials/backlog.jade
+++ /dev/null
@@ -1,45 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-backlog, ng-controller="BacklogController as ctrl",
- ng-init="section='backlog'")
- sidebar.menu-secondary.extrabar.filters-bar(tg-backlog-filters)
- include views/modules/backlog-filters
- section.main.backlog
- include views/components/mainTitle
- include views/components/summary
- div.graphics-container.burndown-container
- div.burndown(tg-gm-backlog-graph)
- include views/modules/burndown
- div.backlog-menu
- a.trans-button.move-to-current-sprint(href="", title="Move to Current Sprint",
- id="move-to-current-sprint")
- span.icon.icon-move
- span.text Move to current Sprint
- a.trans-button(href="", title="Show Filters", id="show-filters-button")
- span.icon.icon-filter
- span.text Show Filters
- a.trans-button(href="", title="Show Tags", id="show-tags")
- span.icon.icon-tag
- span.text Show Tags
- include views/components/addnewus
- section.backlog-table(ng-class="{'hidden': !visibleUserstories.length}")
- include views/modules/backlog-table
- div.empty.empty-backlog(ng-class="{'hidden': visibleUserstories.length}", tg-backlog-empty-sortable)
- span.icon.icon-backlog
- span.title Your backlog is empty!
- a(href="", title+"Create a new US", ng-click="ctrl.addNewUs('standard')", tg-check-permission="add_us") You may want to create a new user story
- sidebar.menu-secondary.sidebar
- include views/modules/sprints
-
- div.lightbox.lightbox-generic-form(tg-lb-create-edit-userstory)
- include views/modules/lightbox-us-create-edit
-
- div.lightbox.lightbox-generic-bulk(tg-lb-create-bulk-userstories)
- include views/modules/lightbox-us-bulk
-
- div.lightbox.lightbox-sprint-add-edit(tg-lb-create-edit-sprint)
- include views/modules/lightbox-sprint-add-edit
diff --git a/app/partials/backlog/backlog.jade b/app/partials/backlog/backlog.jade
new file mode 100644
index 00000000..e8b4dd55
--- /dev/null
+++ b/app/partials/backlog/backlog.jade
@@ -0,0 +1,39 @@
+div.wrapper(tg-backlog, ng-controller="BacklogController as ctrl",
+ ng-init="section='backlog'")
+ sidebar.menu-secondary.extrabar.filters-bar(tg-backlog-filters)
+ include ../includes/modules/backlog-filters
+ section.main.backlog
+ include ../includes/components/mainTitle
+ include ../includes/components/summary
+ div.graphics-container.burndown-container
+ div.burndown(tg-gm-backlog-graph)
+ include ../includes/modules/burndown
+ div.backlog-menu
+ a.trans-button.move-to-current-sprint(href="", title="Move to Current Sprint",
+ id="move-to-current-sprint")
+ span.icon.icon-move
+ span.text Move to current Sprint
+ a.trans-button(href="", title="Show Filters", id="show-filters-button")
+ span.icon.icon-filter
+ span.text Show Filters
+ a.trans-button(href="", title="Show Tags", id="show-tags")
+ span.icon.icon-tag
+ span.text Show Tags
+ include ../includes/components/addnewus
+ section.backlog-table(ng-class="{'hidden': !visibleUserstories.length}")
+ include ../includes/modules/backlog-table
+ div.empty.empty-backlog(ng-class="{'hidden': visibleUserstories.length}", tg-backlog-empty-sortable)
+ span.icon.icon-backlog
+ span.title Your backlog is empty!
+ a(href="", title+"Create a new US", ng-click="ctrl.addNewUs('standard')", tg-check-permission="add_us") You may want to create a new user story
+ sidebar.menu-secondary.sidebar
+ include ../includes/modules/sprints
+
+ div.lightbox.lightbox-generic-form(tg-lb-create-edit-userstory)
+ include ../includes/modules/lightbox-us-create-edit
+
+ div.lightbox.lightbox-generic-bulk(tg-lb-create-bulk-userstories)
+ include ../includes/modules/lightbox-us-bulk
+
+ div.lightbox.lightbox-sprint-add-edit(tg-lb-create-edit-sprint)
+ include ../includes/modules/lightbox-sprint-add-edit
diff --git a/app/partials/backlog/filter-selected.jade b/app/partials/backlog/filter-selected.jade
new file mode 100644
index 00000000..d9550028
--- /dev/null
+++ b/app/partials/backlog/filter-selected.jade
@@ -0,0 +1,6 @@
+<% _.each(filters, function(f) { %>
+a.single-filter.selected(data-type!="<%- f.type %>", data-id!="<%- f.id %>")
+ span.name(style!="<%- f.style %>")
+ | <%- f.name %>
+ span.icon.icon-delete
+<% }) %>
diff --git a/app/partials/backlog/filters.jade b/app/partials/backlog/filters.jade
new file mode 100644
index 00000000..05faf672
--- /dev/null
+++ b/app/partials/backlog/filters.jade
@@ -0,0 +1,13 @@
+<% _.each(filters, function(f) { %>
+<% if (f.selected) { %>
+a.single-filter.active(data-type!="<%- f.type %>", data-id!="<%- f.id %>")
+ span.name(style!="<%- f.style %>")
+ | <%- f.name %>
+ span.number <%- f.count %>
+<% } else { %>
+a.single-filter(data-type!="<%- f.type %>", data-id!="<%- f.id %>")
+ span.name(style!="<%- f.style %>")
+ | <%- f.name %>
+ span.number <%- f.count %>
+<% } %>
+<% }) %>
\ No newline at end of file
diff --git a/app/partials/backlog/progress-bar.jade b/app/partials/backlog/progress-bar.jade
new file mode 100644
index 00000000..1c0b0831
--- /dev/null
+++ b/app/partials/backlog/progress-bar.jade
@@ -0,0 +1,3 @@
+.defined-points(title="Excess of points")
+.project-points-progress(title="Pending Points", style!="width: <%- projectPointsPercentaje %>%")
+.closed-points-progress(title="Closed points", style!="width: <%- closedPointsPercentaje %>%")
\ No newline at end of file
diff --git a/app/partials/backlog/sprint-header.jade b/app/partials/backlog/sprint-header.jade
new file mode 100644
index 00000000..852c2ab1
--- /dev/null
+++ b/app/partials/backlog/sprint-header.jade
@@ -0,0 +1,20 @@
+.sprint-name
+ a.icon.icon-arrow-up(href="", title="Compact Sprint")
+ <% if(isVisible){ %>
+ a(href!="<%- taskboardUrl %>", title!="'Go to the taskboard of '<%- name %>'")
+ span <%- name %>
+ <% } %>
+
+ <% if(isEditable){ %>
+ a.icon.icon-edit(href="", title="Edit Sprint")
+ <% } %>
+
+.sprint-summary
+ .sprint-date <%- estimatedDateRange %>
+ ul
+ li
+ span.number <%- closedPoints %>
+ span.description closed
+ li
+ span.number <%- totalPoints %>
+ span.description total
diff --git a/app/partials/backlog/us-points-popover.jade b/app/partials/backlog/us-points-popover.jade
new file mode 100644
index 00000000..0e39c5f3
--- /dev/null
+++ b/app/partials/backlog/us-points-popover.jade
@@ -0,0 +1,11 @@
+ul.popover.pop-points-open
+ <% _.each(points, function(point) { %>
+ li
+ <% if (point.selected) { %>
+ a.point(href="", title!="<%- point.name %>", data-point-id!="<%- point.id %>")
+ | <%- point.name %>
+ <% } else { %>
+ a.point.active(href="", title!="<%- point.name %>", data-point-id!="<%- point.id %>")
+ | <%- point.name %>
+ <% } %>
+ <% }); %>
diff --git a/app/partials/backlog/us-points-roles-popover.jade b/app/partials/backlog/us-points-roles-popover.jade
new file mode 100644
index 00000000..247e1506
--- /dev/null
+++ b/app/partials/backlog/us-points-roles-popover.jade
@@ -0,0 +1,6 @@
+ul.popover.pop-role
+ <% _.each(roles, function(role) { %>
+ li
+ a.role(href="", title!="<%- role.name %>", data-role-id="<%- role.id %>")
+ |<%- role.name %> (<%- role.points %>)
+ <% }); %>
diff --git a/app/partials/backlog/us-role-points-popover.jade b/app/partials/backlog/us-role-points-popover.jade
new file mode 100644
index 00000000..4fcc2f65
--- /dev/null
+++ b/app/partials/backlog/us-role-points-popover.jade
@@ -0,0 +1,8 @@
+ul.popover.pop-role
+ li
+ a.clear-selection(href="", title="All") All
+ <% _.each(roles, function(role) { %>
+ li
+ a(href="", class="role", title!="<%- role.name %>", data-role-id!="<%- role.id %>")
+ | <%- role.name %>
+ <% }); %>
diff --git a/app/partials/cancel-account.jade b/app/partials/cancel-account.jade
deleted file mode 100644
index 45dd5275..00000000
--- a/app/partials/cancel-account.jade
+++ /dev/null
@@ -1,14 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper
- div.login-main
- div.login-container
- h1.logo
- img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
- p.tagline Your agile, free, and open source project management tool
-
- include views/modules/cancel-account-form
diff --git a/app/partials/change-email.jade b/app/partials/change-email.jade
deleted file mode 100644
index 86c38b02..00000000
--- a/app/partials/change-email.jade
+++ /dev/null
@@ -1,14 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper
- div.login-main
- div.login-container
- h1.logo
- img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
- p.tagline Your agile, free, and open source project management tool
-
- include views/modules/change-email-form
diff --git a/app/partials/change-password-from-recovery.jade b/app/partials/change-password-from-recovery.jade
deleted file mode 100644
index db405e2e..00000000
--- a/app/partials/change-password-from-recovery.jade
+++ /dev/null
@@ -1,14 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper
- div.login-main
- div.login-container
- h1.logo
- img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
- p.tagline Your agile, free, and open source project management tool
-
- include views/modules/change-password-from-recovery-form
diff --git a/app/partials/common/components/assigned-to.jade b/app/partials/common/components/assigned-to.jade
new file mode 100644
index 00000000..be741f01
--- /dev/null
+++ b/app/partials/common/components/assigned-to.jade
@@ -0,0 +1,21 @@
+<% if (assignedTo) { %>
+.user-avatar
+ img(src!="<%- assignedTo.photo %>", alt!="<%- assignedTo.full_name_display %>")
+<% } %>
+
+.assigned-to
+ span.assigned-title Assigned to
+
+ a(href="" title="edit assignment", class!="user-assigned <% if(isEditable){ %>editable<% }; %>")
+ span.assigned-name
+ <% if (assignedTo) { %>
+ <%- assignedTo.full_name_display %>
+ <% } else { %>
+ | Not assigned
+ <% } %>
+ <% if(isEditable){ %>
+ span.icon.icon-arrow-bottom
+ <% }; %>
+ <% if (assignedTo!==null && isEditable) { %>
+ a.icon.icon-delete(href="" title="delete assignment")
+ <% } %>
diff --git a/app/partials/common/components/block-button.jade b/app/partials/common/components/block-button.jade
new file mode 100644
index 00000000..354ec00d
--- /dev/null
+++ b/app/partials/common/components/block-button.jade
@@ -0,0 +1,2 @@
+a(href="#", class="button button-gray item-block") Block
+a(href="#", class="button button-red item-unblock") Unblock
\ No newline at end of file
diff --git a/app/partials/common/components/created-by.jade b/app/partials/common/components/created-by.jade
new file mode 100644
index 00000000..6f4eb960
--- /dev/null
+++ b/app/partials/common/components/created-by.jade
@@ -0,0 +1,8 @@
+.user-avatar
+ img(src!="<%- owner.photo %>", alt!="<%- owner.full_name_display %>")
+
+.created-by
+ span.created-title
+ | Created by <%- owner.full_name_display %>
+ span.created-date
+ | <%- date %>
diff --git a/app/partials/common/components/delete-button.jade b/app/partials/common/components/delete-button.jade
new file mode 100644
index 00000000..c33733cf
--- /dev/null
+++ b/app/partials/common/components/delete-button.jade
@@ -0,0 +1 @@
+a(href="", class="button button-red") Delete
\ No newline at end of file
diff --git a/app/partials/common/components/editable-description-msg-edit-mode.jade b/app/partials/common/components/editable-description-msg-edit-mode.jade
new file mode 100644
index 00000000..7b761cd9
--- /dev/null
+++ b/app/partials/common/components/editable-description-msg-edit-mode.jade
@@ -0,0 +1,2 @@
+p.no-description.editable
+ | Empty space is so boring... go on be descriptive... A rose by any other name would smell as sweet...
\ No newline at end of file
diff --git a/app/partials/common/components/editable-description-msg-read-mode.jade b/app/partials/common/components/editable-description-msg-read-mode.jade
new file mode 100644
index 00000000..2ca9dae8
--- /dev/null
+++ b/app/partials/common/components/editable-description-msg-read-mode.jade
@@ -0,0 +1 @@
+p.no-description No description yet.
\ No newline at end of file
diff --git a/app/partials/common/components/editable-description.jade b/app/partials/common/components/editable-description.jade
new file mode 100644
index 00000000..41d3bcf2
--- /dev/null
+++ b/app/partials/common/components/editable-description.jade
@@ -0,0 +1,11 @@
+.view-description
+ section.us-content.wysiwyg(tg-bind-html="item.description_html || noDescriptionMsg")
+ span.edit.icon.icon-edit
+
+.edit-description
+ textarea(placeholder="Empty space is so boring... go on be descriptive... A rose by any other name would smell as sweet...", ng-model="item.description", tg-markitup="tg-markitup")
+ a.help-markdown(href="https://taiga.io/support/taiga-markdown-syntax/", target="_blank", title="Mardown syntax help")
+ span.icon.icon-help
+ span Markdown syntax help
+ span.save-container
+ a.save.icon.icon-floppy(href="", title="Save")
diff --git a/app/partials/common/components/editable-subject.jade b/app/partials/common/components/editable-subject.jade
new file mode 100644
index 00000000..85958e88
--- /dev/null
+++ b/app/partials/common/components/editable-subject.jade
@@ -0,0 +1,7 @@
+.view-subject
+ | {{ item.subject }}
+ a.edit.icon.icon-edit(href="" title="Edit")
+.edit-subject
+ input(type="text", ng-model="item.subject", data-required="true", data-maxlength="500")
+ span.save-container
+ a.save.icon.icon-floppy(href="", title="Save")
diff --git a/app/partials/common/components/level.jade b/app/partials/common/components/level.jade
new file mode 100644
index 00000000..bd4182a8
--- /dev/null
+++ b/app/partials/common/components/level.jade
@@ -0,0 +1 @@
+div.level
\ No newline at end of file
diff --git a/app/partials/common/components/list-item-assigned-to-avatar.jade b/app/partials/common/components/list-item-assigned-to-avatar.jade
new file mode 100644
index 00000000..78971529
--- /dev/null
+++ b/app/partials/common/components/list-item-assigned-to-avatar.jade
@@ -0,0 +1,3 @@
+figure.avatar
+ img(src!="<%- imgurl %>", alt!="<%- name %>")
+ figcaption <%- name %>
diff --git a/app/partials/common/components/main-title.jade b/app/partials/common/components/main-title.jade
new file mode 100644
index 00000000..6b44ed63
--- /dev/null
+++ b/app/partials/common/components/main-title.jade
@@ -0,0 +1,2 @@
+span.project-name <%- projectName %>
+span.green <%- sectionName %>
\ No newline at end of file
diff --git a/app/partials/common/components/progress-bar.jade b/app/partials/common/components/progress-bar.jade
new file mode 100644
index 00000000..724d2342
--- /dev/null
+++ b/app/partials/common/components/progress-bar.jade
@@ -0,0 +1 @@
+.current-progress(style!="width: <%- percentage %>%")
\ No newline at end of file
diff --git a/app/partials/common/components/status-display.jade b/app/partials/common/components/status-display.jade
new file mode 100644
index 00000000..fd283835
--- /dev/null
+++ b/app/partials/common/components/status-display.jade
@@ -0,0 +1,9 @@
+span
+ <% if (status.is_closed) { %>
+ | Closed
+ <% } else { %>
+ | Open
+ <% } %>
+
+span(class="us-detail-status", style!="color:<%- status.color %>")
+ | <%- status.name %>
diff --git a/app/partials/common/components/watchers.jade b/app/partials/common/components/watchers.jade
new file mode 100644
index 00000000..1361d34c
--- /dev/null
+++ b/app/partials/common/components/watchers.jade
@@ -0,0 +1,23 @@
+<% if(isEditable){ %>
+.watchers-header
+ span.title watchers
+ a.icon.icon-plus.add-watcher(href="", title="Add watcher")
+<% } else if(watchers.length > 0){ %>
+.watchers-header
+ span.title watchers
+<% }; %>
+
+<% _.each(watchers, function(watcher) { %>
+<% if(watcher) { %>
+.watcher-single
+ .watcher-avatar
+ span.avatar(title!="<%- watcher.full_name_display %>")
+ img(src!="<%- watcher.photo %>" alt!="<%- watcher.full_name_display %>")
+ .watcher-name
+ span <%- watcher.full_name_display %>
+
+ <% if(isEditable){ %>
+ a.icon.icon-delete(data-watcher-id!="<%- watcher.id %>" href="" title="delete-watcher")
+ <% }; %>
+<% } %>
+<% }); %>
\ No newline at end of file
diff --git a/app/partials/common/estimation/lb-us-estimation-points-per-role.jade b/app/partials/common/estimation/lb-us-estimation-points-per-role.jade
new file mode 100644
index 00000000..e49e6628
--- /dev/null
+++ b/app/partials/common/estimation/lb-us-estimation-points-per-role.jade
@@ -0,0 +1,9 @@
+ul.points-per-role
+ li.total
+ span.points <%- totalPoints %>
+ span.role total
+ <% _.each(roles, function(role) { %>
+ li.total.clickable(data-role-id!="<%- role.id %>")
+ span.points <%- role.points %>
+ span.role <%- role.name %>
+ <% }); %>
diff --git a/app/partials/common/estimation/lb-us-estimation-points.jade b/app/partials/common/estimation/lb-us-estimation-points.jade
new file mode 100644
index 00000000..04fbceaf
--- /dev/null
+++ b/app/partials/common/estimation/lb-us-estimation-points.jade
@@ -0,0 +1,13 @@
+ul.popover.pop-points-open
+ <% _.each(points, function(point) { %>
+ li
+ <% if (point.selected) { %>
+ a(href="", class="point", title!="<%- point.name %>",
+ data-point-id!="<%- point.id %>", data-role-id!="<%- roleId %>")
+ | <%- point.name %>
+ <% } else { %>
+ a(href="", class="point active", title!="<%- point.name %>",
+ data-point-id!="<%- point.id %>" data-role-id!="<%- roleId %>")
+ | <%- point.name %>
+ <% } %>
+ <% }); %>
diff --git a/app/partials/common/estimation/us-estimation-points-per-role.jade b/app/partials/common/estimation/us-estimation-points-per-role.jade
new file mode 100644
index 00000000..e905cf6b
--- /dev/null
+++ b/app/partials/common/estimation/us-estimation-points-per-role.jade
@@ -0,0 +1,9 @@
+ul.points-per-role
+ li.total
+ span.points <%- totalPoints %>
+ span.role total
+ <% _.each(roles, function(role) { %>
+ li(class!="total <% if(editable){ %>clickable<% } %>", data-role-id!="<%- role.id %>")
+ span.points <%- role.points %>
+ span.role <%- role.name %>
+ <% }); %>
diff --git a/app/partials/common/estimation/us-estimation-points.jade b/app/partials/common/estimation/us-estimation-points.jade
new file mode 100644
index 00000000..1fb05d0b
--- /dev/null
+++ b/app/partials/common/estimation/us-estimation-points.jade
@@ -0,0 +1,13 @@
+ul.popover.pop-points-open
+ <% _.each(points, function(point) { %>
+ li
+ <% if (point.selected) { %>
+ a(href="", class="point", title!="<%- point.name %>",
+ data-point-id!="<%- point.id %>", data-role-id!="<%- roleId %>")
+ | <%- point.name %>
+ <% } else { %>
+ a(href="", class="point active", title!="<%- point.name %>",
+ data-point-id!="<%- point.id %>", data-role-id!="<%- roleId %>")
+ | <%- point.name %>
+ <% } %>
+ <% }); %>
\ No newline at end of file
diff --git a/app/partials/common/history/history-activity.jade b/app/partials/common/history/history-activity.jade
new file mode 100644
index 00000000..d554f5ca
--- /dev/null
+++ b/app/partials/common/history/history-activity.jade
@@ -0,0 +1,35 @@
+div(class!="activity-single <%- mode %>")
+ .activity-user
+ a.avatar(href="" title!="<%- userFullName %>")
+ img(src!="<%- avatar %>", alt!="<%- userFullName %>")
+ .activity-content
+ .activity-username
+ a.username(href="", title="<%- userFullName %>")
+ | <%- userFullName %>
+ span.date
+ | <%- creationDate %>
+
+ <% if (comment.length > 0) { %>
+ <% if ((deleteCommentDate || deleteCommentUser)) { %>
+ .deleted-comment
+ span
+ | Comment deleted by <%- deleteCommentUser %> on <%- deleteCommentDate %>
+ <% } %>
+ .comment.wysiwyg
+ | <%= comment %>
+ <% if (!deleteCommentDate && mode !== "activity" && canDeleteComment) { %>
+ a(href="", class="icon icon-delete comment-delete", data-activity-id!="<%- activityId %>")
+ <% } %>
+ <% } %>
+
+ <% if(changes.length > 0) { %>
+ .changes
+ <% if (mode != "activity") { %>
+ a.changes-title(href="", title="Show activity")
+ span <%- changesText %>
+ span.icon.icon-arrow-up
+ <% } %>
+ <% _.each(changes, function(change) { %>
+ | <%= change %>
+ <% }) %>
+ <% } %>
diff --git a/app/partials/common/history/history-base-entries.jade b/app/partials/common/history/history-base-entries.jade
new file mode 100644
index 00000000..c9f566da
--- /dev/null
+++ b/app/partials/common/history/history-base-entries.jade
@@ -0,0 +1,7 @@
+<% if (showMore > 0) { %>
+a(href="" title="Show more" class="show-more show-more-comments")
+ | + Show previous entries (<%- showMore %> more)
+<% } %>
+<% _.each(entries, function(entry) { %>
+<%= entry %>
+<% }) %>
\ No newline at end of file
diff --git a/app/partials/common/history/history-base.jade b/app/partials/common/history/history-base.jade
new file mode 100644
index 00000000..cd3cfc41
--- /dev/null
+++ b/app/partials/common/history/history-base.jade
@@ -0,0 +1,23 @@
+section.history
+ ul.history-tabs
+ li
+ a(href="#", class="active")
+ span.icon.icon-comment
+ span.tab-title Comments
+ li
+ a(href="#")
+ span.icon.icon-issues
+ span.tab-title Activity
+ section.history-comments
+ .comments-list
+ div(tg-check-permission!="modify_<%- type %>", tg-toggle-comment, class="add-comment")
+ textarea(placeholder="Type a new comment here",
+ ng-model!="<%- ngmodel %>.comment", tg-markitup="tg-markitup")
+ <% if (mode !== "edit") { %>
+ a(class="help-markdown", href="https://taiga.io/support/taiga-markdown-syntax/", target="_blank", title="Mardown syntax help")
+ span.icon.icon-help
+ span Markdown syntax help
+ a(href="", title="Comment", class="button button-green save-comment") Comment
+ <% } %>
+ section.history-activity.hidden
+ .changes-list
diff --git a/app/partials/common/history/history-change-attachment.jade b/app/partials/common/history/history-change-attachment.jade
new file mode 100644
index 00000000..8b4ac0f1
--- /dev/null
+++ b/app/partials/common/history/history-change-attachment.jade
@@ -0,0 +1,14 @@
+.change-entry
+ .activity-changed
+ span <%- name %>
+ .activity-fromto
+ <% _.each(diff, function(change) { %>
+ p
+ strong <%- change.name %> from
+ br
+ span <%- change.from %>
+ p
+ strong <%- change.name %> to
+ br
+ span <%- change.to %>
+ <% }) %>
diff --git a/app/partials/common/history/history-change-diff.jade b/app/partials/common/history/history-change-diff.jade
new file mode 100644
index 00000000..13e137bd
--- /dev/null
+++ b/app/partials/common/history/history-change-diff.jade
@@ -0,0 +1,6 @@
+.change-entry
+ .activity-changed
+ span <%- name %>
+ .activity-fromto
+ p
+ span <%= diff %>
diff --git a/app/partials/common/history/history-change-generic.jade b/app/partials/common/history/history-change-generic.jade
new file mode 100644
index 00000000..a5fbb73b
--- /dev/null
+++ b/app/partials/common/history/history-change-generic.jade
@@ -0,0 +1,12 @@
+.change-entry
+ .activity-changed
+ span <%- name %>
+ .activity-fromto
+ p
+ strong from
+ br
+ span <%- from %>
+ p
+ strong to
+ br
+ span <%- to %>
diff --git a/app/partials/common/history/history-change-points.jade b/app/partials/common/history/history-change-points.jade
new file mode 100644
index 00000000..d226cd79
--- /dev/null
+++ b/app/partials/common/history/history-change-points.jade
@@ -0,0 +1,14 @@
+<% _.each(points, function(point, name) { %>
+.change-entry
+ .activity-changed
+ span US points (<%- name.toLowerCase() %>)
+ .activity-fromto
+ p
+ strong from
+ br
+ span <%- point[0] %>
+ p
+ strong to
+ br
+ span <%- point[1] %>
+<% }); %>
\ No newline at end of file
diff --git a/app/partials/common/history/history-deleted-comment.jade b/app/partials/common/history/history-deleted-comment.jade
new file mode 100644
index 00000000..434a84c2
--- /dev/null
+++ b/app/partials/common/history/history-deleted-comment.jade
@@ -0,0 +1,11 @@
+.activity-single.comment.deleted-comment
+ div
+ span Comment deleted by <%- deleteCommentUser %> on <%- deleteCommentDate %>
+ a(href="", title="Show comment", class="show-deleted-comment") (Show deleted comment)
+ a(href="", title="Show comment", class="hide-deleted-comment hidden") (Hide deleted comment)
+ .comment-body.wysiwyg <%= deleteComment %>
+ <% if (canRestoreComment) { %>
+ a(href="", class="comment-restore", data-activity-id!="<%- activityId %>")
+ span.icon.icon-reload
+ span Restore comment
+ <% } %>
diff --git a/app/partials/common/lightbox/lightbox-assigned-to-users.jade b/app/partials/common/lightbox/lightbox-assigned-to-users.jade
new file mode 100644
index 00000000..d734bc8a
--- /dev/null
+++ b/app/partials/common/lightbox/lightbox-assigned-to-users.jade
@@ -0,0 +1,23 @@
+<% if (selected) { %>
+.watcher-single.active
+ .watcher-avatar
+ a(href="", title="Assigned to", class="avatar")
+ img(src!="<%- selected.photo %>")
+ a(href="", title!="<%- selected.full_name_display %>", class="watcher-name")
+ | <%-selected.full_name_display %>
+ a(href="", title="Remove assigned", class="icon icon-delete remove-assigned-to")
+<% } %>
+
+<% _.each(users, function(user) { %>
+.watcher-single(data-user-id!="<%- user.id %>")
+ .watcher-avatar
+ a(href="#", title="Assigned to", class="avatar")
+ img(src!="<%- user.photo %>")
+ a(href="", title!="<%- user.full_name_display %>", class="watcher-name")
+ | <%- user.full_name_display %>
+<% }) %>
+
+<% if (showMore) { %>
+div(ng-show="filteringUsers", class="more-watchers")
+ span ...too many users, keep filtering
+<% } %>
\ No newline at end of file
diff --git a/app/partials/views/modules/lightbox-assigned-to.jade b/app/partials/common/lightbox/lightbox-assigned-to.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-assigned-to.jade
rename to app/partials/common/lightbox/lightbox-assigned-to.jade
diff --git a/app/partials/views/modules/lightbox-block.jade b/app/partials/common/lightbox/lightbox-block.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-block.jade
rename to app/partials/common/lightbox/lightbox-block.jade
diff --git a/app/partials/common/lightbox/lightbox-blocking-message-input.jade b/app/partials/common/lightbox/lightbox-blocking-message-input.jade
new file mode 100644
index 00000000..63c0b0a8
--- /dev/null
+++ b/app/partials/common/lightbox/lightbox-blocking-message-input.jade
@@ -0,0 +1,4 @@
+fieldset.blocked-note.hidden
+ textarea(name="blocked_note",
+ placeholder="Why is this user story blocked?",
+ ng-model!="<%- ngmodel %>")
diff --git a/app/partials/views/modules/lightbox-users.jade b/app/partials/common/lightbox/lightbox-users.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-users.jade
rename to app/partials/common/lightbox/lightbox-users.jade
diff --git a/app/partials/common/popover/popover-related-task-status.jade b/app/partials/common/popover/popover-related-task-status.jade
new file mode 100644
index 00000000..46f13157
--- /dev/null
+++ b/app/partials/common/popover/popover-related-task-status.jade
@@ -0,0 +1,6 @@
+ul.popover.pop-status
+ <% _.forEach(statuses, function(status) { %>
+ li
+ a(href="", class="status", title!="<%- status.name %>", data-status-id!="<%- status.id %>")
+ | <%- status.name %>
+ <% }); %>
diff --git a/app/partials/common/popover/popover-us-status.jade b/app/partials/common/popover/popover-us-status.jade
new file mode 100644
index 00000000..f9ca37fa
--- /dev/null
+++ b/app/partials/common/popover/popover-us-status.jade
@@ -0,0 +1,6 @@
+ul.popover.pop-status
+ <% _.each(statuses, function(status) { %>
+ li
+ a(href="", class="status", title!="<%- status.name %>", data-status-id!="<%- status.id %>")
+ | <%- status.name %>
+ <% }); %>
diff --git a/app/partials/common/tag/lb-tag-line-tags.jade b/app/partials/common/tag/lb-tag-line-tags.jade
new file mode 100644
index 00000000..203e54bc
--- /dev/null
+++ b/app/partials/common/tag/lb-tag-line-tags.jade
@@ -0,0 +1,5 @@
+<% _.each(tags, function(tag) { %>
+span(class="tag", style!="<%- tag.style %>")
+ span.tag-name <%- tag.name %>
+ a(href="", title="delete tag", class="icon icon-delete")
+<% }); %>
\ No newline at end of file
diff --git a/app/partials/common/tag/lb-tag-line.jade b/app/partials/common/tag/lb-tag-line.jade
new file mode 100644
index 00000000..22b8813b
--- /dev/null
+++ b/app/partials/common/tag/lb-tag-line.jade
@@ -0,0 +1,3 @@
+.tags-container
+input(type="text", placeholder="I'm it! Tag me...", class="tag-input")
+a(href="", title="Save", class="save icon icon-floppy hidden")
diff --git a/app/partials/common/tag/tag-line.jade b/app/partials/common/tag/tag-line.jade
new file mode 100644
index 00000000..cdac294f
--- /dev/null
+++ b/app/partials/common/tag/tag-line.jade
@@ -0,0 +1,7 @@
+.tags-container
+a(href="#", class="add-tag hidden", title="Add tag")
+ span.icon.icon-plus
+ span.add-tag-text Add tag
+
+input(type="text", placeholder="I'm it! Tag me...", class="tag-input hidden")
+a(href="", title="Save", class="save icon icon-floppy hidden")
\ No newline at end of file
diff --git a/app/partials/common/tag/tags-line-tags.jade b/app/partials/common/tag/tags-line-tags.jade
new file mode 100644
index 00000000..5be6c1fa
--- /dev/null
+++ b/app/partials/common/tag/tags-line-tags.jade
@@ -0,0 +1,7 @@
+<% _.each(tags, function(tag) { %>
+span(class="tag", style!="border-left: 5px solid <%- tag.color %>;")
+ span.tag-name <%- tag.name %>
+ <% if (isEditable) { %>
+ a(href="", title="delete tag", class="icon icon-delete")
+ <% } %>
+<% }); %>
\ No newline at end of file
diff --git a/app/partials/common/wysiwyg/wysiwyg-markitup-preview.jade b/app/partials/common/wysiwyg/wysiwyg-markitup-preview.jade
new file mode 100644
index 00000000..814b728f
--- /dev/null
+++ b/app/partials/common/wysiwyg/wysiwyg-markitup-preview.jade
@@ -0,0 +1,5 @@
+.preview
+ .actions
+ a(href="#" title="Edit" class="icon icon-edit edit")
+ .content.wysiwyg
+ | <%= data %>
diff --git a/app/partials/contrib/main.jade b/app/partials/contrib/main.jade
index 82c097f8..80474817 100644
--- a/app/partials/contrib/main.jade
+++ b/app/partials/contrib/main.jade
@@ -4,9 +4,9 @@ block head
block content
div.wrapper.roles(ng-init="section='admin'", ng-controller="ContribController as ctrl")
sidebar.menu-secondary.sidebar(tg-admin-navigation="contrib")
- include ../views/modules/admin-menu
+ include ../includes/modules/admin-menu
sidebar.menu-tertiary.sidebar
- include ../views/modules/admin-submenu-contrib
+ include ../includes/modules/admin/admin-submenu-contrib
section.main.admin-common.admin-contrib(ng-include="pluginTemplate")
diff --git a/app/partials/dummy-layout.jade b/app/partials/dummy-layout.jade
deleted file mode 100644
index 6eff8e3c..00000000
--- a/app/partials/dummy-layout.jade
+++ /dev/null
@@ -1 +0,0 @@
-block content
diff --git a/app/partials/error.jade b/app/partials/error/error.jade
similarity index 100%
rename from app/partials/error.jade
rename to app/partials/error/error.jade
diff --git a/app/partials/not-found.jade b/app/partials/error/not-found.jade
similarity index 100%
rename from app/partials/not-found.jade
rename to app/partials/error/not-found.jade
diff --git a/app/partials/permission-denied.jade b/app/partials/error/permission-denied.jade
similarity index 100%
rename from app/partials/permission-denied.jade
rename to app/partials/error/permission-denied.jade
diff --git a/app/partials/forgot-password.jade b/app/partials/forgot-password.jade
deleted file mode 100644
index f5504c25..00000000
--- a/app/partials/forgot-password.jade
+++ /dev/null
@@ -1,15 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- include views/components/beta
- div.wrapper
- div.login-main
- div.login-container
- img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
- h1.logo Taiga
- h2.tagline LOVE YOUR PROJECT
-
- include views/modules/forgot-form
diff --git a/app/partials/views/components/addnewtask.jade b/app/partials/includes/components/addnewtask.jade
similarity index 100%
rename from app/partials/views/components/addnewtask.jade
rename to app/partials/includes/components/addnewtask.jade
diff --git a/app/partials/views/components/addnewus.jade b/app/partials/includes/components/addnewus.jade
similarity index 100%
rename from app/partials/views/components/addnewus.jade
rename to app/partials/includes/components/addnewus.jade
diff --git a/app/partials/views/components/backlog-row.jade b/app/partials/includes/components/backlog-row.jade
similarity index 100%
rename from app/partials/views/components/backlog-row.jade
rename to app/partials/includes/components/backlog-row.jade
diff --git a/app/partials/views/components/beta.jade b/app/partials/includes/components/beta.jade
similarity index 100%
rename from app/partials/views/components/beta.jade
rename to app/partials/includes/components/beta.jade
diff --git a/app/partials/views/components/filter.jade b/app/partials/includes/components/filter.jade
similarity index 100%
rename from app/partials/views/components/filter.jade
rename to app/partials/includes/components/filter.jade
diff --git a/app/partials/views/components/help-notion-button.jade b/app/partials/includes/components/help-notion-button.jade
similarity index 100%
rename from app/partials/views/components/help-notion-button.jade
rename to app/partials/includes/components/help-notion-button.jade
diff --git a/app/partials/views/components/kanban-task.jade b/app/partials/includes/components/kanban-task.jade
similarity index 100%
rename from app/partials/views/components/kanban-task.jade
rename to app/partials/includes/components/kanban-task.jade
diff --git a/app/partials/views/components/large-summary.jade b/app/partials/includes/components/large-summary.jade
similarity index 100%
rename from app/partials/views/components/large-summary.jade
rename to app/partials/includes/components/large-summary.jade
diff --git a/app/partials/views/components/loading-bar.jade b/app/partials/includes/components/loading-bar.jade
similarity index 100%
rename from app/partials/views/components/loading-bar.jade
rename to app/partials/includes/components/loading-bar.jade
diff --git a/app/partials/views/components/mainTitle.jade b/app/partials/includes/components/mainTitle.jade
similarity index 100%
rename from app/partials/views/components/mainTitle.jade
rename to app/partials/includes/components/mainTitle.jade
diff --git a/app/partials/views/components/notification-message.jade b/app/partials/includes/components/notification-message.jade
similarity index 100%
rename from app/partials/views/components/notification-message.jade
rename to app/partials/includes/components/notification-message.jade
diff --git a/app/partials/views/components/select-color.jade b/app/partials/includes/components/select-color.jade
similarity index 100%
rename from app/partials/views/components/select-color.jade
rename to app/partials/includes/components/select-color.jade
diff --git a/app/partials/views/components/sprint-summary.jade b/app/partials/includes/components/sprint-summary.jade
similarity index 100%
rename from app/partials/views/components/sprint-summary.jade
rename to app/partials/includes/components/sprint-summary.jade
diff --git a/app/partials/views/components/summary.jade b/app/partials/includes/components/summary.jade
similarity index 100%
rename from app/partials/views/components/summary.jade
rename to app/partials/includes/components/summary.jade
diff --git a/app/partials/views/components/taskboard-task.jade b/app/partials/includes/components/taskboard-task.jade
similarity index 100%
rename from app/partials/views/components/taskboard-task.jade
rename to app/partials/includes/components/taskboard-task.jade
diff --git a/app/partials/views/components/watchers.jade b/app/partials/includes/components/watchers.jade
similarity index 100%
rename from app/partials/views/components/watchers.jade
rename to app/partials/includes/components/watchers.jade
diff --git a/app/partials/views/modules/admin-menu.jade b/app/partials/includes/modules/admin-menu.jade
similarity index 100%
rename from app/partials/views/modules/admin-menu.jade
rename to app/partials/includes/modules/admin-menu.jade
diff --git a/app/partials/views/modules/admin-submenu-project-profile.jade b/app/partials/includes/modules/admin-submenu-project-profile.jade
similarity index 100%
rename from app/partials/views/modules/admin-submenu-project-profile.jade
rename to app/partials/includes/modules/admin-submenu-project-profile.jade
diff --git a/app/partials/views/modules/admin-submenu-project-values.jade b/app/partials/includes/modules/admin-submenu-project-values.jade
similarity index 100%
rename from app/partials/views/modules/admin-submenu-project-values.jade
rename to app/partials/includes/modules/admin-submenu-project-values.jade
diff --git a/app/partials/views/modules/admin-submenu-roles.jade b/app/partials/includes/modules/admin-submenu-roles.jade
similarity index 100%
rename from app/partials/views/modules/admin-submenu-roles.jade
rename to app/partials/includes/modules/admin-submenu-roles.jade
diff --git a/app/partials/views/modules/admin-submenu-third-parties.jade b/app/partials/includes/modules/admin-submenu-third-parties.jade
similarity index 100%
rename from app/partials/views/modules/admin-submenu-third-parties.jade
rename to app/partials/includes/modules/admin-submenu-third-parties.jade
diff --git a/app/partials/views/modules/admin-submenu.jade b/app/partials/includes/modules/admin-submenu.jade
similarity index 100%
rename from app/partials/views/modules/admin-submenu.jade
rename to app/partials/includes/modules/admin-submenu.jade
diff --git a/app/partials/views/modules/admin/admin-membership-table.jade b/app/partials/includes/modules/admin/admin-membership-table.jade
similarity index 100%
rename from app/partials/views/modules/admin/admin-membership-table.jade
rename to app/partials/includes/modules/admin/admin-membership-table.jade
diff --git a/app/partials/views/modules/admin-submenu-contrib.jade b/app/partials/includes/modules/admin/admin-submenu-contrib.jade
similarity index 100%
rename from app/partials/views/modules/admin-submenu-contrib.jade
rename to app/partials/includes/modules/admin/admin-submenu-contrib.jade
diff --git a/app/partials/views/modules/admin/default-values.jade b/app/partials/includes/modules/admin/default-values.jade
similarity index 100%
rename from app/partials/views/modules/admin/default-values.jade
rename to app/partials/includes/modules/admin/default-values.jade
diff --git a/app/partials/views/modules/admin/project-points.jade b/app/partials/includes/modules/admin/project-points.jade
similarity index 100%
rename from app/partials/views/modules/admin/project-points.jade
rename to app/partials/includes/modules/admin/project-points.jade
diff --git a/app/partials/views/modules/admin/project-status.jade b/app/partials/includes/modules/admin/project-status.jade
similarity index 100%
rename from app/partials/views/modules/admin/project-status.jade
rename to app/partials/includes/modules/admin/project-status.jade
diff --git a/app/partials/views/modules/admin/project-types.jade b/app/partials/includes/modules/admin/project-types.jade
similarity index 100%
rename from app/partials/views/modules/admin/project-types.jade
rename to app/partials/includes/modules/admin/project-types.jade
diff --git a/app/partials/views/modules/admin/project-us-status.jade b/app/partials/includes/modules/admin/project-us-status.jade
similarity index 100%
rename from app/partials/views/modules/admin/project-us-status.jade
rename to app/partials/includes/modules/admin/project-us-status.jade
diff --git a/app/partials/views/modules/backlog-filters.jade b/app/partials/includes/modules/backlog-filters.jade
similarity index 100%
rename from app/partials/views/modules/backlog-filters.jade
rename to app/partials/includes/modules/backlog-filters.jade
diff --git a/app/partials/views/modules/backlog-table.jade b/app/partials/includes/modules/backlog-table.jade
similarity index 91%
rename from app/partials/views/modules/backlog-table.jade
rename to app/partials/includes/modules/backlog-table.jade
index 95375e3c..4ba4b854 100644
--- a/app/partials/views/modules/backlog-table.jade
+++ b/app/partials/includes/modules/backlog-table.jade
@@ -1,6 +1,6 @@
div.backlog-table-header
div.row.backlog-table-title
- div.user-stories User Stories
+ div.user-stories User Storiess
div.status Status
div.points(tg-us-role-points-selector, title="Select view per Role")
span.header-points Points
diff --git a/app/partials/views/modules/burndown.jade b/app/partials/includes/modules/burndown.jade
similarity index 100%
rename from app/partials/views/modules/burndown.jade
rename to app/partials/includes/modules/burndown.jade
diff --git a/app/partials/views/modules/cancel-account-form.jade b/app/partials/includes/modules/cancel-account-form.jade
similarity index 100%
rename from app/partials/views/modules/cancel-account-form.jade
rename to app/partials/includes/modules/cancel-account-form.jade
diff --git a/app/partials/views/modules/category-config.jade b/app/partials/includes/modules/category-config.jade
similarity index 100%
rename from app/partials/views/modules/category-config.jade
rename to app/partials/includes/modules/category-config.jade
diff --git a/app/partials/views/modules/change-email-form.jade b/app/partials/includes/modules/change-email-form.jade
similarity index 100%
rename from app/partials/views/modules/change-email-form.jade
rename to app/partials/includes/modules/change-email-form.jade
diff --git a/app/partials/views/modules/change-password-from-recovery-form.jade b/app/partials/includes/modules/change-password-from-recovery-form.jade
similarity index 100%
rename from app/partials/views/modules/change-password-from-recovery-form.jade
rename to app/partials/includes/modules/change-password-from-recovery-form.jade
diff --git a/app/partials/views/modules/colors-table.jade b/app/partials/includes/modules/colors-table.jade
similarity index 100%
rename from app/partials/views/modules/colors-table.jade
rename to app/partials/includes/modules/colors-table.jade
diff --git a/app/partials/views/modules/comment-activity.jade b/app/partials/includes/modules/comment-activity.jade
similarity index 100%
rename from app/partials/views/modules/comment-activity.jade
rename to app/partials/includes/modules/comment-activity.jade
diff --git a/app/partials/views/modules/filter-tags.jade b/app/partials/includes/modules/filter-tags.jade
similarity index 100%
rename from app/partials/views/modules/filter-tags.jade
rename to app/partials/includes/modules/filter-tags.jade
diff --git a/app/partials/views/modules/filters.jade b/app/partials/includes/modules/filters.jade
similarity index 100%
rename from app/partials/views/modules/filters.jade
rename to app/partials/includes/modules/filters.jade
diff --git a/app/partials/views/modules/forgot-form.jade b/app/partials/includes/modules/forgot-form.jade
similarity index 100%
rename from app/partials/views/modules/forgot-form.jade
rename to app/partials/includes/modules/forgot-form.jade
diff --git a/app/partials/views/modules/help-notions/lightbox-generic-notion.jade b/app/partials/includes/modules/help-notions/lightbox-generic-notion.jade
similarity index 100%
rename from app/partials/views/modules/help-notions/lightbox-generic-notion.jade
rename to app/partials/includes/modules/help-notions/lightbox-generic-notion.jade
diff --git a/app/partials/views/modules/help-notions/lightbox-notion-admin-project-values-us-points.jade b/app/partials/includes/modules/help-notions/lightbox-notion-admin-project-values-us-points.jade
similarity index 100%
rename from app/partials/views/modules/help-notions/lightbox-notion-admin-project-values-us-points.jade
rename to app/partials/includes/modules/help-notions/lightbox-notion-admin-project-values-us-points.jade
diff --git a/app/partials/views/modules/invitation-login-form.jade b/app/partials/includes/modules/invitation-login-form.jade
similarity index 100%
rename from app/partials/views/modules/invitation-login-form.jade
rename to app/partials/includes/modules/invitation-login-form.jade
diff --git a/app/partials/views/modules/invitation-register-form.jade b/app/partials/includes/modules/invitation-register-form.jade
similarity index 100%
rename from app/partials/views/modules/invitation-register-form.jade
rename to app/partials/includes/modules/invitation-register-form.jade
diff --git a/app/partials/views/modules/issues-filters.jade b/app/partials/includes/modules/issues-filters.jade
similarity index 100%
rename from app/partials/views/modules/issues-filters.jade
rename to app/partials/includes/modules/issues-filters.jade
diff --git a/app/partials/views/modules/issues-table.jade b/app/partials/includes/modules/issues-table.jade
similarity index 100%
rename from app/partials/views/modules/issues-table.jade
rename to app/partials/includes/modules/issues-table.jade
diff --git a/app/partials/views/modules/kanban-table.jade b/app/partials/includes/modules/kanban-table.jade
similarity index 100%
rename from app/partials/views/modules/kanban-table.jade
rename to app/partials/includes/modules/kanban-table.jade
diff --git a/app/partials/views/modules/lightbox-add-member.jade b/app/partials/includes/modules/lightbox-add-member.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-add-member.jade
rename to app/partials/includes/modules/lightbox-add-member.jade
diff --git a/app/partials/views/modules/lightbox-ask-choice.jade b/app/partials/includes/modules/lightbox-ask-choice.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-ask-choice.jade
rename to app/partials/includes/modules/lightbox-ask-choice.jade
diff --git a/app/partials/views/modules/lightbox-attachments.jade b/app/partials/includes/modules/lightbox-attachments.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-attachments.jade
rename to app/partials/includes/modules/lightbox-attachments.jade
diff --git a/app/partials/views/modules/lightbox-create-issue.jade b/app/partials/includes/modules/lightbox-create-issue.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-create-issue.jade
rename to app/partials/includes/modules/lightbox-create-issue.jade
diff --git a/app/partials/views/modules/lightbox-delete-project.jade b/app/partials/includes/modules/lightbox-delete-project.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-delete-project.jade
rename to app/partials/includes/modules/lightbox-delete-project.jade
diff --git a/app/partials/views/modules/lightbox-feedback.jade b/app/partials/includes/modules/lightbox-feedback.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-feedback.jade
rename to app/partials/includes/modules/lightbox-feedback.jade
diff --git a/app/partials/views/modules/lightbox-generic-ask.jade b/app/partials/includes/modules/lightbox-generic-ask.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-generic-ask.jade
rename to app/partials/includes/modules/lightbox-generic-ask.jade
diff --git a/app/partials/views/modules/lightbox-generic-error.jade b/app/partials/includes/modules/lightbox-generic-error.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-generic-error.jade
rename to app/partials/includes/modules/lightbox-generic-error.jade
diff --git a/app/partials/views/modules/lightbox-generic-success.jade b/app/partials/includes/modules/lightbox-generic-success.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-generic-success.jade
rename to app/partials/includes/modules/lightbox-generic-success.jade
diff --git a/app/partials/views/modules/lightbox-issue-bulk.jade b/app/partials/includes/modules/lightbox-issue-bulk.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-issue-bulk.jade
rename to app/partials/includes/modules/lightbox-issue-bulk.jade
diff --git a/app/partials/views/modules/lightbox-search.jade b/app/partials/includes/modules/lightbox-search.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-search.jade
rename to app/partials/includes/modules/lightbox-search.jade
diff --git a/app/partials/views/modules/lightbox-sprint-add-edit.jade b/app/partials/includes/modules/lightbox-sprint-add-edit.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-sprint-add-edit.jade
rename to app/partials/includes/modules/lightbox-sprint-add-edit.jade
diff --git a/app/partials/views/modules/lightbox-task-bulk.jade b/app/partials/includes/modules/lightbox-task-bulk.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-task-bulk.jade
rename to app/partials/includes/modules/lightbox-task-bulk.jade
diff --git a/app/partials/views/modules/lightbox-task-create-edit.jade b/app/partials/includes/modules/lightbox-task-create-edit.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-task-create-edit.jade
rename to app/partials/includes/modules/lightbox-task-create-edit.jade
diff --git a/app/partials/views/modules/lightbox-us-bulk.jade b/app/partials/includes/modules/lightbox-us-bulk.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-us-bulk.jade
rename to app/partials/includes/modules/lightbox-us-bulk.jade
diff --git a/app/partials/views/modules/lightbox-us-create-edit.jade b/app/partials/includes/modules/lightbox-us-create-edit.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-us-create-edit.jade
rename to app/partials/includes/modules/lightbox-us-create-edit.jade
diff --git a/app/partials/views/modules/list-filters-kanban.jade b/app/partials/includes/modules/list-filters-kanban.jade
similarity index 100%
rename from app/partials/views/modules/list-filters-kanban.jade
rename to app/partials/includes/modules/list-filters-kanban.jade
diff --git a/app/partials/views/modules/list-filters.jade b/app/partials/includes/modules/list-filters.jade
similarity index 100%
rename from app/partials/views/modules/list-filters.jade
rename to app/partials/includes/modules/list-filters.jade
diff --git a/app/partials/views/modules/loader.jade b/app/partials/includes/modules/loader.jade
similarity index 100%
rename from app/partials/views/modules/loader.jade
rename to app/partials/includes/modules/loader.jade
diff --git a/app/partials/views/modules/login-form.jade b/app/partials/includes/modules/login-form.jade
similarity index 100%
rename from app/partials/views/modules/login-form.jade
rename to app/partials/includes/modules/login-form.jade
diff --git a/app/partials/views/modules/nav.jade b/app/partials/includes/modules/nav.jade
similarity index 100%
rename from app/partials/views/modules/nav.jade
rename to app/partials/includes/modules/nav.jade
diff --git a/app/partials/views/modules/projects-nav.jade b/app/partials/includes/modules/projects-nav.jade
similarity index 100%
rename from app/partials/views/modules/projects-nav.jade
rename to app/partials/includes/modules/projects-nav.jade
diff --git a/app/partials/views/modules/register-form.jade b/app/partials/includes/modules/register-form.jade
similarity index 100%
rename from app/partials/views/modules/register-form.jade
rename to app/partials/includes/modules/register-form.jade
diff --git a/app/partials/views/modules/related-tasks.jade b/app/partials/includes/modules/related-tasks.jade
similarity index 100%
rename from app/partials/views/modules/related-tasks.jade
rename to app/partials/includes/modules/related-tasks.jade
diff --git a/app/partials/views/modules/search-filter.jade b/app/partials/includes/modules/search-filter.jade
similarity index 100%
rename from app/partials/views/modules/search-filter.jade
rename to app/partials/includes/modules/search-filter.jade
diff --git a/app/partials/views/modules/search-in.jade b/app/partials/includes/modules/search-in.jade
similarity index 100%
rename from app/partials/views/modules/search-in.jade
rename to app/partials/includes/modules/search-in.jade
diff --git a/app/partials/views/modules/search-result-issues-table.jade b/app/partials/includes/modules/search-result-issues-table.jade
similarity index 100%
rename from app/partials/views/modules/search-result-issues-table.jade
rename to app/partials/includes/modules/search-result-issues-table.jade
diff --git a/app/partials/views/modules/search-result-table.jade b/app/partials/includes/modules/search-result-table.jade
similarity index 100%
rename from app/partials/views/modules/search-result-table.jade
rename to app/partials/includes/modules/search-result-table.jade
diff --git a/app/partials/views/modules/sprint.jade b/app/partials/includes/modules/sprint.jade
similarity index 100%
rename from app/partials/views/modules/sprint.jade
rename to app/partials/includes/modules/sprint.jade
diff --git a/app/partials/views/modules/sprints.jade b/app/partials/includes/modules/sprints.jade
similarity index 100%
rename from app/partials/views/modules/sprints.jade
rename to app/partials/includes/modules/sprints.jade
diff --git a/app/partials/views/modules/taskboard-table.jade b/app/partials/includes/modules/taskboard-table.jade
similarity index 100%
rename from app/partials/views/modules/taskboard-table.jade
rename to app/partials/includes/modules/taskboard-table.jade
diff --git a/app/partials/views/modules/team/team-filters.jade b/app/partials/includes/modules/team/team-filters.jade
similarity index 100%
rename from app/partials/views/modules/team/team-filters.jade
rename to app/partials/includes/modules/team/team-filters.jade
diff --git a/app/partials/views/modules/team/team-table.jade b/app/partials/includes/modules/team/team-table.jade
similarity index 100%
rename from app/partials/views/modules/team/team-table.jade
rename to app/partials/includes/modules/team/team-table.jade
diff --git a/app/partials/views/modules/user-settings-menu.jade b/app/partials/includes/modules/user-settings-menu.jade
similarity index 100%
rename from app/partials/views/modules/user-settings-menu.jade
rename to app/partials/includes/modules/user-settings-menu.jade
diff --git a/app/partials/views/modules/user-settings/mail-notifications-table.jade b/app/partials/includes/modules/user-settings/mail-notifications-table.jade
similarity index 100%
rename from app/partials/views/modules/user-settings/mail-notifications-table.jade
rename to app/partials/includes/modules/user-settings/mail-notifications-table.jade
diff --git a/app/partials/views/modules/wiki-nav.jade b/app/partials/includes/modules/wiki-nav.jade
similarity index 100%
rename from app/partials/views/modules/wiki-nav.jade
rename to app/partials/includes/modules/wiki-nav.jade
diff --git a/app/partials/views/modules/wizard-create-project.jade b/app/partials/includes/modules/wizard-create-project.jade
similarity index 100%
rename from app/partials/views/modules/wizard-create-project.jade
rename to app/partials/includes/modules/wizard-create-project.jade
diff --git a/app/partials/invitation.jade b/app/partials/invitation.jade
deleted file mode 100644
index bd9ebed3..00000000
--- a/app/partials/invitation.jade
+++ /dev/null
@@ -1,22 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper
- div.invitation-main
- div.invitation-container(tg-invitation)
- figure.avatar
- a(href="", tg-bo-title="invitation.invited_by.full_name_display")
- img.avatar(tg-bo-src="invitation.invited_by.photo",
- tg-bo-alt="invitation.invited_by.full_name_display")
- span.person-name(tg-bo-bind="invitation.invited_by.full_name_display")
-
- span.invitation-text
- p has invited you to join the project
- p.project-name(tg-bo-bind="invitation.project_name")
-
- div.invitation-form
- include views/modules/invitation-login-form
- include views/modules/invitation-register-form
diff --git a/app/partials/issue/issue-paginator.jade b/app/partials/issue/issue-paginator.jade
new file mode 100644
index 00000000..618dd768
--- /dev/null
+++ b/app/partials/issue/issue-paginator.jade
@@ -0,0 +1,22 @@
+ul(class="paginator")
+ <% if (showPrevious) { %>
+ li(class="previous")
+ a(href="", class="previous next_prev_button", class="disabled")
+ span(i18next="pagination.prev") Prev
+ <% } %>
+ <% _.each(pages, function(item) { %>
+ li(class!="<%- item.classes %>")
+ <% if (item.type === "page") { %>
+ a(href="", data-pagenum!="<%- item.num %>") <%- item.num %>
+ <% } else if (item.type === "page-active") { %>
+ span(class="active") <%- item.num %>
+ <% } else { %>
+ span ...
+ <% } %>
+ <% }); %>
+
+ <% if (showNext) { %>
+ li(class="next")
+ a(href="", class="next next_prev_button", class="disabled")
+ span(i18next="pagination.next") Next
+ <% } %>
diff --git a/app/partials/issue/issue-priority-button.jade b/app/partials/issue/issue-priority-button.jade
new file mode 100644
index 00000000..d990b27e
--- /dev/null
+++ b/app/partials/issue/issue-priority-button.jade
@@ -0,0 +1,13 @@
+div(class!="priority-data <% if(editable){ %>clickable<% }%>")
+ span(class="level", style!="background-color:<%- priority.color %>")
+ span(class="priority-priority") <%- priority.name %>
+ <% if(editable){ %>
+ span(class="icon icon-arrow-bottom")
+ <% }%>
+ span(class="level-name") priority
+ ul(class="popover pop-priority")
+ <% _.each(priorityes, function(pr) { %>
+ li
+ a(href="", class="priority", title!="<%- pr.name %>",
+ data-priority-id!="<%- pr.id %>") <%- pr.name %>
+ <% }); %>
diff --git a/app/partials/issue/issue-severity-button.jade b/app/partials/issue/issue-severity-button.jade
new file mode 100644
index 00000000..ec114ab4
--- /dev/null
+++ b/app/partials/issue/issue-severity-button.jade
@@ -0,0 +1,15 @@
+div(class!="severity-data <% if(editable){ %>clickable<% }%>")
+ span(class="level", style!="background-color:<%- severity.color %>")
+ span(class="severity-severity") <%- severity.name %>
+ <% if(editable){ %>
+ span(class="icon icon-arrow-bottom")
+ <% }%>
+ span(class="level-name") severity
+
+ ul(class="popover pop-severity")
+ <% _.each(severityes, function(sv) { %>
+ li
+ a(href="" class="severity" title!="<%- sv.name %>"
+ data-severity-id!="<%- sv.id %>")
+ <%- sv.name %>
+ <% }); %>
diff --git a/app/partials/issue/issue-status-inline-edition-selection.jade b/app/partials/issue/issue-status-inline-edition-selection.jade
new file mode 100644
index 00000000..ca2ed768
--- /dev/null
+++ b/app/partials/issue/issue-status-inline-edition-selection.jade
@@ -0,0 +1,6 @@
+ul(class="popover pop-status")
+ <% _.forEach(statuses, function(status) { %>
+ li
+ a(href="" class="status", title!="<%- status.name %>", data-status-id!="<%- status.id %>")
+ | <%- status.name %>
+ <% }); %>
diff --git a/app/partials/issue/issue-type-button.jade b/app/partials/issue/issue-type-button.jade
new file mode 100644
index 00000000..64db0363
--- /dev/null
+++ b/app/partials/issue/issue-type-button.jade
@@ -0,0 +1,15 @@
+div(class!="type-data <% if(editable){ %>clickable<% }%>")
+ span(class="level", style!="background-color:<%- type.color %>")
+ span(class="type-type") <%- type.name %>
+ <% if(editable){ %>
+ span(class="icon icon-arrow-bottom")
+ <% }%>
+ span(class="level-name") type
+
+ ul(class="popover pop-type")
+ <% _.each(typees, function(tp) { %>
+ li
+ a(href="", class="type", title!="<%- tp.name %>",
+ data-type-id!="<%- tp.id %>")
+ | <%- tp.name %>
+ <% }); %>
diff --git a/app/partials/issue/issues-detail.jade b/app/partials/issue/issues-detail.jade
new file mode 100644
index 00000000..828907f7
--- /dev/null
+++ b/app/partials/issue/issues-detail.jade
@@ -0,0 +1,65 @@
+div.wrapper(ng-controller="IssueDetailController as ctrl",
+ ng-init="section='issues'")
+ div.main.us-detail
+ div.us-detail-header.header-with-actions
+ include ../includes/components/mainTitle
+
+ section.us-story-main-data
+ div.us-title(ng-class="{blocked: issue.is_blocked}")
+ h2.us-title-text
+ span.us-number(tg-bo-ref="issue.ref")
+ span.us-name(tg-editable-subject, ng-model="issue", required-perm="modify_issue")
+
+ p.us-related-task(ng-if="issue.generated_user_stories.length") This issue has been promoted to US:
+ a(ng-repeat="us in issue.generated_user_stories",
+ tg-check-permission="view_us", href="",
+ tg-bo-title="'#' + us.ref + ' ' + us.subject",
+ tg-nav="project-userstories-detail:project=project.slug, ref=us.ref")
+ span(tg-bo-ref="us.ref")
+
+ p.external-reference(ng-if="issue.external_reference") This issue has been created from
+ a(target="_blank", tg-bo-href="issue.external_reference[1]", title="Go to origin")
+ span {{ issue.external_reference[1] }}
+
+ p.block-desc-container(ng-show="issue.is_blocked")
+ span.block-description-title Blocked
+ span.block-description(ng-bind="issue.blocked_note || 'This issue is blocked'")
+
+ div.issue-nav
+ a.icon.icon-arrow-left(ng-show="previousUrl", tg-bo-href="previousUrl",
+ title="previous issue")
+ a.icon.icon-arrow-right(ng-show="nextUrl", tg-bo-href="nextUrl",
+ title="next issue")
+
+ div.tags-block(tg-tag-line, ng-model="issue", required-perm="modify_issue")
+
+ section.duty-content.wysiwyg(tg-editable-description, ng-model="issue", required-perm="modify_issue")
+
+ tg-attachments(ng-model="issue", type="issue")
+ tg-history(ng-model="issue", type="issue")
+
+ sidebar.menu-secondary.sidebar
+ section.us-status
+ h1(tg-issue-status-display, ng-model="issue")
+ tg-created-by-display.us-created-by(ng-model="issue")
+ div.duty-data-container
+ div.duty-data(tg-issue-type-button, ng-model="issue")
+ div.duty-data(tg-issue-severity-button, ng-model="issue")
+ div.duty-data(tg-issue-priority-button, ng-model="issue")
+ div.duty-data(tg-issue-status-button, ng-model="issue")
+
+ section.duty-assigned-to(tg-assigned-to, ng-model="issue", required-perm="modify_issue")
+
+ section.watchers(tg-watchers, ng-model="issue", required-perm="modify_issue")
+
+ section.us-detail-settings
+ tg-promote-issue-to-us-button(tg-check-permission="add_us", ng-model="issue")
+ tg-block-button(tg-check-permission="modify_issue", ng-model="issue")
+ tg-delete-button(tg-check-permission="delete_issue",
+ on-delete-title="'Delete issue'",
+ on-delete-go-to-url="onDeleteGoToUrl",
+ ng-model="issue")
+
+ div.lightbox.lightbox-block(tg-lb-block, title="Blocking issue", ng-model="issue")
+ div.lightbox.lightbox-select-user(tg-lb-assignedto)
+ div.lightbox.lightbox-select-user(tg-lb-watchers)
diff --git a/app/partials/issue/issues-filters-selected.jade b/app/partials/issue/issues-filters-selected.jade
new file mode 100644
index 00000000..90daaacc
--- /dev/null
+++ b/app/partials/issue/issues-filters-selected.jade
@@ -0,0 +1,8 @@
+<% _.each(filters, function(f) { %>
+a(class="single-filter selected",
+ data-type!="<%- f.type %>",
+ data-id!="<%- f.id %>")
+ span(class="name", style!="<%- f.style %>")
+ | <%- f.name %>
+ span(class="icon icon-delete")
+<% }) %>
\ No newline at end of file
diff --git a/app/partials/issue/issues-filters.jade b/app/partials/issue/issues-filters.jade
new file mode 100644
index 00000000..7c3eb0d5
--- /dev/null
+++ b/app/partials/issue/issues-filters.jade
@@ -0,0 +1,16 @@
+<% _.each(filters, function(f) { %>
+<% if (!f.selected) { %>
+a(class="single-filter", data-type!="<%- f.type %>", data-id!="<%- f.id %>")
+ span(class="name", style!="<%- f.style %>")
+ | <%- f.name %>
+ <% if (f.count){ %>
+ span(class="number") <%- f.count %>
+ <% } %>
+ <% if (f.type == "myFilters"){ %>
+ span(class="icon icon-delete")
+ <% } %>
+<% } %>
+<% }) %>
+span(class="new")
+input(class="hidden my-filter-name", type="text",
+ placeholder="Type a descriptive filter name and press Enter")
diff --git a/app/partials/issue/issues-status-button.jade b/app/partials/issue/issues-status-button.jade
new file mode 100644
index 00000000..d901bf10
--- /dev/null
+++ b/app/partials/issue/issues-status-button.jade
@@ -0,0 +1,15 @@
+div(class!="status-data <% if(editable){ %>clickable<% }%>")
+ span(class="level", style!="background-color:<%- status.color %>")
+ span(class="status-status") <%- status.name %>
+ <% if(editable){ %>
+ span(class="icon icon-arrow-bottom")
+ <% } %>
+ span(class="level-name") status
+
+ ul(class="popover pop-status")
+ <% _.each(statuses, function(st) { %>
+ li
+ a(href="", class="status", title!="<%- st.name %>",
+ data-status-id!="<%- st.id %>")
+ | <%- st.name %>
+ <% }); %>
diff --git a/app/partials/issue/issues-status-display.jade b/app/partials/issue/issues-status-display.jade
new file mode 100644
index 00000000..fd283835
--- /dev/null
+++ b/app/partials/issue/issues-status-display.jade
@@ -0,0 +1,9 @@
+span
+ <% if (status.is_closed) { %>
+ | Closed
+ <% } else { %>
+ | Open
+ <% } %>
+
+span(class="us-detail-status", style!="color:<%- status.color %>")
+ | <%- status.name %>
diff --git a/app/partials/issue/issues.jade b/app/partials/issue/issues.jade
new file mode 100644
index 00000000..be94a680
--- /dev/null
+++ b/app/partials/issue/issues.jade
@@ -0,0 +1,21 @@
+div.wrapper.issues(tg-issues, ng-controller="IssuesController as ctrl", ng-init="section='issues'")
+ sidebar.menu-secondary.extrabar.filters-bar(tg-issues-filters)
+ include ../includes/modules/issues-filters
+
+ section.main.issues-page
+ header
+ include ../includes/components/mainTitle
+
+ include ../includes/modules/list-filters
+ include ../includes/modules/issues-table
+
+ // Paginator is rendered using js.
+ div.paginator.issues-paginator
+
+ div.lightbox.lightbox-select-user(tg-lb-assignedto)
+
+ div.lightbox.lightbox-create-issue(tg-lb-create-issue)
+ include ../includes/modules/lightbox-create-issue
+
+ div.lightbox.lightbox-generic-bulk(tg-lb-create-bulk-issues)
+ include ../includes/modules/lightbox-issue-bulk
diff --git a/app/partials/issue/promote-issue-to-us-button.jade b/app/partials/issue/promote-issue-to-us-button.jade
new file mode 100644
index 00000000..baf86991
--- /dev/null
+++ b/app/partials/issue/promote-issue-to-us-button.jade
@@ -0,0 +1,2 @@
+a(class="button button-gray editable", tg-check-permission="add_us")
+ | Promote to User Story
diff --git a/app/partials/issues-detail.jade b/app/partials/issues-detail.jade
deleted file mode 100644
index 9fa95b0e..00000000
--- a/app/partials/issues-detail.jade
+++ /dev/null
@@ -1,71 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(ng-controller="IssueDetailController as ctrl",
- ng-init="section='issues'")
- div.main.us-detail
- div.us-detail-header.header-with-actions
- include views/components/mainTitle
-
- section.us-story-main-data
- div.us-title(ng-class="{blocked: issue.is_blocked}")
- h2.us-title-text
- span.us-number(tg-bo-ref="issue.ref")
- span.us-name(tg-editable-subject, ng-model="issue", required-perm="modify_issue")
-
- p.us-related-task(ng-if="issue.generated_user_stories.length") This issue has been promoted to US:
- a(ng-repeat="us in issue.generated_user_stories",
- tg-check-permission="view_us", href="",
- tg-bo-title="'#' + us.ref + ' ' + us.subject",
- tg-nav="project-userstories-detail:project=project.slug, ref=us.ref")
- span(tg-bo-ref="us.ref")
-
- p.external-reference(ng-if="issue.external_reference") This issue has been created from
- a(target="_blank", tg-bo-href="issue.external_reference[1]", title="Go to origin")
- span {{ issue.external_reference[1] }}
-
- p.block-desc-container(ng-show="issue.is_blocked")
- span.block-description-title Blocked
- span.block-description(ng-bind="issue.blocked_note || 'This issue is blocked'")
-
- div.issue-nav
- a.icon.icon-arrow-left(ng-show="previousUrl", tg-bo-href="previousUrl",
- title="previous issue")
- a.icon.icon-arrow-right(ng-show="nextUrl", tg-bo-href="nextUrl",
- title="next issue")
-
- div.tags-block(tg-tag-line, ng-model="issue", required-perm="modify_issue")
-
- section.duty-content.wysiwyg(tg-editable-description, ng-model="issue", required-perm="modify_issue")
-
- tg-attachments(ng-model="issue", type="issue")
- tg-history(ng-model="issue", type="issue")
-
- sidebar.menu-secondary.sidebar
- section.us-status
- h1(tg-issue-status-display, ng-model="issue")
- tg-created-by-display.us-created-by(ng-model="issue")
- div.duty-data-container
- div.duty-data(tg-issue-type-button, ng-model="issue")
- div.duty-data(tg-issue-severity-button, ng-model="issue")
- div.duty-data(tg-issue-priority-button, ng-model="issue")
- div.duty-data(tg-issue-status-button, ng-model="issue")
-
- section.duty-assigned-to(tg-assigned-to, ng-model="issue", required-perm="modify_issue")
-
- section.watchers(tg-watchers, ng-model="issue", required-perm="modify_issue")
-
- section.us-detail-settings
- tg-promote-issue-to-us-button(tg-check-permission="add_us", ng-model="issue")
- tg-block-button(tg-check-permission="modify_issue", ng-model="issue")
- tg-delete-button(tg-check-permission="delete_issue",
- on-delete-title="'Delete issue'",
- on-delete-go-to-url="onDeleteGoToUrl",
- ng-model="issue")
-
- div.lightbox.lightbox-block(tg-lb-block, title="Blocking issue", ng-model="issue")
- div.lightbox.lightbox-select-user(tg-lb-assignedto)
- div.lightbox.lightbox-select-user(tg-lb-watchers)
diff --git a/app/partials/issues.jade b/app/partials/issues.jade
deleted file mode 100644
index a233c230..00000000
--- a/app/partials/issues.jade
+++ /dev/null
@@ -1,27 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper.issues(tg-issues, ng-controller="IssuesController as ctrl", ng-init="section='issues'")
- sidebar.menu-secondary.extrabar.filters-bar(tg-issues-filters)
- include views/modules/issues-filters
-
- section.main.issues-page
- header
- include views/components/mainTitle
-
- include views/modules/list-filters
- include views/modules/issues-table
-
- // Paginator is rendered using js.
- div.paginator.issues-paginator
-
- div.lightbox.lightbox-select-user(tg-lb-assignedto)
-
- div.lightbox.lightbox-create-issue(tg-lb-create-issue)
- include views/modules/lightbox-create-issue
-
- div.lightbox.lightbox-generic-bulk(tg-lb-create-bulk-issues)
- include views/modules/lightbox-issue-bulk
diff --git a/app/partials/kanban.jade b/app/partials/kanban.jade
deleted file mode 100644
index b875221d..00000000
--- a/app/partials/kanban.jade
+++ /dev/null
@@ -1,29 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-kanban, ng-controller="KanbanController as ctrl"
- ng-init="section='kanban'")
- section.main.kanban
- header
- include views/components/mainTitle
- //- div.kanban-settings
- //- // a.button.button-trans(href="", title="Filter")
- //- // span.icon.icon-filter
- //- // span Filters
- //- //a.button.button-gray(href="", title="Filter")
- //- // span Show Statistics
- //-include views/components/large-summary
- //-include views/modules/burndown
- //-include views/modules/list-filters-kanban
- include views/modules/kanban-table
-
- div.lightbox.lightbox-generic-form.lb-create-edit-userstory(tg-lb-create-edit-userstory)
- include views/modules/lightbox-us-create-edit
-
- div.lightbox.lightbox-generic-bulk(tg-lb-create-bulk-userstories)
- include views/modules/lightbox-us-bulk
-
- div.lightbox.lightbox-select-user(tg-lb-assignedto)
diff --git a/app/partials/kanban/kanban-task.jade b/app/partials/kanban/kanban-task.jade
new file mode 100644
index 00000000..03739ccd
--- /dev/null
+++ b/app/partials/kanban/kanban-task.jade
@@ -0,0 +1,23 @@
+div.kanban-tagline(tg-colorize-tags="us.tags", tg-colorize-tags-type="kanban", ng-hide="us.isArchived")
+div.kanban-task-inner(ng-class="{'task-archived': us.isArchived}")
+ div(tg-kanban-user-avatar="us.assigned_to", ng-model="us", ng-hide="us.isArchived")
+ div.task-text(ng-hide="us.isArchived")
+ a.task-assigned(href="", title="Assign User Story")
+ span.task-num(tg-bo-ref="us.ref")
+ a.task-name(href="", title="See user story detail", ng-bind="us.subject",
+ tg-nav="project-userstories-detail:project=project.slug,ref=us.ref")
+
+ p.task-points(href="", title="Total Us points")
+ span(ng-if="us.total_points !== null", ng-bind="us.total_points")
+ span(ng-if="us.total_points !== null") points
+ span(ng-if="us.total_points === null") Not estimated
+
+ div.task-archived-text(ng-show="us.isArchived")
+ p You have archived
+ p
+ span.task-num(tg-bo-ref="us.ref")
+ span.task-name(ng-bind="us.subject")
+ p Drag & drop again to undo
+
+ a.icon.icon-edit(tg-check-permission="modify_us", href="", title="Edit", ng-hide="us.isArchived")
+ a.icon.icon-drag-h(tg-check-permission="modify_us", href="", title="Drag&Drop", ng-hide="us.isArchived")
diff --git a/app/partials/kanban/kanban.jade b/app/partials/kanban/kanban.jade
new file mode 100644
index 00000000..3a010018
--- /dev/null
+++ b/app/partials/kanban/kanban.jade
@@ -0,0 +1,23 @@
+div.wrapper(tg-kanban, ng-controller="KanbanController as ctrl"
+ ng-init="section='kanban'")
+ section.main.kanban
+ header
+ include ../includes/components/mainTitle
+ //- div.kanban-settings
+ //- // a.button.button-trans(href="", title="Filter")
+ //- // span.icon.icon-filter
+ //- // span Filters
+ //- //a.button.button-gray(href="", title="Filter")
+ //- // span Show Statistics
+ //-include ../includes/components/large-summary
+ //-include ../includes/modules/burndown
+ //-include ../includes/modules/list-filters-kanban
+ include ../includes/modules/kanban-table
+
+ div.lightbox.lightbox-generic-form.lb-create-edit-userstory(tg-lb-create-edit-userstory)
+ include ../includes/modules/lightbox-us-create-edit
+
+ div.lightbox.lightbox-generic-bulk(tg-lb-create-bulk-userstories)
+ include ../includes/modules/lightbox-us-bulk
+
+ div.lightbox.lightbox-select-user(tg-lb-assignedto)
diff --git a/app/partials/layout.jade b/app/partials/layout.jade
deleted file mode 100644
index 34e8146f..00000000
--- a/app/partials/layout.jade
+++ /dev/null
@@ -1,16 +0,0 @@
-doctype html
-html(lang="en")
- head
- title= Taiga
- meta(http-equiv="content-type", content="text/html; charset=utf-8")
- meta(name="description", content="Taiga Landing page")
- meta(name="keywords", content="Agile, Taiga, Management, Github")
- meta(name="viewport", content="width=device-width, user-scalable=no")
- link(rel="stylesheet", href="/styles/main.css")
- block head
- body
- include views/modules/projects-nav
- include views/modules/nav
-
- div.master
- block content
diff --git a/app/partials/login-layout.jade b/app/partials/login-layout.jade
deleted file mode 100644
index 3df75433..00000000
--- a/app/partials/login-layout.jade
+++ /dev/null
@@ -1,13 +0,0 @@
-doctype html
-html(lang="en")
- head
- title= Taiga
- meta(http-equiv="content-type", content="text/html; charset=utf-8")
- meta(name="description", content="Taiga Landing page")
- meta(name="keywords", content="Agile, Taiga, Management, Github")
- meta(name="viewport", content="width=device-width, user-scalable=no")
- link(rel="stylesheet", href="/styles/main.css")
- block head
- body
- div.master
- block content
diff --git a/app/partials/login.jade b/app/partials/login.jade
deleted file mode 100644
index 8883998b..00000000
--- a/app/partials/login.jade
+++ /dev/null
@@ -1,15 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- include views/components/beta
- div.wrapper
- div.login-main
- div.login-container
- img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
- h1.logo Taiga
- h2.tagline LOVE YOUR PROJECT
-
- include views/modules/login-form
diff --git a/app/partials/mail-notifications.jade b/app/partials/mail-notifications.jade
deleted file mode 100644
index e03c6b6f..00000000
--- a/app/partials/mail-notifications.jade
+++ /dev/null
@@ -1,19 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-user-notifications, ng-controller="UserNotificationsController as ctrl",
- ng-init="section='mail-notifications'")
- sidebar.menu-secondary.sidebar(tg-user-settings-navigation="mail-notifications")
- include views/modules/user-settings-menu
-
- section.main.admin-common
- header
- h1
- span.green(tg-bo-html="sectionName")
-
- p.total Notifications By Mail
-
- include views/modules/user-settings/mail-notifications-table
diff --git a/app/partials/project-colors.jade b/app/partials/project-colors.jade
deleted file mode 100644
index 6162be72..00000000
--- a/app/partials/project-colors.jade
+++ /dev/null
@@ -1,23 +0,0 @@
-extends layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper
- sidebar.menu-secondary.sidebar
- include views/modules/admin-menu
-
- sidebar.menu-tertiary.sidebar
- include views/modules/admin-submenu
-
- section.main.project-colors
- header
- include views/components/mainTitle
-
- div.project-colors-options
- a.button.button-green.new-color(href="")
- span.text
- | + Add new status
-
- include views/modules/colors-table
diff --git a/app/partials/project.jade b/app/partials/project.jade
deleted file mode 100644
index 1b60d370..00000000
--- a/app/partials/project.jade
+++ /dev/null
@@ -1,30 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(ng-controller="ProjectController as ctrl")
- section.main.single-project
- h1
- span.green(tg-bo-bind="project.name", class="project-name")
- div.summary
- ul.home-project-info-list
- li
- span.info-num(tg-bo-bind="stats.total_points")
- span.info-text project
points
- li
- span.info-num(tg-bo-bind="stats.defined_points")
- span.info-text defined
points
- li
- span.info-num(tg-bo-bind="stats.assigned_points")
- span.info-text assigned
points
- li
- span.info-num(tg-bo-bind="stats.closed_points")
- span.info-text closed
points
- div.project-data-container
- p.description(tg-bo-bind="project.description")
- ul
- li(ng-repeat="member in project.memberships")
- figure.avatar
- img(tg-bo-src="member.photo", tg-bo-alt="member.full_name")
diff --git a/app/partials/project/project-colors.jade b/app/partials/project/project-colors.jade
new file mode 100644
index 00000000..9867471b
--- /dev/null
+++ b/app/partials/project/project-colors.jade
@@ -0,0 +1,17 @@
+div.wrapper
+ sidebar.menu-secondary.sidebar
+ include ../includes/modules/admin-menu
+
+ sidebar.menu-tertiary.sidebar
+ include ../includes/modules/admin-submenu
+
+ section.main.project-colors
+ header
+ include ../includes/components/mainTitle
+
+ div.project-colors-options
+ a.button.button-green.new-color(href="")
+ span.text
+ | + Add new status
+
+ include ../includes/modules/colors-table
diff --git a/app/partials/project/project-list.jade b/app/partials/project/project-list.jade
new file mode 100644
index 00000000..f928905e
--- /dev/null
+++ b/app/partials/project/project-list.jade
@@ -0,0 +1,11 @@
+div(tg-projects-pagination)
+ .projects-pagination
+ a.v-pagination-previous.icon.icon-arrow-up(href='')
+ .v-pagination-list
+ ul.projects-list
+ <% _.each(projects, function(project) { %>
+ li
+ a.button(href='<%- project.url %>')
+ <%- project.name %>
+ <% }) %>
+ a.v-pagination-next.icon.icon-arrow-bottom(href='')
\ No newline at end of file
diff --git a/app/partials/project/project-menu.jade b/app/partials/project/project-menu.jade
new file mode 100644
index 00000000..3fe40443
--- /dev/null
+++ b/app/partials/project/project-menu.jade
@@ -0,0 +1,63 @@
+div(class="menu-container")
+ ul(class="main-nav")
+ li(id="nav-search")
+ a(href="" title="Search")
+ span(class="icon icon-search")
+ span(class="item") Search
+ <% if (project.is_backlog_activated && project.my_permissions.indexOf("view_us") != -1) { %>
+ li(id="nav-backlog")
+ a(href="" title="Backlog" tg-nav="project-backlog:project=project.slug")
+ span(class="icon icon-backlog")
+ span(class="item") Backlog
+ <% } %>
+ <% if (project.is_kanban_activated && project.my_permissions.indexOf("view_us") != -1) { %>
+ li(id="nav-kanban")
+ a(href="" title="Kanban" tg-nav="project-kanban:project=project.slug")
+ span(class="icon icon-kanban")
+ span(class="item") Kanban
+ <% } %>
+ <% if (project.is_issues_activated && project.my_permissions.indexOf("view_issues") != -1) { %>
+ li(id="nav-issues")
+ a(href="" title="Issues" tg-nav="project-issues:project=project.slug")
+ span(class="icon icon-issues")
+ span(class="item") Issues
+ <% } %>
+ <% if (project.is_wiki_activated && project.my_permissions.indexOf("view_wiki_pages") != -1) { %>
+ li(id="nav-wiki")
+ a(href="" title="Wiki" tg-nav="project-wiki:project=project.slug")
+ span(class="icon icon-wiki")
+ span(class="item") Wiki
+ <% } %>
+ li(id="nav-team")
+ a(href="" title="Team" tg-nav="project-team:project=project.slug")
+ span(class="icon icon-team")
+ span(class="item") Team
+ <% if (project.videoconferences) { %>
+ li(id="nav-video")
+ a(href="<%- project.videoconferenceUrl %>" target="_blank" title="Meet Up")
+ span(class="icon icon-video")
+ span(class="item") Meet Up
+ <% } %>
+ <% if (project.i_am_owner) { %>
+ li(id="nav-admin")
+ a(href="" tg-nav="project-admin-home:project=project.slug" title="Admin")
+ span(class="icon icon-settings")
+ span(class="item") Admin
+ <% } %>
+ div(class="user")
+ div(class="user-settings")
+ ul(class="popover")
+ li
+ a(href="" title="User Profile", tg-nav="user-settings-user-profile:project=project.slug") User Profile
+ li
+ a(href="" title="Change Password", tg-nav="user-settings-user-change-password:project=project.slug") Change Password
+ li
+ a(href="" title="Notifications", tg-nav="user-settings-mail-notifications:project=project.slug") Notifications
+ <% if (feedbackEnabled) { %>
+ li
+ a(href="" class="feedback" title="Feedback") Feedback
+ <% } %>
+ li
+ a(href="" title="Logout" class="logout") Logout
+ a(href="" title="User preferences" class="avatar" id="nav-user-settings")
+ img(src!="<%- user.photo %>" alt!="<%- user.full_name_display %>")
diff --git a/app/partials/project/project-navigation-base.jade b/app/partials/project/project-navigation-base.jade
new file mode 100644
index 00000000..61da9123
--- /dev/null
+++ b/app/partials/project/project-navigation-base.jade
@@ -0,0 +1,14 @@
+h1 Your projects
+form
+ fieldset
+ input(type="text", placeholder="Search in...", class="search-project")
+ a(class="icon icon-search")
+
+div(class="create-project-button")
+ a(class="button button-green" href="") Create project
+
+div(class="projects-pagination" tg-projects-pagination)
+ a(class="v-pagination-previous icon icon-arrow-up", href="")
+ div(class="v-pagination-list")
+ ul(class="projects-list")
+ a(class="v-pagination-next icon icon-arrow-bottom" href="")
diff --git a/app/partials/project/project-navigation-list.jade b/app/partials/project/project-navigation-list.jade
new file mode 100644
index 00000000..027d9dd8
--- /dev/null
+++ b/app/partials/project/project-navigation-list.jade
@@ -0,0 +1,6 @@
+<% _.each(projects, function(project) { %>
+li
+ a(href!="<%- project.url %>")
+ span(class="project-name") <%- project.name %>
+ span(class="icon icon-arrow-right")
+<% }) %>
\ No newline at end of file
diff --git a/app/partials/project/project.jade b/app/partials/project/project.jade
new file mode 100644
index 00000000..77a571ec
--- /dev/null
+++ b/app/partials/project/project.jade
@@ -0,0 +1,24 @@
+div.wrapper(ng-controller="ProjectController as ctrl")
+ section.main.single-project
+ h1
+ span.green(tg-bo-bind="project.name", class="project-name")
+ div.summary
+ ul.home-project-info-list
+ li
+ span.info-num(tg-bo-bind="stats.total_points")
+ span.info-text project
points
+ li
+ span.info-num(tg-bo-bind="stats.defined_points")
+ span.info-text defined
points
+ li
+ span.info-num(tg-bo-bind="stats.assigned_points")
+ span.info-text assigned
points
+ li
+ span.info-num(tg-bo-bind="stats.closed_points")
+ span.info-text closed
points
+ div.project-data-container
+ p.description(tg-bo-bind="project.description")
+ ul
+ li(ng-repeat="member in project.memberships")
+ figure.avatar
+ img(tg-bo-src="member.photo", tg-bo-alt="member.full_name")
diff --git a/app/partials/project/projects.jade b/app/partials/project/projects.jade
new file mode 100644
index 00000000..d9348576
--- /dev/null
+++ b/app/partials/project/projects.jade
@@ -0,0 +1,28 @@
+include ../includes/components/beta
+div.home-projects-list(ng-controller="ProjectsController as ctrl")
+ .home-projects-wrapper
+ div.welcome-user
+ div.info
+ p
+ | Welcome
+ span(tg-bo-bind="ctrl.user.full_name_display")
+ a.logout(ng-click="ctrl.logout()" href="", title="Logout") logout
+
+ .avatar
+ img(tg-bo-src="ctrl.user.photo", tg-bo-alt="ctrl.user.full_name_display")
+
+ .home-projects-list-inner
+ div.recent-projects
+ ul
+ li(ng-repeat="project in ctrl.projects.recents")
+ .project-content
+ a(href="{{ project.url }}")
+ h2(tg-bo-bind="project.name")
+ p(tg-bo-bind="project.description")
+
+ div.all-projects
+ h1 Projects
+ div(tg-projects-list)
+
+ .create-project-button-wrapper
+ a.button.button-green(href="", ng-click="ctrl.newProject()") Create project
diff --git a/app/partials/projects.jade b/app/partials/projects.jade
deleted file mode 100644
index 6527a65e..00000000
--- a/app/partials/projects.jade
+++ /dev/null
@@ -1,34 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- include views/components/beta
- div.home-projects-list(ng-controller="ProjectsController as ctrl")
- .home-projects-wrapper
- div.welcome-user
- div.info
- p
- | Welcome
- span(tg-bo-bind="ctrl.user.full_name_display")
- a.logout(ng-click="ctrl.logout()" href="", title="Logout") logout
-
- .avatar
- img(tg-bo-src="ctrl.user.photo", tg-bo-alt="ctrl.user.full_name_display")
-
- .home-projects-list-inner
- div.recent-projects
- ul
- li(ng-repeat="project in ctrl.projects.recents")
- .project-content
- a(href="{{ project.url }}")
- h2(tg-bo-bind="project.name")
- p(tg-bo-bind="project.description")
-
- div.all-projects
- h1 Projects
- div(tg-projects-list)
-
- .create-project-button-wrapper
- a.button.button-green(href="", ng-click="ctrl.newProject()") Create project
diff --git a/app/partials/register.jade b/app/partials/register.jade
deleted file mode 100644
index d35a733a..00000000
--- a/app/partials/register.jade
+++ /dev/null
@@ -1,15 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- include views/components/beta
- div.wrapper
- div.login-main
- div.login-container
- img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
- h1.logo Taiga
- h2.tagline LOVE YOUR PROJECT
-
- include views/modules/register-form
diff --git a/app/partials/search-issues.jade b/app/partials/search-issues.jade
deleted file mode 100644
index cef8b7bd..00000000
--- a/app/partials/search-issues.jade
+++ /dev/null
@@ -1,23 +0,0 @@
-extends layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper
- sidebar.menu-secondary.sidebar
- include views/modules/search-in
-
- section.main.search-result
- include views/components/mainTitle
- include views/modules/search-filter
- include views/modules/search-result-issues-table
-
- script.
- setTimeout(function () {
- document.body.className = 'open-project-nav';
- }, 1000);
-
- setTimeout(function () {
- document.body.className = '';
- }, 6000);
diff --git a/app/partials/search.jade b/app/partials/search.jade
deleted file mode 100644
index 9eeb3349..00000000
--- a/app/partials/search.jade
+++ /dev/null
@@ -1,16 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-search, ng-controller="SearchController as ctrl",
- ng-init="section='search'")
-
- sidebar.menu-secondary.sidebar
- include views/modules/search-in
-
- section.main.search-result
- include views/components/mainTitle
- include views/modules/search-filter
- include views/modules/search-result-table
diff --git a/app/partials/search/search.jade b/app/partials/search/search.jade
new file mode 100644
index 00000000..cf584252
--- /dev/null
+++ b/app/partials/search/search.jade
@@ -0,0 +1,10 @@
+div.wrapper(tg-search, ng-controller="SearchController as ctrl",
+ ng-init="section='search'")
+
+ sidebar.menu-secondary.sidebar
+ include ../includes/modules/search-in
+
+ section.main.search-result
+ include ../includes/components/mainTitle
+ include ../includes/modules/search-filter
+ include ../includes/modules/search-result-table
diff --git a/app/partials/task-detail.jade b/app/partials/task-detail.jade
deleted file mode 100644
index 25cf5c73..00000000
--- a/app/partials/task-detail.jade
+++ /dev/null
@@ -1,73 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(ng-controller="TaskDetailController as ctrl",
- ng-init="section='backlog-kanban'")
- div.main.us-detail
- div.us-detail-header.header-with-actions
- include views/components/mainTitle
- .action-buttons
- a.button.button-gray(
- tg-check-permission="view_milestones",
- href="", title="Go to taskboard",
- tg-nav="project-taskboard:project=project.slug,sprint=sprint.slug",
- ng-if="sprint && project.is_backlog_activated") Taskboard
-
- section.us-story-main-data
- div.us-title(ng-class="{blocked: task.is_blocked}")
- h2.us-title-text
- span.us-number(tg-bo-ref="task.ref")
- span.us-name(tg-editable-subject, ng-model="task", required-perm="modify_task")
-
- h3.us-related-task This task belongs to
- a(tg-check-permission="view_us", href="", title="Go to user story",
- tg-nav="project-userstories-detail:project=project.slug, ref=us.ref",
- ng-if="us")
- span(tg-bo-ref="us.ref")
- span(tg-bo-bind="us.subject")
-
- p.external-reference(ng-if="task.external_reference") This task has been created from
- a(target="_blank", tg-bo-href="task.external_reference[1]", title="Go to origin")
- span {{ task.external_reference[1] }}
-
- p.block-desc-container(ng-show="task.is_blocked")
- span.block-description-title Blocked
- span.block-description(ng-bind="task.blocked_note || 'This task is blocked'")
- div.issue-nav
- a.icon.icon-arrow-left(ng-show="previousUrl", tg-bo-href="previousUrl",
- title="previous task")
- a.icon.icon-arrow-right(ng-show="nextUrl", tg-bo-href="nextUrl",
- title="next task")
-
- div.tags-block(tg-tag-line, ng-model="task", required-perm="modify_task")
-
- section.duty-content.wysiwyg(tg-editable-description, ng-model="task", required-perm="modify_task")
-
- tg-attachments(ng-model="task", type="task")
- tg-history(ng-model="task", type="task")
-
- sidebar.menu-secondary.sidebar
- section.us-status
- h1(tg-task-status-display, ng-model="task")
- div.us-created-by(tg-created-by-display, ng-model="task")
- div.duty-data-container
- div.duty-data(tg-task-status-button, ng-model="task")
-
- section.duty-assigned-to(tg-assigned-to, ng-model="task", required-perm="modify_task")
-
- section.watchers(tg-watchers, ng-model="task", required-perm="modify_task")
-
- section.us-detail-settings
- tg-task-is-iocaine-button(ng-model="task")
- tg-block-button(tg-check-permission="modify_task", ng-model="task")
- tg-delete-button(tg-check-permission="delete_task",
- on-delete-title="'Delete Task'",
- on-delete-go-to-url="onDeleteGoToUrl",
- ng-model="task")
-
- div.lightbox.lightbox-block(tg-lb-block, title="Blocking task", ng-model="task")
- div.lightbox.lightbox-select-user(tg-lb-assignedto)
- div.lightbox.lightbox-select-user(tg-lb-watchers)
diff --git a/app/partials/task/related-task-create-form.jade b/app/partials/task/related-task-create-form.jade
new file mode 100644
index 00000000..2110afcf
--- /dev/null
+++ b/app/partials/task/related-task-create-form.jade
@@ -0,0 +1,16 @@
+.tasks
+ .task-name
+ input(type='text', placeholder='Type the new task subject')
+ .task-settings
+ a.icon.icon-floppy(href='', title='Save')
+ a.icon.icon-delete.cancel-edit(href='', title='Cancel')
+
+.status(tg-related-task-status='newTask', ng-model='newTask', not-auto-save='true')
+ a.task-status(href='', title='Status Name')
+ span.task-status-bind
+ span.icon.icon-arrow-bottom
+
+.assigned-to(tg-related-task-assigned-to-inline-edition='newTask', not-auto-save='true')
+ .task-assignedto(title='Assigned to')
+ figure.avatar
+ span.icon.icon-arrow-bottom
diff --git a/app/partials/task/related-task-row-edit.jade b/app/partials/task/related-task-row-edit.jade
new file mode 100644
index 00000000..890f7a59
--- /dev/null
+++ b/app/partials/task/related-task-row-edit.jade
@@ -0,0 +1,16 @@
+.tasks
+ .task-name
+ input(type='text', value!='<%- task.subject %> sdfdsf', placeholder='Type the task subject')
+ .task-settings
+ a.icon.icon-floppy(href='', title='Save')
+ a.icon.icon-delete.cancel-edit(href='', title='Cancel')
+
+.status(tg-related-task-status='task', ng-model='task')
+ a.task-status(href='', title='Status Name')
+ span.task-status-bind
+ span.icon.icon-arrow-bottom
+
+.assigned-to(tg-related-task-assigned-to-inline-edition='task')
+ .task-assignedto(title='Assigned to')
+ figure.avatar
+ span.icon.icon-arrow-bottom
diff --git a/app/partials/task/related-task-row.jade b/app/partials/task/related-task-row.jade
new file mode 100644
index 00000000..3618c424
--- /dev/null
+++ b/app/partials/task/related-task-row.jade
@@ -0,0 +1,27 @@
+div(class="tasks")
+ div(class="task-name")
+ span(class="icon icon-iocaine")
+ a(tg-nav="project-tasks-detail:project=project.slug,ref=task.ref" title!="<%- task.ref %> <%- task.subject %>" class="clickable")
+ span #<%- task.ref %>
+ span <%- task.subject %>
+ div(class="task-settings")
+ <% if(perms.modify_task) { %>
+ a(href="" title="Edit" class="icon icon-edit")
+ <% } %>
+ <% if(perms.delete_task) { %>
+ a(href="" title="Delete" class="icon icon-delete delete-task")
+ <% } %>
+
+div(tg-related-task-status="task" ng-model="task" class="status")
+ a(href="" title="Status Name" class="task-status")
+ span(class="task-status-bind")
+ <% if(perms.modify_task) { %>
+ span(class="icon icon-arrow-bottom")
+ <% } %>
+
+div(tg-related-task-assigned-to-inline-edition="task" class="assigned-to")
+ div(title="Assigned to" class="task-assignedto <% if(perms.modify_task) { %>editable<% } %>")
+ figure(class="avatar")
+ <% if(perms.modify_task) { %>
+ span(class="icon icon-arrow-bottom")
+ <% } %>
diff --git a/app/partials/task/task-detail.jade b/app/partials/task/task-detail.jade
new file mode 100644
index 00000000..2b8ce27f
--- /dev/null
+++ b/app/partials/task/task-detail.jade
@@ -0,0 +1,67 @@
+div.wrapper(ng-controller="TaskDetailController as ctrl",
+ ng-init="section='backlog-kanban'")
+ div.main.us-detail
+ div.us-detail-header.header-with-actions
+ include ../includes/components/mainTitle
+ .action-buttons
+ a.button.button-gray(
+ tg-check-permission="view_milestones",
+ href="", title="Go to taskboard",
+ tg-nav="project-taskboard:project=project.slug,sprint=sprint.slug",
+ ng-if="sprint && project.is_backlog_activated") Taskboard
+
+ section.us-story-main-data
+ div.us-title(ng-class="{blocked: task.is_blocked}")
+ h2.us-title-text
+ span.us-number(tg-bo-ref="task.ref")
+ span.us-name(tg-editable-subject, ng-model="task", required-perm="modify_task")
+
+ h3.us-related-task This task belongs to
+ a(tg-check-permission="view_us", href="", title="Go to user story",
+ tg-nav="project-userstories-detail:project=project.slug, ref=us.ref",
+ ng-if="us")
+ span(tg-bo-ref="us.ref")
+ span(tg-bo-bind="us.subject")
+
+ p.external-reference(ng-if="task.external_reference") This task has been created from
+ a(target="_blank", tg-bo-href="task.external_reference[1]", title="Go to origin")
+ span {{ task.external_reference[1] }}
+
+ p.block-desc-container(ng-show="task.is_blocked")
+ span.block-description-title Blocked
+ span.block-description(ng-bind="task.blocked_note || 'This task is blocked'")
+ div.issue-nav
+ a.icon.icon-arrow-left(ng-show="previousUrl", tg-bo-href="previousUrl",
+ title="previous task")
+ a.icon.icon-arrow-right(ng-show="nextUrl", tg-bo-href="nextUrl",
+ title="next task")
+
+ div.tags-block(tg-tag-line, ng-model="task", required-perm="modify_task")
+
+ section.duty-content.wysiwyg(tg-editable-description, ng-model="task", required-perm="modify_task")
+
+ tg-attachments(ng-model="task", type="task")
+ tg-history(ng-model="task", type="task")
+
+ sidebar.menu-secondary.sidebar
+ section.us-status
+ h1(tg-task-status-display, ng-model="task")
+ div.us-created-by(tg-created-by-display, ng-model="task")
+ div.duty-data-container
+ div.duty-data(tg-task-status-button, ng-model="task")
+
+ section.duty-assigned-to(tg-assigned-to, ng-model="task", required-perm="modify_task")
+
+ section.watchers(tg-watchers, ng-model="task", required-perm="modify_task")
+
+ section.us-detail-settings
+ tg-task-is-iocaine-button(ng-model="task")
+ tg-block-button(tg-check-permission="modify_task", ng-model="task")
+ tg-delete-button(tg-check-permission="delete_task",
+ on-delete-title="'Delete Task'",
+ on-delete-go-to-url="onDeleteGoToUrl",
+ ng-model="task")
+
+ div.lightbox.lightbox-block(tg-lb-block, title="Blocking task", ng-model="task")
+ div.lightbox.lightbox-select-user(tg-lb-assignedto)
+ div.lightbox.lightbox-select-user(tg-lb-watchers)
diff --git a/app/partials/taskboard.jade b/app/partials/taskboard.jade
deleted file mode 100644
index 9cdf3e1e..00000000
--- a/app/partials/taskboard.jade
+++ /dev/null
@@ -1,29 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-taskboard, ng-controller="TaskboardController as ctrl",
- ng-init="section='backlog'")
- section.main.taskboard
- h1
- span(tg-bo-bind="project.name", class="project-name-short")
- span.green(tg-bo-bind="sprint.name")
- span.date(tg-date-range="sprint.estimated_start,sprint.estimated_finish")
- include views/components/sprint-summary
-
- div.graphics-container
- div.burndown(tg-sprint-graph)
- include views/modules/burndown
-
- include views/modules/taskboard-table
-
- div.lightbox.lightbox-generic-form(tg-lb-create-edit-task)
- include views/modules/lightbox-task-create-edit
-
- div.lightbox.lightbox-generic-bulk.lightbox-task-bulk(tg-lb-create-bulk-tasks)
- include views/modules/lightbox-task-bulk
-
- div.lightbox.lightbox-select-user(tg-lb-assignedto)
- include views/modules/lightbox-assigned-to
diff --git a/app/partials/taskboard/taskboard-user.jade b/app/partials/taskboard/taskboard-user.jade
new file mode 100644
index 00000000..68fe53dc
--- /dev/null
+++ b/app/partials/taskboard/taskboard-user.jade
@@ -0,0 +1,6 @@
+figure.avatar.avatar-assigned-to
+ a(href='#', title='Assign task', ng-class="{'not-clickable': !clickable}")
+ img(ng-src='{{imgurl}}')
+figure.avatar.avatar-task-link
+ a(tg-nav='project-tasks-detail:project=project.slug,ref=task.ref', ng-attr-title='{{task.subject}}')
+ img(ng-src='{{imgurl}}')
diff --git a/app/partials/taskboard/taskboard.jade b/app/partials/taskboard/taskboard.jade
new file mode 100644
index 00000000..3977bb8b
--- /dev/null
+++ b/app/partials/taskboard/taskboard.jade
@@ -0,0 +1,23 @@
+div.wrapper(tg-taskboard, ng-controller="TaskboardController as ctrl",
+ ng-init="section='backlog'")
+ section.main.taskboard
+ h1
+ span(tg-bo-bind="project.name", class="project-name-short")
+ span.green(tg-bo-bind="sprint.name")
+ span.date(tg-date-range="sprint.estimated_start,sprint.estimated_finish")
+ include ../includes/components/sprint-summary
+
+ div.graphics-container
+ div.burndown(tg-sprint-graph)
+ include ../includes/modules/burndown
+
+ include ../includes/modules/taskboard-table
+
+ div.lightbox.lightbox-generic-form(tg-lb-create-edit-task)
+ include ../includes/modules/lightbox-task-create-edit
+
+ div.lightbox.lightbox-generic-bulk.lightbox-task-bulk(tg-lb-create-bulk-tasks)
+ include ../includes/modules/lightbox-task-bulk
+
+ div.lightbox.lightbox-select-user(tg-lb-assignedto)
+ include ../common/lightbox/lightbox-assigned-to
diff --git a/app/partials/team/leave-project.jade b/app/partials/team/leave-project.jade
new file mode 100644
index 00000000..8b482f7b
--- /dev/null
+++ b/app/partials/team/leave-project.jade
@@ -0,0 +1,4 @@
+a.leave-project(ng-click='leave()', href='')
+ span.icon.icon-delete
+
+ | Leave this project
diff --git a/app/partials/team/team-filter.jade b/app/partials/team/team-filter.jade
new file mode 100644
index 00000000..62cffffe
--- /dev/null
+++ b/app/partials/team/team-filter.jade
@@ -0,0 +1,10 @@
+ul
+ li
+ a(ng-class='{active: !filtersRole.id}', ng-click='ctrl.setRole()', href='')
+ span.title All
+ span.icon.icon-arrow-right
+
+ li(ng-repeat='role in roles')
+ a(ng-class='{active: role.id == filtersRole.id}', ng-click='ctrl.setRole(role)', href='')
+ span.title(tg-bo-bind='role.name')
+ span.icon.icon-arrow-right
diff --git a/app/partials/team/team-member-current-user.jade b/app/partials/team/team-member-current-user.jade
new file mode 100644
index 00000000..d25c2a16
--- /dev/null
+++ b/app/partials/team/team-member-current-user.jade
@@ -0,0 +1,13 @@
+.row
+ .username
+ figure.avatar
+ img(tg-bo-src='currentUser.photo', tg-bo-alt='currentUser.full_name')
+
+ figcaption
+ span.name(tg-bo-bind='currentUser.full_name')
+
+ span.position(tg-bo-bind='currentUser.role_name')
+
+ div(tg-leave-project='', projectid='{{projectId}}')
+
+ .member-stats(tg-team-member-stats, stats="stats", user="currentUser.user", issuesEnabled="issuesEnabled", tasksenabled="tasksEnabled", wikienabled="wikiEnabled")
diff --git a/app/partials/team/team-member-stats.jade b/app/partials/team/team-member-stats.jade
new file mode 100644
index 00000000..5558dbcc
--- /dev/null
+++ b/app/partials/team/team-member-stats.jade
@@ -0,0 +1,17 @@
+.attribute(ng-if='issuesEnabled')
+ span.icon.icon-briefcase(ng-style="{'opacity': stats.closed_bugs[userId]}", ng-class="{'top': stats.closed_bugs[userId] == 1}")
+
+.attribute(ng-if='tasksEnabled')
+ span.icon.icon-iocaine(ng-style="{'opacity': stats.iocaine_tasks[userId]}", ng-class="{'top': stats.iocaine_tasks[userId] == 1}")
+
+.attribute(ng-if='wikiEnabled')
+ span.icon.icon-writer(ng-style="{'opacity': stats.wiki_changes[userId]}", ng-class="{'top': stats.wiki_changes[userId] == 1}")
+
+.attribute(ng-if='issuesEnabled')
+ span.icon.icon-bug(ng-style="{'opacity': stats.created_bugs[userId]}", ng-class="{'top': stats.created_bugs[userId] == 1}")
+
+.attribute(ng-if='tasksEnabled')
+ span.icon.icon-tasks(ng-style="{'opacity': stats.closed_tasks[userId]}", ng-class="{'top': stats.closed_tasks[userId] == 1}")
+
+.attribute
+span.points(ng-bind='stats.totals[userId]')
\ No newline at end of file
diff --git a/app/partials/team/team-members.jade b/app/partials/team/team-members.jade
new file mode 100644
index 00000000..cf5b2b26
--- /dev/null
+++ b/app/partials/team/team-members.jade
@@ -0,0 +1,11 @@
+.row.member(ng-repeat='user in memberships | filter:filtersQ | filter:{role: filtersRole.id}')
+ .username
+ figure.avatar
+ img(tg-bo-src='user.photo', tg-bo-alt='user.full_name')
+
+ figcaption
+ span.name(tg-bo-bind='user.full_name')
+
+ span.position(tg-bo-bind='user.role_name')
+
+ .member-stats(tg-team-member-stats, stats="stats", user="user.user", issuesEnabled="issuesEnabled", tasksenabled="tasksEnabled", wikienabled="wikiEnabled")
diff --git a/app/partials/team/team.jade b/app/partials/team/team.jade
new file mode 100644
index 00000000..84f47d4f
--- /dev/null
+++ b/app/partials/team/team.jade
@@ -0,0 +1,6 @@
+div.wrapper(ng-controller="TeamController as ctrl", ng-init="section='team'")
+ sidebar.menu-secondary
+ include ../includes/modules/team/team-filters
+ section.main.team
+ include ../includes/components/mainTitle
+ include ../includes/modules/team/team-table
diff --git a/app/partials/us-detail.jade b/app/partials/us-detail.jade
deleted file mode 100644
index 6685ae9a..00000000
--- a/app/partials/us-detail.jade
+++ /dev/null
@@ -1,77 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(ng-controller="UserStoryDetailController as ctrl",
- ng-init="section='backlog-kanban'")
- div.main.us-detail
- div.us-detail-header.header-with-actions
- include views/components/mainTitle
- .action-buttons
- a.button.button-gray(
- tg-check-permission="view_milestones",
- href="", title="Go to taskboard",
- tg-nav="project-taskboard:project=project.slug,sprint=sprint.slug",
- ng-if="sprint && project.is_backlog_activated") Taskboard
-
- section.us-story-main-data
- div.us-title(ng-class="{blocked: us.is_blocked}")
- h2.us-title-text
- span.us-number(tg-bo-ref="us.ref")
- span.us-name(tg-editable-subject, ng-model="us", required-perm="modify_us")
-
- p.us-related-task(ng-if="us.origin_issue") This US has been promoted from Issue
- a(tg-check-permission="view_us", href="", title="Go to issue",
- tg-nav="project-issues-detail:project=project.slug, ref=us.origin_issue.ref"
- tg-bo-title="'#' + us.origin_issue.ref + ' ' + us.origin_issue.subject")
- span(tg-bo-ref="us.origin_issue.ref")
-
- p.external-reference(ng-if="us.external_reference") This US has been created from
- a(target="_blank", tg-bo-href="us.external_reference[1]", title="Go to origin")
- span {{ us.external_reference[1] }}
-
- p.block-desc-container(ng-show="us.is_blocked")
- span.block-description-title Blocked
- span.block-description(ng-bind="us.blocked_note || 'This user story is blocked'")
- div.issue-nav
- a.icon.icon-arrow-left(ng-show="previousUrl", tg-bo-href="previousUrl",
- title="previous user story")
- a.icon.icon-arrow-right(ng-show="nextUrl", tg-bo-href="nextUrl",
- title="next user story")
-
- div.tags-block(tg-tag-line, ng-model="us", required-perm="modify_us")
-
- section.duty-content.wysiwyg(tg-editable-description, ng-model="us", required-perm="modify_us")
-
- include views/modules/related-tasks
-
- tg-attachments(ng-model="us", type="us")
- tg-history(ng-model="us", type="us")
-
- sidebar.menu-secondary.sidebar
- section.us-status
- h1(tg-us-status-display, ng-model="us")
- div.us-detail-progress-bar(tg-us-tasks-progress-display, ng-model="tasks")
- tg-created-by-display.us-created-by(ng-model="us")
- tg-us-estimation(ng-model="us")
- div.duty-data-container
- div.duty-data(tg-us-status-button, ng-model="us")
-
- section.duty-assigned-to(tg-assigned-to, ng-model="us", required-perm="modify_us")
-
- section.watchers(tg-watchers, ng-model="us", required-perm="modify_us")
-
- section.us-detail-settings
- tg-us-team-requirement-button(ng-model="us")
- tg-us-client-requirement-button(ng-model="us")
- tg-block-button(tg-check-permission="modify_us", ng-model="us")
- tg-delete-button(tg-check-permission="delete_us",
- on-delete-title="'Delete User Story'",
- on-delete-go-to-url="onDeleteGoToUrl",
- ng-model="us")
-
- div.lightbox.lightbox-block(tg-lb-block, title="Blocking us", ng-model="us")
- div.lightbox.lightbox-select-user(tg-lb-assignedto)
- div.lightbox.lightbox-select-user(tg-lb-watchers)
diff --git a/app/partials/us/us-client-requirement-button.jade b/app/partials/us/us-client-requirement-button.jade
new file mode 100644
index 00000000..a3dbe9d3
--- /dev/null
+++ b/app/partials/us/us-client-requirement-button.jade
@@ -0,0 +1,5 @@
+label(for="client-requirement",
+ class!="button button-gray client-requirement <% if(canEdit){ %>editable<% }; %> <% if(isRequired){ %>active<% }; %>")
+ | Client requirement
+
+input(type="checkbox", id="client-requirement", name="client-requirement")
\ No newline at end of file
diff --git a/app/partials/us/us-detail.jade b/app/partials/us/us-detail.jade
new file mode 100644
index 00000000..a6ca54d8
--- /dev/null
+++ b/app/partials/us/us-detail.jade
@@ -0,0 +1,71 @@
+div.wrapper(ng-controller="UserStoryDetailController as ctrl",
+ ng-init="section='backlog-kanban'")
+ div.main.us-detail
+ div.us-detail-header.header-with-actions
+ include ../includes/components/mainTitle
+ .action-buttons
+ a.button.button-gray(
+ tg-check-permission="view_milestones",
+ href="", title="Go to taskboard",
+ tg-nav="project-taskboard:project=project.slug,sprint=sprint.slug",
+ ng-if="sprint && project.is_backlog_activated") Taskboard
+
+ section.us-story-main-data
+ div.us-title(ng-class="{blocked: us.is_blocked}")
+ h2.us-title-text
+ span.us-number(tg-bo-ref="us.ref")
+ span.us-name(tg-editable-subject, ng-model="us", required-perm="modify_us")
+
+ p.us-related-task(ng-if="us.origin_issue") This US has been promoted from Issue
+ a(tg-check-permission="view_us", href="", title="Go to issue",
+ tg-nav="project-issues-detail:project=project.slug, ref=us.origin_issue.ref"
+ tg-bo-title="'#' + us.origin_issue.ref + ' ' + us.origin_issue.subject")
+ span(tg-bo-ref="us.origin_issue.ref")
+
+ p.external-reference(ng-if="us.external_reference") This US has been created from
+ a(target="_blank", tg-bo-href="us.external_reference[1]", title="Go to origin")
+ span {{ us.external_reference[1] }}
+
+ p.block-desc-container(ng-show="us.is_blocked")
+ span.block-description-title Blocked
+ span.block-description(ng-bind="us.blocked_note || 'This user story is blocked'")
+ div.issue-nav
+ a.icon.icon-arrow-left(ng-show="previousUrl", tg-bo-href="previousUrl",
+ title="previous user story")
+ a.icon.icon-arrow-right(ng-show="nextUrl", tg-bo-href="nextUrl",
+ title="next user story")
+
+ div.tags-block(tg-tag-line, ng-model="us", required-perm="modify_us")
+
+ section.duty-content.wysiwyg(tg-editable-description, ng-model="us", required-perm="modify_us")
+
+ include ../includes/modules/related-tasks
+
+ tg-attachments(ng-model="us", type="us")
+ tg-history(ng-model="us", type="us")
+
+ sidebar.menu-secondary.sidebar
+ section.us-status
+ h1(tg-us-status-display, ng-model="us")
+ div.us-detail-progress-bar(tg-us-tasks-progress-display, ng-model="tasks")
+ tg-created-by-display.us-created-by(ng-model="us")
+ tg-us-estimation(ng-model="us")
+ div.duty-data-container
+ div.duty-data(tg-us-status-button, ng-model="us")
+
+ section.duty-assigned-to(tg-assigned-to, ng-model="us", required-perm="modify_us")
+
+ section.watchers(tg-watchers, ng-model="us", required-perm="modify_us")
+
+ section.us-detail-settings
+ tg-us-team-requirement-button(ng-model="us")
+ tg-us-client-requirement-button(ng-model="us")
+ tg-block-button(tg-check-permission="modify_us", ng-model="us")
+ tg-delete-button(tg-check-permission="delete_us",
+ on-delete-title="'Delete User Story'",
+ on-delete-go-to-url="onDeleteGoToUrl",
+ ng-model="us")
+
+ div.lightbox.lightbox-block(tg-lb-block, title="Blocking us", ng-model="us")
+ div.lightbox.lightbox-select-user(tg-lb-assignedto)
+ div.lightbox.lightbox-select-user(tg-lb-watchers)
diff --git a/app/partials/us/us-status-button.jade b/app/partials/us/us-status-button.jade
new file mode 100644
index 00000000..28cf5ce5
--- /dev/null
+++ b/app/partials/us/us-status-button.jade
@@ -0,0 +1,14 @@
+div(class="status-data <% if(editable){ %>clickable<% }%>")
+ span.level(style!="background-color:<%- status.color %>")
+ span.status-status <%- status.name %>
+ <% if(editable){ %>
+ span.icon.icon-arrow-bottom
+ <% }%>
+ span.level-name status
+
+ ul.popover.pop-status
+ <% _.each(statuses, function(st) { %>
+ li
+ a(href="", class="status", title!="<%- st.name %>", data-status-id!="<%- st.id %>")
+ | <%- st.name %>
+ <% }); %>
diff --git a/app/partials/us/us-task-progress.jade b/app/partials/us/us-task-progress.jade
new file mode 100644
index 00000000..804b154c
--- /dev/null
+++ b/app/partials/us/us-task-progress.jade
@@ -0,0 +1,3 @@
+.current-progress(style!='width:<%- progress %>%')
+ span.tasks-completed
+ | <%- totalClosedTasks %>/<%- totalTasks %> tasks completed
\ No newline at end of file
diff --git a/app/partials/us/us-team-requirement-button.jade b/app/partials/us/us-team-requirement-button.jade
new file mode 100644
index 00000000..3067d7d9
--- /dev/null
+++ b/app/partials/us/us-team-requirement-button.jade
@@ -0,0 +1,4 @@
+label(for="team-requirement", class!="button button-gray team-requirement <% if(canEdit){ %>editable<% }; %> <% if(isRequired){ %>active<% }; %>")
+ | Team requirement
+
+input(type="checkbox", id="team-requirement", name="team-requirement")
\ No newline at end of file
diff --git a/app/partials/user-change-password.jade b/app/partials/user-change-password.jade
deleted file mode 100644
index 426a83e8..00000000
--- a/app/partials/user-change-password.jade
+++ /dev/null
@@ -1,29 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-user-change-password, ng-controller="UserChangePasswordController as ctrl",
- ng-init="section='user-settings'")
- sidebar.menu-secondary.sidebar(tg-user-settings-navigation="change-password")
- include views/modules/user-settings-menu
-
- section.main.user-change-password
- header
- h1
- span.green(tg-bo-html="sectionName")
-
- form
- fieldset
- label(for="current-password") Current Password
- input(type="password", placeholder="Your current password (or empty if you have no password yet)", id="current-password", ng-model="currentPassword")
- fieldset
- label(for="new-password") New Password
- input(type="password", placeholder="New Password", id="new-password", ng-model="newPassword1")
- fieldset
- label(for="retype-password") Retype Password
- input(type="password", placeholder="Retype Password", id="retype-password", ng-model="newPassword2")
- fieldset
- button(type="submit", class="hidden")
- a.button.button-green.submit-button(href="", title="Save") Save
diff --git a/app/partials/user-profile.jade b/app/partials/user-profile.jade
deleted file mode 100644
index 92c10968..00000000
--- a/app/partials/user-profile.jade
+++ /dev/null
@@ -1,63 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(tg-user-profile, ng-controller="UserSettingsController as ctrl",
- ng-init="section='user-settings'")
- sidebar.menu-secondary.sidebar(tg-user-settings-navigation="user-profile")
- include views/modules/user-settings-menu
-
- section.main.user-profile
- header
- h1
- span.green(tg-bo-html="sectionName")
-
- form
- div.container
- div.avatar-container
- fieldset(tg-user-avatar)
- .image-container
- img.avatar(ng-src="{{user.big_photo}}" alt="avatar")
- div.overlay
- span.icon.icon-spinner
- input(type="file", id="avatar-field", class="hidden",
- tg-avatar-model="avatarAttachment")
- p The image will be cropped to 80x80px.
- span.size-info.hidden(tg-bo-html="maxFileSizeMsg")
- a.button.button-green.change(tg-bo-title="'Change photo. ' + maxFileSizeMsg") Change
- a.use-gravatar Use gravatar image
-
- div.data
- fieldset
- label(for="email") Username
- input(type="text", name="username", id="username", placeholder="username",
- ng-model="user.username", data-required="true", data-maxlength="255",
- data-regexp="^[\\w.-]+$")
-
- fieldset
- label(for="email") Email
- input(type="text", name="email", id="email", placeholder="email",
- ng-model="user.email", data-type="email", data-required="true",
- data-maxlength="255")
-
- fieldset
- label(for="full-name") Full name
- input(type="text", name="full_name", id="full-name",
- placeholder="Set your full name (ex. Íñigo Montoya)",
- ng-model="user.full_name", data-required="true",
- data-maxlength="256")
-
- fieldset
- label(for="bio") Bio
- textarea(name="bio", id="bio", placeholder="Tell us something about you",
- ng-model="user.bio")
-
- fieldset.submit
- button(type="submit", title="Save", class="hidden")
- a.button.button-green.save-profile.submit-button(href="") Save
- a.delete-account(href="", title="Delete Taiga account",
- ng-click="ctrl.openDeleteLightbox()") Delete Taiga account
-
- div.lightbox.lightbox-delete-account(tg-lb-delete-user)
diff --git a/app/partials/user/cancel-account.jade b/app/partials/user/cancel-account.jade
new file mode 100644
index 00000000..c333188a
--- /dev/null
+++ b/app/partials/user/cancel-account.jade
@@ -0,0 +1,8 @@
+div.wrapper
+ div.login-main
+ div.login-container
+ h1.logo
+ img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
+ p.tagline Your agile, free, and open source project management tool
+
+ include ../includes/modules/cancel-account-form
diff --git a/app/partials/user/change-email.jade b/app/partials/user/change-email.jade
new file mode 100644
index 00000000..1102d53c
--- /dev/null
+++ b/app/partials/user/change-email.jade
@@ -0,0 +1,8 @@
+div.wrapper
+ div.login-main
+ div.login-container
+ h1.logo
+ img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
+ p.tagline Your agile, free, and open source project management tool
+
+ include ../includes/modules/change-email-form
diff --git a/app/partials/views/modules/lightbox-delete-account.jade b/app/partials/user/lightbox/lightbox-delete-account.jade
similarity index 100%
rename from app/partials/views/modules/lightbox-delete-account.jade
rename to app/partials/user/lightbox/lightbox-delete-account.jade
diff --git a/app/partials/user/mail-notifications.jade b/app/partials/user/mail-notifications.jade
new file mode 100644
index 00000000..2676f575
--- /dev/null
+++ b/app/partials/user/mail-notifications.jade
@@ -0,0 +1,13 @@
+div.wrapper(tg-user-notifications, ng-controller="UserNotificationsController as ctrl",
+ ng-init="section='mail-notifications'")
+ sidebar.menu-secondary.sidebar(tg-user-settings-navigation="mail-notifications")
+ include ../includes/modules/user-settings-menu
+
+ section.main.admin-common
+ header
+ h1
+ span.green(tg-bo-html="sectionName")
+
+ p.total Notifications By Mail
+
+ include ../includes/modules/user-settings/mail-notifications-table
diff --git a/app/partials/user/user-change-password.jade b/app/partials/user/user-change-password.jade
new file mode 100644
index 00000000..5ffef696
--- /dev/null
+++ b/app/partials/user/user-change-password.jade
@@ -0,0 +1,23 @@
+div.wrapper(tg-user-change-password, ng-controller="UserChangePasswordController as ctrl",
+ ng-init="section='user-settings'")
+ sidebar.menu-secondary.sidebar(tg-user-settings-navigation="change-password")
+ include ../includes/modules/user-settings-menu
+
+ section.main.user-change-password
+ header
+ h1
+ span.green(tg-bo-html="sectionName")
+
+ form
+ fieldset
+ label(for="current-password") Current Password
+ input(type="password", placeholder="Your current password (or empty if you have no password yet)", id="current-password", ng-model="currentPassword")
+ fieldset
+ label(for="new-password") New Password
+ input(type="password", placeholder="New Password", id="new-password", ng-model="newPassword1")
+ fieldset
+ label(for="retype-password") Retype Password
+ input(type="password", placeholder="Retype Password", id="retype-password", ng-model="newPassword2")
+ fieldset
+ button(type="submit", class="hidden")
+ a.button.button-green.submit-button(href="", title="Save") Save
diff --git a/app/partials/user/user-profile.jade b/app/partials/user/user-profile.jade
new file mode 100644
index 00000000..ea874a87
--- /dev/null
+++ b/app/partials/user/user-profile.jade
@@ -0,0 +1,57 @@
+div.wrapper(tg-user-profile, ng-controller="UserSettingsController as ctrl",
+ ng-init="section='user-settings'")
+ sidebar.menu-secondary.sidebar(tg-user-settings-navigation="user-profile")
+ include ../includes/modules/user-settings-menu
+
+ section.main.user-profile
+ header
+ h1
+ span.green(tg-bo-html="sectionName")
+
+ form
+ div.container
+ div.avatar-container
+ fieldset(tg-user-avatar)
+ .image-container
+ img.avatar(ng-src="{{user.big_photo}}" alt="avatar")
+ div.overlay
+ span.icon.icon-spinner
+ input(type="file", id="avatar-field", class="hidden",
+ tg-avatar-model="avatarAttachment")
+ p The image will be cropped to 80x80px.
+ span.size-info.hidden(tg-bo-html="maxFileSizeMsg")
+ a.button.button-green.change(tg-bo-title="'Change photo. ' + maxFileSizeMsg") Change
+ a.use-gravatar Use gravatar image
+
+ div.data
+ fieldset
+ label(for="email") Username
+ input(type="text", name="username", id="username", placeholder="username",
+ ng-model="user.username", data-required="true", data-maxlength="255",
+ data-regexp="^[\\w.-]+$")
+
+ fieldset
+ label(for="email") Email
+ input(type="text", name="email", id="email", placeholder="email",
+ ng-model="user.email", data-type="email", data-required="true",
+ data-maxlength="255")
+
+ fieldset
+ label(for="full-name") Full name
+ input(type="text", name="full_name", id="full-name",
+ placeholder="Set your full name (ex. Íñigo Montoya)",
+ ng-model="user.full_name", data-required="true",
+ data-maxlength="256")
+
+ fieldset
+ label(for="bio") Bio
+ textarea(name="bio", id="bio", placeholder="Tell us something about you",
+ ng-model="user.bio")
+
+ fieldset.submit
+ button(type="submit", title="Save", class="hidden")
+ a.button.button-green.save-profile.submit-button(href="") Save
+ a.delete-account(href="", title="Delete Taiga account",
+ ng-click="ctrl.openDeleteLightbox()") Delete Taiga account
+
+div.lightbox.lightbox-delete-account(tg-lb-delete-user)
diff --git a/app/partials/views/team/team.jade b/app/partials/views/team/team.jade
deleted file mode 100644
index 54602c3f..00000000
--- a/app/partials/views/team/team.jade
+++ /dev/null
@@ -1,12 +0,0 @@
-extends ../../dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(ng-controller="TeamController as ctrl", ng-init="section='team'")
- sidebar.menu-secondary
- include ../modules/team/team-filters
- section.main.team
- include ../components/mainTitle
- include ../modules/team/team-table
diff --git a/app/partials/wiki.jade b/app/partials/wiki.jade
deleted file mode 100644
index fb0a7578..00000000
--- a/app/partials/wiki.jade
+++ /dev/null
@@ -1,25 +0,0 @@
-extends dummy-layout
-
-block head
- title Taiga Your agile, free, and open source project management tool
-
-block content
- div.wrapper(ng-controller="WikiDetailController as ctrl",
- ng-init="section='wiki'")
- sidebar.menu-secondary.extrabar(tg-check-permission="view_wiki_links")
- section.wiki-nav(tg-wiki-nav, ng-model="wikiLinks")
- section.main.wiki
- .header
- h1
- span(tg-bo-bind="project.name")
- span.green Wiki
- span.wiki-title(tg-bo-bind='wikiSlug|unslugify')
-
- div.summary.wiki-summary(tg-wiki-summary, ng-model="wiki", ng-if="wiki.id")
- section.wiki-content(tg-editable-wiki-content, ng-model="wiki")
-
- tg-attachments(ng-model="wiki", type="wiki_page", ng-if="wiki.id")
-
- a.remove(href="", ng-click="ctrl.delete()", ng-if="wiki.id", title="Remove this wiki page")
- span.icon.icon-delete
- span Remove this wiki page
diff --git a/app/partials/wiki/editable-wiki-content.jade b/app/partials/wiki/editable-wiki-content.jade
new file mode 100644
index 00000000..ddeb2581
--- /dev/null
+++ b/app/partials/wiki/editable-wiki-content.jade
@@ -0,0 +1,11 @@
+.view-wiki-content
+ section.wysiwyg(tg-bind-html='wiki.html')
+ span.edit.icon.icon-edit(title='Edit')
+.edit-wiki-content(style='display: none;')
+ textarea(placeholder='Write your wiki page here', ng-model='wiki.content', tg-markitup='tg-markitup')
+ a.help-markdown(href='https://taiga.io/support/taiga-markdown-syntax/', target='_blank', title='Mardown syntax help')
+ span.icon.icon-help
+ span Markdown syntax help
+ span.action-container
+ a.save.icon.icon-floppy(href='', title='Save')
+ a.cancel.icon.icon-delete(href='', title='Cancel')
diff --git a/app/partials/wiki/wiki-nav.jade b/app/partials/wiki/wiki-nav.jade
new file mode 100644
index 00000000..ecafc1ca
--- /dev/null
+++ b/app/partials/wiki/wiki-nav.jade
@@ -0,0 +1,19 @@
+header
+ h1 Links
+
+nav
+ ul
+ <% _.each(wikiLinks, function(link, index) { %>
+ li.wiki-link(data-id!="<%- index %>")
+ a(title!="<%- link.title %>")
+ span.link-title <%- link.title %>
+ <% if (deleteWikiLinkPermission) { %>
+ span.icon.icon-delete
+ <% } %>
+ input(type="text" placeholder="name" class="hidden" value!="<%- link.title %>")
+ <% }) %>
+ li.new.hidden
+ input(type="text" placeholder="name")
+<% if (addWikiLinkPermission) { %>
+a(href="" title="Add link" class="add-button button button-gray") Add link
+<% } %>
\ No newline at end of file
diff --git a/app/partials/wiki/wiki-summary.jade b/app/partials/wiki/wiki-summary.jade
new file mode 100644
index 00000000..68b2624d
--- /dev/null
+++ b/app/partials/wiki/wiki-summary.jade
@@ -0,0 +1,13 @@
+ul
+ li
+ span.number <%- totalEditions %>
+ span.description times
edited
+ li
+ span.number <%- lastModifiedDate %>
+ span.description last
edit
+
+ li.username-edition
+ figure.avatar
+ img(src!="<%- user.imgUrl %>" alt!="<%- user.name %>")
+ span.description last modification
+ span.username <%- user.name %>
diff --git a/app/partials/wiki/wiki.jade b/app/partials/wiki/wiki.jade
new file mode 100644
index 00000000..2566e557
--- /dev/null
+++ b/app/partials/wiki/wiki.jade
@@ -0,0 +1,19 @@
+div.wrapper(ng-controller="WikiDetailController as ctrl",
+ ng-init="section='wiki'")
+ sidebar.menu-secondary.extrabar(tg-check-permission="view_wiki_links")
+ section.wiki-nav(tg-wiki-nav, ng-model="wikiLinks")
+ section.main.wiki
+ .header
+ h1
+ span(tg-bo-bind="project.name")
+ span.green Wiki
+ span.wiki-title(tg-bo-bind='wikiSlug|unslugify')
+
+ div.summary.wiki-summary(tg-wiki-summary, ng-model="wiki", ng-if="wiki.id")
+ section.wiki-content(tg-editable-wiki-content, ng-model="wiki")
+
+ tg-attachments(ng-model="wiki", type="wiki_page", ng-if="wiki.id")
+
+ a.remove(href="", ng-click="ctrl.delete()", ng-if="wiki.id", title="Remove this wiki page")
+ span.icon.icon-delete
+ span Remove this wiki page
diff --git a/gulpfile.coffee b/gulpfile.coffee
index 66797419..6daad147 100644
--- a/gulpfile.coffee
+++ b/gulpfile.coffee
@@ -25,9 +25,10 @@ sourcemaps = require('gulp-sourcemaps')
insert = require("gulp-insert")
runSequence = require('run-sequence')
lazypipe = require('lazypipe')
-rimraf = require('rimraf')
+del = require('del')
imagemin = require('gulp-imagemin')
autoprefixer = require('gulp-autoprefixer')
+templateCache = require('gulp-angular-templatecache')
mainSass = require("./main-sass").files
@@ -39,10 +40,11 @@ paths.tmpStyles = paths.tmp + "styles/"
paths.tmpStylesExtras = "#{paths.tmpStyles}/taiga-front-extras/**/*.css"
paths.extras = "extras/"
-paths.jade = [
- paths.app + "index.jade",
- paths.app + "partials/**/*.jade",
- paths.app + "plugins/**/*.jade"
+paths.jade = "#{paths.app}/**/*.jade"
+
+paths.htmlPartials = [
+ "#{paths.tmp}/partials/**/*.html",
+ "!#{paths.tmp}/partials/{includes,includes/**}"
]
paths.images = paths.app + "images/**/*"
@@ -116,27 +118,36 @@ isDeploy = process.argv[process.argv.length - 1] == 'deploy'
# Layout/CSS Related tasks
##############################################################################
-gulp.task "jade-deploy", ->
+gulp.task "jade", ->
gulp.src(paths.jade)
.pipe(plumber())
.pipe(cache("jade"))
- .pipe(jade({pretty: false}))
- .pipe(gulp.dest(paths.dist + "partials/"))
-
-gulp.task "jade-watch", ->
- gulp.src(paths.jade)
- .pipe(plumber())
- .pipe(cache("jade"))
- .pipe(jadeInheritance({basedir: "./app"}))
- .pipe(jade({pretty: true}))
- .pipe(gulp.dest(paths.dist))
-
-gulp.task "templates", ->
- gulp.src(paths.app + "index.jade")
- .pipe(plumber())
.pipe(jade({pretty: true, locals:{v:(new Date()).getTime()}}))
+ .pipe(gulp.dest(paths.tmp))
+
+gulp.task "jade-inheritance", ->
+ gulp.src(paths.jade)
+ .pipe(plumber())
+ .pipe(cache("jade"))
+ .pipe(jadeInheritance({basedir: "./app/"}))
+ .pipe(jade({pretty: true, locals:{v:(new Date()).getTime()}}))
+ .pipe(gulp.dest(paths.tmp))
+
+gulp.task "copy-index", ->
+ gulp.src(paths.tmp + "index.html")
.pipe(gulp.dest(paths.dist))
+gulp.task "template-cache", ->
+ gulp.src(paths.htmlPartials)
+ .pipe(templateCache({standalone: true}))
+ .pipe(gulp.dest(paths.dist + "js/"))
+
+gulp.task "jade-deploy", (cb) ->
+ runSequence("jade", "copy-index", "template-cache", cb)
+
+gulp.task "jade-watch", (cb) ->
+ runSequence("jade-inheritance", "copy-index", "template-cache", cb)
+
##############################################################################
# CSS Related tasks
##############################################################################
@@ -184,10 +195,8 @@ gulp.task "css-vendor", ->
.pipe(concat("vendor.css"))
.pipe(gulp.dest(paths.tmp))
-gulp.task "delete-tmp-styles", (cb) ->
- rimraf(paths.tmpStyles, cb)
-gulp.task "styles-watch", ["css-app", "css-vendor"], ->
+gulp.task "styles", ["css-app", "css-vendor"], ->
_paths = [
paths.tmp + "vendor.css",
paths.tmp + "app.css"
@@ -198,9 +207,6 @@ gulp.task "styles-watch", ["css-app", "css-vendor"], ->
.pipe(gulpif(isDeploy, minifyCSS({noAdvanced: true})))
.pipe(gulp.dest(paths.dist + "styles/"))
-gulp.task "styles", ["delete-tmp-styles"], ->
- gulp.start("styles-watch")
-
##############################################################################
# JS Related tasks
##############################################################################
@@ -320,8 +326,7 @@ gulp.task "express", ->
# Rerun the task when a file changes
gulp.task "watch", ->
gulp.watch(paths.jade, ["jade-watch"])
- gulp.watch(paths.app + "index.jade", ["templates"])
- gulp.watch(paths.sass, ["styles-watch"])
+ gulp.watch(paths.sass, ["styles"])
gulp.watch(paths.svg, ["copy-svg"])
gulp.watch(paths.coffee, ["app-watch"])
gulp.watch(paths.js, ["jslibs-watch"])
@@ -329,10 +334,10 @@ gulp.task "watch", ->
gulp.watch(paths.images, ["copy-images"])
gulp.watch(paths.fonts, ["copy-fonts"])
+# Remove the tmp directory
+del.sync(paths.tmp)
gulp.task "deploy", [
- "delete-tmp-styles",
- "templates",
"copy",
"jade-deploy",
"app-deploy",
@@ -342,9 +347,7 @@ gulp.task "deploy", [
# The default task (called when you run gulp from cli)
gulp.task "default", [
- "delete-tmp-styles",
"copy",
- "templates",
"styles",
"app-watch",
"jslibs-watch",
diff --git a/package.json b/package.json
index 581ce792..275d5241 100644
--- a/package.json
+++ b/package.json
@@ -18,8 +18,10 @@
],
"devDependencies": {
"coffee-script": "^1.8.0",
+ "del": "^1.1.1",
"express": "^4.9.5",
- "gulp": "^3.8.8",
+ "gulp": "^3.8.10",
+ "gulp-angular-templatecache": "^1.5.0",
"gulp-autoprefixer": "^2.0.0",
"gulp-cached": "0.0.3",
"gulp-changed": "^0.4.0",
@@ -52,7 +54,6 @@
"gulp-wrap": "^0.3.0",
"lazypipe": "^0.2.2",
"readable-stream": "~1.0.31",
- "rimraf": "^2.2.8",
"run-sequence": "^1.0.1",
"through2": "~0.6.1",
"gulp-replace": "^0.5.2"