Integration of wiki
parent
1fdd7acf5b
commit
8babff7cec
|
@ -45,6 +45,16 @@ configure = ($routeProvider, $locationProvider, $httpProvider, $provide) ->
|
||||||
$routeProvider.when("/project/:pslug/tasks/:taskref/edit",
|
$routeProvider.when("/project/:pslug/tasks/:taskref/edit",
|
||||||
{templateUrl: "/partials/task-detail-edit.html"})
|
{templateUrl: "/partials/task-detail-edit.html"})
|
||||||
|
|
||||||
|
# Wiki
|
||||||
|
$routeProvider.when("/project/:pslug/wiki",
|
||||||
|
{redirectTo: (params) -> "/project/#{params.pslug}/wiki/home"})
|
||||||
|
|
||||||
|
$routeProvider.when("/project/:pslug/wiki/:slug",
|
||||||
|
{templateUrl: "/partials/wiki.html"})
|
||||||
|
|
||||||
|
$routeProvider.when("/project/:pslug/wiki/:slug/edit",
|
||||||
|
{templateUrl: "/partials/wiki-edit.html"})
|
||||||
|
|
||||||
# Issues
|
# Issues
|
||||||
$routeProvider.when("/project/:pslug/issues", {templateUrl: "/partials/issues.html"})
|
$routeProvider.when("/project/:pslug/issues", {templateUrl: "/partials/issues.html"})
|
||||||
$routeProvider.when("/project/:pslug/issues/:issueref",
|
$routeProvider.when("/project/:pslug/issues/:issueref",
|
||||||
|
@ -147,6 +157,7 @@ modules = [
|
||||||
"taigaIssues",
|
"taigaIssues",
|
||||||
"taigaUserStories",
|
"taigaUserStories",
|
||||||
"taigaTasks",
|
"taigaTasks",
|
||||||
|
"taigaWiki",
|
||||||
"taigaSearch",
|
"taigaSearch",
|
||||||
"taigaAdmin",
|
"taigaAdmin",
|
||||||
"taigaNavMenu",
|
"taigaNavMenu",
|
||||||
|
|
|
@ -66,6 +66,9 @@ urls = {
|
||||||
"project-tasks-detail": "/project/:project/tasks/:ref",
|
"project-tasks-detail": "/project/:project/tasks/:ref",
|
||||||
"project-tasks-detail-edit": "/project/:project/tasks/:ref/edit",
|
"project-tasks-detail-edit": "/project/:project/tasks/:ref/edit",
|
||||||
|
|
||||||
|
"project-wiki": "/project/:project/wiki",
|
||||||
|
"project-wiki-page": "/project/:project/wiki/:slug",
|
||||||
|
|
||||||
"project-issues-detail": "/project/:project/issues/:ref",
|
"project-issues-detail": "/project/:project/issues/:ref",
|
||||||
"project-issues-detail-edit": "/project/:project/issues/:ref/edit",
|
"project-issues-detail-edit": "/project/:project/issues/:ref/edit",
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,13 @@ BindOnceSrcDirective = ->
|
||||||
$el.attr("src", val)
|
$el.attr("src", val)
|
||||||
return {link:link}
|
return {link:link}
|
||||||
|
|
||||||
|
# Object href bind once helper.
|
||||||
|
BindOnceHrefDirective = ->
|
||||||
|
link = ($scope, $el, $attrs) ->
|
||||||
|
bindOnce $scope, $attrs.tgBoHref, (val) ->
|
||||||
|
$el.attr("href", val)
|
||||||
|
return {link:link}
|
||||||
|
|
||||||
# Object alt bind once helper.
|
# Object alt bind once helper.
|
||||||
BindOnceAltDirective = ->
|
BindOnceAltDirective = ->
|
||||||
link = ($scope, $el, $attrs) ->
|
link = ($scope, $el, $attrs) ->
|
||||||
|
@ -75,6 +82,7 @@ module = angular.module("taigaBase")
|
||||||
module.directive("tgBoHtml", BindOnceHtmlDirective)
|
module.directive("tgBoHtml", BindOnceHtmlDirective)
|
||||||
module.directive("tgBoRef", BindOnceRefDirective)
|
module.directive("tgBoRef", BindOnceRefDirective)
|
||||||
module.directive("tgBoSrc", BindOnceSrcDirective)
|
module.directive("tgBoSrc", BindOnceSrcDirective)
|
||||||
|
module.directive("tgBoHref", BindOnceHrefDirective)
|
||||||
module.directive("tgBoAlt", BindOnceAltDirective)
|
module.directive("tgBoAlt", BindOnceAltDirective)
|
||||||
module.directive("tgBoTitle", BindOnceTitleDirective)
|
module.directive("tgBoTitle", BindOnceTitleDirective)
|
||||||
module.directive("tgBindTitle", BindTitleDirective)
|
module.directive("tgBindTitle", BindTitleDirective)
|
||||||
|
|
|
@ -147,6 +147,7 @@ class RepositoryService extends taiga.Service
|
||||||
params.task = options.taskref if options.taskref?
|
params.task = options.taskref if options.taskref?
|
||||||
params.issue = options.issueref if options.issueref?
|
params.issue = options.issueref if options.issueref?
|
||||||
params.milestone = options.mlref if options.mlref?
|
params.milestone = options.mlref if options.mlref?
|
||||||
|
params.wikipage = options.wikipage if options.wikipage?
|
||||||
return @.queryOneRaw("resolver", null, params)
|
return @.queryOneRaw("resolver", null, params)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ ProjectMenuDirective = ($log, $compile, $rootscope) ->
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li id="nav-wiki">
|
<li id="nav-wiki">
|
||||||
<a href="" title="Wiki">
|
<a href="" title="Wiki" tg-nav="project-wiki:project=project.slug">
|
||||||
<span class="icon icon-wiki"></span>
|
<span class="icon icon-wiki"></span>
|
||||||
<span class="item">Wiki</span>
|
<span class="item">Wiki</span>
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -44,6 +44,7 @@ urls = {
|
||||||
"issues-restore": "/api/v1/issues/%s/restore"
|
"issues-restore": "/api/v1/issues/%s/restore"
|
||||||
"wiki": "/api/v1/wiki"
|
"wiki": "/api/v1/wiki"
|
||||||
"wiki-restore": "/api/v1/wiki/%s/restore"
|
"wiki-restore": "/api/v1/wiki/%s/restore"
|
||||||
|
"wiki-links": "/api/v1/wiki-links"
|
||||||
"choices/userstory-statuses": "/api/v1/userstory-statuses"
|
"choices/userstory-statuses": "/api/v1/userstory-statuses"
|
||||||
"choices/userstory-statuses/bulk-update-order": "/api/v1/userstory-statuses/bulk_update_order"
|
"choices/userstory-statuses/bulk-update-order": "/api/v1/userstory-statuses/bulk_update_order"
|
||||||
"choices/points": "/api/v1/points"
|
"choices/points": "/api/v1/points"
|
||||||
|
@ -117,6 +118,7 @@ module.run([
|
||||||
"$tgSprintsResourcesProvider",
|
"$tgSprintsResourcesProvider",
|
||||||
"$tgUserstoriesResourcesProvider",
|
"$tgUserstoriesResourcesProvider",
|
||||||
"$tgTasksResourcesProvider",
|
"$tgTasksResourcesProvider",
|
||||||
|
"$tgWikiResourcesProvider",
|
||||||
"$tgIssuesResourcesProvider",
|
"$tgIssuesResourcesProvider",
|
||||||
"$tgSearchResourcesProvider",
|
"$tgSearchResourcesProvider",
|
||||||
"$tgMdRenderResourcesProvider",
|
"$tgMdRenderResourcesProvider",
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
###
|
||||||
|
# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
|
||||||
|
# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
|
||||||
|
# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# File: modules/resources/wikis.coffee
|
||||||
|
###
|
||||||
|
|
||||||
|
|
||||||
|
taiga = @.taiga
|
||||||
|
|
||||||
|
resourceProvider = ($repo, $http, $urls) ->
|
||||||
|
service = {}
|
||||||
|
|
||||||
|
service.get = (wikiId) ->
|
||||||
|
return $repo.queryOne("wiki", wikiId)
|
||||||
|
|
||||||
|
service.listLinks = (projectId) ->
|
||||||
|
return $repo.queryMany("wiki-links", {project: projectId})
|
||||||
|
|
||||||
|
return (instance) ->
|
||||||
|
instance.wiki = service
|
||||||
|
|
||||||
|
|
||||||
|
module = angular.module("taigaResources")
|
||||||
|
module.factory("$tgWikiResourcesProvider", ["$tgRepo", "$tgHttp", "$tgUrls", resourceProvider])
|
|
@ -0,0 +1,22 @@
|
||||||
|
###
|
||||||
|
# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
|
||||||
|
# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
|
||||||
|
# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# File: modules/wiki.coffee
|
||||||
|
###
|
||||||
|
|
||||||
|
module = angular.module("taigaWiki", [])
|
|
@ -0,0 +1,223 @@
|
||||||
|
###
|
||||||
|
# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
|
||||||
|
# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
|
||||||
|
# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# File: modules/wiki/detail.coffee
|
||||||
|
###
|
||||||
|
|
||||||
|
taiga = @.taiga
|
||||||
|
|
||||||
|
mixOf = @.taiga.mixOf
|
||||||
|
groupBy = @.taiga.groupBy
|
||||||
|
bindOnce = @.taiga.bindOnce
|
||||||
|
|
||||||
|
module = angular.module("taigaWiki")
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
## Wiki Detail Controller
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
class WikiDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
|
||||||
|
@.$inject = [
|
||||||
|
"$scope",
|
||||||
|
"$rootScope",
|
||||||
|
"$tgRepo",
|
||||||
|
"$tgConfirm",
|
||||||
|
"$tgResources",
|
||||||
|
"$routeParams",
|
||||||
|
"$q",
|
||||||
|
"$location",
|
||||||
|
"$filter",
|
||||||
|
]
|
||||||
|
|
||||||
|
constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @filter) ->
|
||||||
|
@scope.projectSlug = @params.pslug
|
||||||
|
@scope.wikiSlug = @params.slug
|
||||||
|
@scope.sectionName = "Wiki"
|
||||||
|
|
||||||
|
promise = @.loadInitialData()
|
||||||
|
promise.then null, ->
|
||||||
|
console.log "FAIL" #TODO
|
||||||
|
|
||||||
|
loadProject: ->
|
||||||
|
return @rs.projects.get(@scope.projectId).then (project) =>
|
||||||
|
@scope.project = project
|
||||||
|
@scope.membersById = groupBy(project.memberships, (x) -> x.user)
|
||||||
|
return project
|
||||||
|
|
||||||
|
loadWiki: ->
|
||||||
|
return @rs.wiki.get(@scope.wikiId).then (wiki) =>
|
||||||
|
@scope.wiki = wiki
|
||||||
|
|
||||||
|
loadWikiLinks: ->
|
||||||
|
return @rs.wiki.listLinks(@scope.projectId).then (wikiLinks) =>
|
||||||
|
@scope.wikiLinks = wikiLinks
|
||||||
|
|
||||||
|
loadInitialData: ->
|
||||||
|
params = {
|
||||||
|
pslug: @params.pslug
|
||||||
|
wikipage: @params.slug
|
||||||
|
}
|
||||||
|
|
||||||
|
promise = @repo.resolve(params).then (data) =>
|
||||||
|
@scope.wikiId = data.wikipage
|
||||||
|
@scope.projectId = data.project
|
||||||
|
return data
|
||||||
|
|
||||||
|
promise.then null, =>
|
||||||
|
@location.path("/project/#{@params.pslug}/wiki/#{@params.slug}/edit")
|
||||||
|
|
||||||
|
return promise.then(=> @.loadProject())
|
||||||
|
.then(=> @.loadUsersAndRoles())
|
||||||
|
.then(=> @.loadWikiLinks())
|
||||||
|
.then(=> @.loadWiki())
|
||||||
|
|
||||||
|
edit: ->
|
||||||
|
@location.path("/project/#{@scope.projectSlug}/wiki/#{@scope.wikiSlug}/edit")
|
||||||
|
|
||||||
|
delete: ->
|
||||||
|
onSuccess = =>
|
||||||
|
@confirm.notify("success")
|
||||||
|
@location.path("/project/#{@scope.projectSlug}/wiki")
|
||||||
|
onError = =>
|
||||||
|
@confirm.notify("error")
|
||||||
|
@repo.remove(@scope.wiki).then onSuccess, onError
|
||||||
|
|
||||||
|
module.controller("WikiDetailController", WikiDetailController)
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
## Wiki Edit Controller
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
class WikiEditController extends WikiDetailController
|
||||||
|
loadInitialData: ->
|
||||||
|
deferred = @q.defer()
|
||||||
|
params = {
|
||||||
|
pslug: @params.pslug
|
||||||
|
}
|
||||||
|
|
||||||
|
promise = @repo.resolve(params)
|
||||||
|
|
||||||
|
promise.then (data) =>
|
||||||
|
@scope.wikiId = data.wikipage
|
||||||
|
@scope.projectId = data.project
|
||||||
|
return data
|
||||||
|
|
||||||
|
promise.then(=> @.loadProject())
|
||||||
|
.then(=> @.loadUsersAndRoles())
|
||||||
|
.then(=> @.loadWikiLinks())
|
||||||
|
|
||||||
|
params = {
|
||||||
|
pslug: @params.pslug
|
||||||
|
wikipage: @params.slug
|
||||||
|
}
|
||||||
|
|
||||||
|
promise2 = @repo.resolve(params)
|
||||||
|
|
||||||
|
promise2.then (data) =>
|
||||||
|
@scope.wikiId = data.wikipage
|
||||||
|
return data
|
||||||
|
|
||||||
|
promise2.then => @.loadWiki()
|
||||||
|
promise2.then null, =>
|
||||||
|
@scope.wiki = {
|
||||||
|
content: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return @q.all(promise, promise2)
|
||||||
|
|
||||||
|
save: ->
|
||||||
|
onSuccess = =>
|
||||||
|
@confirm.notify("success")
|
||||||
|
@location.path("/project/#{@scope.projectSlug}/wiki/#{@scope.wiki.slug}")
|
||||||
|
|
||||||
|
onError = =>
|
||||||
|
@confirm.notify("error")
|
||||||
|
@location.path("/project/#{@scope.projectSlug}/wiki/#{@scope.wiki.slug}")
|
||||||
|
|
||||||
|
if @scope.wiki.id
|
||||||
|
@repo.save(@scope.wiki).then onSuccess, onError
|
||||||
|
else
|
||||||
|
@scope.wiki.project = @scope.projectId
|
||||||
|
@scope.wiki.slug = @scope.wikiSlug
|
||||||
|
@repo.create("wiki", @scope.wiki).then onSuccess, onError
|
||||||
|
|
||||||
|
|
||||||
|
module.controller("WikiEditController", WikiEditController)
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
## Wiki Main Directive
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
WikiDirective = ($tgrepo, $log, $location, $confirm) ->
|
||||||
|
link = ($scope, $el, $attrs) ->
|
||||||
|
$ctrl = $el.controller()
|
||||||
|
|
||||||
|
return {link:link}
|
||||||
|
|
||||||
|
module.directive("tgWikiDetail", ["$tgRepo", "$log", "$tgLocation", "$tgConfirm", WikiDirective])
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
## Wiki Edit Main Directive
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
WikiEditDirective = ($tgrepo, $log, $location, $confirm) ->
|
||||||
|
link = ($scope, $el, $attrs) ->
|
||||||
|
$ctrl = $el.controller()
|
||||||
|
|
||||||
|
return {link:link}
|
||||||
|
|
||||||
|
module.directive("tgWikiEdit", ["$tgRepo", "$log", "$tgLocation", "$tgConfirm", WikiEditDirective])
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
## Wiki User Info Directive
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
WikiUserInfoDirective = ($log) ->
|
||||||
|
template = _.template("""
|
||||||
|
<figure class="avatar">
|
||||||
|
<img src="<%= imgurl %>" alt="<%- name %>">
|
||||||
|
</figure>
|
||||||
|
<span class="description">last modification</span>
|
||||||
|
<span class="username"><%- name %></span>
|
||||||
|
""")
|
||||||
|
|
||||||
|
link = ($scope, $el, $attrs) ->
|
||||||
|
if not $attrs.ngModel?
|
||||||
|
return $log.error "WikiUserDirective: no ng-model attr is defined"
|
||||||
|
|
||||||
|
render = (wiki) ->
|
||||||
|
if not $scope.usersById?
|
||||||
|
$log.error "WikiUserDirective requires userById set in scope."
|
||||||
|
else
|
||||||
|
user = $scope.usersById[wiki.last_modifier]
|
||||||
|
if user is undefined
|
||||||
|
ctx = {name: "Unassigned", imgurl: "/images/unnamed.png"}
|
||||||
|
else
|
||||||
|
ctx = {name: user.full_name_display, imgurl: user.photo}
|
||||||
|
|
||||||
|
html = template(ctx)
|
||||||
|
$el.html(html)
|
||||||
|
|
||||||
|
bindOnce($scope, $attrs.ngModel, render)
|
||||||
|
|
||||||
|
return {
|
||||||
|
link: link
|
||||||
|
restrict: "AE"
|
||||||
|
}
|
||||||
|
|
||||||
|
module.directive("tgWikiUserInfo", ["$tgRepo", "$log", "$tgLocation", "$tgConfirm", WikiUserInfoDirective])
|
|
@ -0,0 +1,118 @@
|
||||||
|
###
|
||||||
|
# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
|
||||||
|
# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
|
||||||
|
# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# File: modules/wiki/detail.coffee
|
||||||
|
###
|
||||||
|
|
||||||
|
taiga = @.taiga
|
||||||
|
|
||||||
|
mixOf = @.taiga.mixOf
|
||||||
|
groupBy = @.taiga.groupBy
|
||||||
|
bindOnce = @.taiga.bindOnce
|
||||||
|
slugify = @.taiga.slugify
|
||||||
|
|
||||||
|
module = angular.module("taigaWiki")
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
## Wiki Main Directive
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
WikiNavDirective = ($tgrepo, $log, $location, $confirm) ->
|
||||||
|
template = _.template("""
|
||||||
|
<header>
|
||||||
|
<h1>Links</h1>
|
||||||
|
</header>
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
<% _.each(wikiLinks, function(link, index) { %>
|
||||||
|
<li class="wiki-link" data-id="<%- index %>">
|
||||||
|
<a title="<%- link.title %>">
|
||||||
|
<span class="link-title"><%- link.title %></span>
|
||||||
|
<span class="icon icon-delete"></span>
|
||||||
|
</a>
|
||||||
|
<input type="text" placeholder="name" class="hidden" value="<%- link.title %>" />
|
||||||
|
</li>
|
||||||
|
<% }) %>
|
||||||
|
<li class="new hidden">
|
||||||
|
<input type="text" placeholder="name"/>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
<a href="" title="Add link" class="add-button button button-gray">Add link</a>
|
||||||
|
""")
|
||||||
|
link = ($scope, $el, $attrs) ->
|
||||||
|
$ctrl = $el.controller()
|
||||||
|
|
||||||
|
if not $attrs.ngModel?
|
||||||
|
return $log.error "WikiNavDirective: no ng-model attr is defined"
|
||||||
|
|
||||||
|
render = (wikiLinks) ->
|
||||||
|
html = template({wikiLinks: wikiLinks, projectSlug: $scope.projectSlug})
|
||||||
|
|
||||||
|
$el.off()
|
||||||
|
$el.html(html)
|
||||||
|
|
||||||
|
$el.on "click", ".wiki-link .link-title", (event) ->
|
||||||
|
event.preventDefault()
|
||||||
|
target = angular.element(event.currentTarget)
|
||||||
|
linkId = target.parents('.wiki-link').data('id')
|
||||||
|
linkSlug = $scope.wikiLinks[linkId].href
|
||||||
|
$scope.$apply ->
|
||||||
|
$location.path("/project/#{$scope.projectSlug}/wiki/#{linkSlug}")
|
||||||
|
|
||||||
|
$el.on "click", ".add-button", (event) ->
|
||||||
|
event.preventDefault()
|
||||||
|
$el.find(".new").removeClass("hidden")
|
||||||
|
$el.find(".new input").focus()
|
||||||
|
$el.find(".add-button").hide()
|
||||||
|
|
||||||
|
$el.on "click", ".wiki-link .icon-delete", (event) ->
|
||||||
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
|
target = angular.element(event.currentTarget)
|
||||||
|
linkId = target.parents('.wiki-link').data('id')
|
||||||
|
$tgrepo.remove($scope.wikiLinks[linkId]).then ->
|
||||||
|
$ctrl.loadWikiLinks().then ->
|
||||||
|
render($scope.wikiLinks)
|
||||||
|
|
||||||
|
$el.on "keyup", ".new input", (event) ->
|
||||||
|
event.preventDefault()
|
||||||
|
if event.keyCode == 13
|
||||||
|
target = angular.element(event.currentTarget)
|
||||||
|
newLink = target.val()
|
||||||
|
|
||||||
|
$el.find(".new").addClass("hidden")
|
||||||
|
$el.find(".new input").val('')
|
||||||
|
|
||||||
|
$tgrepo.create("wiki-links", {project: $scope.projectId, title: newLink, href: slugify(newLink)}).then ->
|
||||||
|
$ctrl.loadWikiLinks().then ->
|
||||||
|
render($scope.wikiLinks)
|
||||||
|
$el.find(".add-button").show()
|
||||||
|
|
||||||
|
else if event.keyCode == 27
|
||||||
|
target = angular.element(event.currentTarget)
|
||||||
|
$el.find(".new").addClass("hidden")
|
||||||
|
$el.find(".new input").val('')
|
||||||
|
$el.find(".add-button").show()
|
||||||
|
|
||||||
|
|
||||||
|
bindOnce($scope, $attrs.ngModel, render)
|
||||||
|
|
||||||
|
return {link:link}
|
||||||
|
|
||||||
|
module.directive("tgWikiNav", ["$tgRepo", "$log", "$tgLocation", "$tgConfirm", WikiNavDirective])
|
|
@ -44,6 +44,10 @@ trim = (data, char) ->
|
||||||
return _.str.trim(data, char)
|
return _.str.trim(data, char)
|
||||||
|
|
||||||
|
|
||||||
|
slugify = (data) ->
|
||||||
|
return _.str.slugify(data)
|
||||||
|
|
||||||
|
|
||||||
toggleText = (element, texts) ->
|
toggleText = (element, texts) ->
|
||||||
nextTextPosition = element.data('nextTextPosition')
|
nextTextPosition = element.data('nextTextPosition')
|
||||||
nextTextPosition = 0 if not nextTextPosition? or nextTextPosition >= texts.length
|
nextTextPosition = 0 if not nextTextPosition? or nextTextPosition >= texts.length
|
||||||
|
@ -99,6 +103,7 @@ taiga = @.taiga
|
||||||
taiga.bindOnce = bindOnce
|
taiga.bindOnce = bindOnce
|
||||||
taiga.mixOf = mixOf
|
taiga.mixOf = mixOf
|
||||||
taiga.trim = trim
|
taiga.trim = trim
|
||||||
|
taiga.slugify = slugify
|
||||||
taiga.toggleText = toggleText
|
taiga.toggleText = toggleText
|
||||||
taiga.groupBy = groupBy
|
taiga.groupBy = groupBy
|
||||||
taiga.timeout = timeout
|
taiga.timeout = timeout
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
section.wiki-nav
|
|
||||||
header
|
|
||||||
h1 Links
|
|
||||||
nav
|
|
||||||
ul
|
|
||||||
li
|
|
||||||
a(href="", title="link-name")
|
|
||||||
span Link1
|
|
||||||
span.icon.icon-arrow-right
|
|
||||||
li
|
|
||||||
a(href="", title="link-name")
|
|
||||||
span Link1
|
|
||||||
span.icon.icon-arrow-right
|
|
||||||
li
|
|
||||||
a(href="", title="link-name")
|
|
||||||
span Link1
|
|
||||||
span.icon.icon-arrow-right
|
|
||||||
li
|
|
||||||
a(href="", title="link-name")
|
|
||||||
span Link1
|
|
||||||
span.icon.icon-arrow-right
|
|
||||||
li
|
|
||||||
a(href="", title="link-name")
|
|
||||||
span Link1
|
|
||||||
span.icon.icon-arrow-right
|
|
||||||
a.button.button-green(href="", title="Edit page") Edit page
|
|
||||||
a.button.button-gray(href="", title="Add page") Add page
|
|
||||||
a.button.button-red(href="", title="Delete page") Delete page
|
|
|
@ -1,21 +1,9 @@
|
||||||
div.summary.wiki-summary
|
div.summary.wiki-summary
|
||||||
ul
|
ul
|
||||||
li
|
li
|
||||||
span.number 20
|
span.number(tg-bo-html="wiki.editions")
|
||||||
span.description document <br />created
|
|
||||||
li
|
|
||||||
span.number 20
|
|
||||||
span.description document <br />attached
|
|
||||||
li
|
|
||||||
span.number 125
|
|
||||||
span.description times <br />edited
|
span.description times <br />edited
|
||||||
li
|
li
|
||||||
span.number 12/05/2014
|
span.number(tg-bo-html="wiki.modified_date|date:'dd/MM/yyyy HH:mm'")
|
||||||
span.description last <br />edit
|
span.description last <br />edit
|
||||||
li.username-edition
|
li.username-edition(tg-wiki-user-info, ng-model='wiki')
|
||||||
figure.avatar
|
|
||||||
img(src="http://thecodeplayer.com/u/uifaces/34.jpg", alt="username")
|
|
||||||
span.description last modification
|
|
||||||
span.username Anler Hernández
|
|
||||||
//- Do we really need a button for this?
|
|
||||||
a.button.button-green(href="", title="See history") See history
|
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
extends dummy-layout
|
||||||
|
|
||||||
|
block head
|
||||||
|
title Taiga Project management web application with scrum in mind!
|
||||||
|
|
||||||
|
block content
|
||||||
|
div.wrapper(tg-wiki-edit, ng-controller="WikiEditController as ctrl",
|
||||||
|
ng-init="section='wiki'")
|
||||||
|
sidebar.menu-secondary.extrabar
|
||||||
|
section.wiki-nav(tg-wiki-nav, ng-model="wikiLinks")
|
||||||
|
section.main.backlog
|
||||||
|
//Include views/components/mainTitle
|
||||||
|
header
|
||||||
|
h1
|
||||||
|
span(tg-bo-html="project.name")
|
||||||
|
span.green Wiki
|
||||||
|
span.green(tg-bo-html='wikiSlug')
|
||||||
|
a.button.button-green.save-wiki(href="", title="Save", ng-click="ctrl.save()") Save
|
||||||
|
|
||||||
|
section.wysiwyg
|
||||||
|
textarea(placeholder="Write a your wiki page", ng-model="wiki.content", tg-markitup)
|
||||||
|
|
||||||
|
//include views/modules/attachments
|
|
@ -1,60 +1,25 @@
|
||||||
extends layout
|
extends dummy-layout
|
||||||
|
|
||||||
block head
|
block head
|
||||||
title Taiga Project management web application with scrum in mind!
|
title Taiga Project management web application with scrum in mind!
|
||||||
|
|
||||||
block content
|
block content
|
||||||
div.wrapper
|
div.wrapper(tg-wiki-detail, ng-controller="WikiDetailController as ctrl",
|
||||||
|
ng-init="section='wiki'")
|
||||||
sidebar.menu-secondary.extrabar
|
sidebar.menu-secondary.extrabar
|
||||||
include views/modules/wiki-nav
|
section.wiki-nav(tg-wiki-nav, ng-model="wikiLinks")
|
||||||
section.main.backlog
|
section.main.backlog
|
||||||
//Include views/components/mainTitle
|
//Include views/components/mainTitle
|
||||||
header
|
header
|
||||||
h1
|
h1
|
||||||
span Taiga
|
span(tg-bo-html="project.name")
|
||||||
span.green Wiki
|
span.green Wiki
|
||||||
|
span.wiki-title(tg-bo-html='wiki.slug')
|
||||||
|
a.button.button-red.edit-wiki(href="", title="Delete", ng-click="ctrl.delete()") Delete
|
||||||
|
a.button.button-green.edit-wiki(href="", title="Edit", ng-click="ctrl.edit()") Edit
|
||||||
|
|
||||||
include views/modules/wiki-summary
|
include views/modules/wiki-summary
|
||||||
section.wiki-content.wysiwyg
|
|
||||||
h1 Page title
|
section.wiki-content.wysiwyg(tg-bind-html="wiki.html")
|
||||||
p.
|
|
||||||
Lorem fistrum pecador benemeritaar ese hombree diodeno ese que llega me cago en tus muelas.
|
//include views/modules/attachments
|
||||||
Benemeritaar torpedo diodenoo la caidita mamaar sexuarl condemor te voy a borrar el cerito al ataquerl papaar papaar.
|
|
||||||
Pupita por la gloria de mi madre torpedo quietooor condemor apetecan.
|
|
||||||
Mamaar por la gloria de mi madre se calle ustée la caidita de la pradera ese que llega caballo blanco caballo negroorl ese hombree jarl.
|
|
||||||
No te digo trigo por no llamarte Rodrigor pecador te va a hasé pupitaa hasta luego Lucas está la cosa muy malar benemeritaar.
|
|
||||||
h2 Section Title
|
|
||||||
p.
|
|
||||||
No puedor mamaar a wan de la pradera diodenoo jarl diodenoo ese hombree.
|
|
||||||
Benemeritaar al ataquerl apetecan amatomaa ese que llega a peich al ataquerl torpedo a wan qué dise usteer mamaar.
|
|
||||||
Qué dise usteer condemor pupita papaar papaar quietooor pupita.
|
|
||||||
Papaar papaar va usté muy cargadoo está la cosa muy malar pecador jarl se calle ustée.
|
|
||||||
h3 Subsection title
|
|
||||||
p.
|
|
||||||
Qué dise usteer ese pedazo de no puedor te voy a borrar el cerito condemor se calle ustée no puedor a gramenawer a wan.
|
|
||||||
A wan no te digo trigo por no llamarte Rodrigor al ataquerl diodenoo la caidita está la cosa muy malar mamaar va usté muy cargadoo no te digo
|
|
||||||
trigo por no llamarte Rodrigor diodeno.
|
|
||||||
Se calle ustée caballo blanco caballo negroorl benemeritaar jarl amatomaa ahorarr pupita está la cosa muy malar.
|
|
||||||
ul
|
|
||||||
li text in paragraphs
|
|
||||||
li Qué dise usteer ese pedazo de no puedor te voy a borrar el cerito condemor se calle ustée no puedor a gramenawer a wan.
|
|
||||||
li Se calle ustée caballo blanco caballo negroorl benemeritaar jarl amatomaa ahorarr pupita está la cosa muy malar.
|
|
||||||
li text in paragraphs
|
|
||||||
li text in paragraphs
|
|
||||||
ol
|
|
||||||
li text in paragraphs
|
|
||||||
li Qué dise usteer ese pedazo de no puedor te voy a borrar el cerito condemor se calle ustée no puedor a gramenawer a wan.
|
|
||||||
li Se calle ustée caballo blanco caballo negroorl benemeritaar jarl amatomaa ahorarr pupita está la cosa muy malar.
|
|
||||||
li text in paragraphs
|
|
||||||
li text in paragraphs
|
|
||||||
p Se calle ustée caballo blanco caballo negroorl benemeritaar jarl amatomaa ahorarr pupita está la cosa muy malar.
|
|
||||||
a(href="") Benemeritaar torpedo diodenoo la caidita mamaar
|
|
||||||
blockquote
|
|
||||||
Pupita por la gloria de mi madre torpedo quietooor condemor apetecan.
|
|
||||||
pre.
|
|
||||||
.button {
|
|
||||||
color: $white;
|
|
||||||
display: block;
|
|
||||||
margin-bottom: .5rem;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
include views/modules/attachments
|
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
.wysiwyg {
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
textarea {
|
||||||
|
background: white;
|
||||||
|
max-height: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.save-wiki {
|
||||||
|
float: right;
|
||||||
|
}
|
|
@ -1,3 +1,9 @@
|
||||||
.wiki-content {
|
.wiki-content {
|
||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
}
|
}
|
||||||
|
.edit-wiki {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.delete-wiki {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
|
@ -123,6 +123,7 @@ $prefix-for-spec: true;
|
||||||
@import 'layout/kanban';
|
@import 'layout/kanban';
|
||||||
@import 'layout/issues';
|
@import 'layout/issues';
|
||||||
@import 'layout/wiki';
|
@import 'layout/wiki';
|
||||||
|
@import 'layout/wiki-edit';
|
||||||
|
|
||||||
//#################################################
|
//#################################################
|
||||||
// Shame
|
// Shame
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
a {
|
a {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 1rem 0 1rem 1rem;
|
padding: 1rem 0 1rem 1rem;
|
||||||
|
span {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.icon {
|
.icon {
|
||||||
@include transition (opacity 1s linear);
|
@include transition (opacity 1s linear);
|
||||||
|
|
|
@ -46,6 +46,7 @@ paths = {
|
||||||
"app/coffee/modules/issues/*.coffee",
|
"app/coffee/modules/issues/*.coffee",
|
||||||
"app/coffee/modules/userstories/*.coffee",
|
"app/coffee/modules/userstories/*.coffee",
|
||||||
"app/coffee/modules/tasks/*.coffee",
|
"app/coffee/modules/tasks/*.coffee",
|
||||||
|
"app/coffee/modules/wiki/*.coffee",
|
||||||
"app/coffee/modules/admin/*.coffee",
|
"app/coffee/modules/admin/*.coffee",
|
||||||
"app/coffee/modules/locales/*.coffee",
|
"app/coffee/modules/locales/*.coffee",
|
||||||
"app/coffee/modules/base/*.coffee",
|
"app/coffee/modules/base/*.coffee",
|
||||||
|
|
Loading…
Reference in New Issue