-
+ Wiki
diff --git a/app/coffee/modules/resources.coffee b/app/coffee/modules/resources.coffee
index 7cf7a05e..1bb34c9a 100644
--- a/app/coffee/modules/resources.coffee
+++ b/app/coffee/modules/resources.coffee
@@ -44,6 +44,7 @@ urls = {
"issues-restore": "/api/v1/issues/%s/restore"
"wiki": "/api/v1/wiki"
"wiki-restore": "/api/v1/wiki/%s/restore"
+ "wiki-links": "/api/v1/wiki-links"
"choices/userstory-statuses": "/api/v1/userstory-statuses"
"choices/userstory-statuses/bulk-update-order": "/api/v1/userstory-statuses/bulk_update_order"
"choices/points": "/api/v1/points"
@@ -117,6 +118,7 @@ module.run([
"$tgSprintsResourcesProvider",
"$tgUserstoriesResourcesProvider",
"$tgTasksResourcesProvider",
+ "$tgWikiResourcesProvider",
"$tgIssuesResourcesProvider",
"$tgSearchResourcesProvider",
"$tgMdRenderResourcesProvider",
diff --git a/app/coffee/modules/resources/wiki.coffee b/app/coffee/modules/resources/wiki.coffee
new file mode 100644
index 00000000..6509f795
--- /dev/null
+++ b/app/coffee/modules/resources/wiki.coffee
@@ -0,0 +1,39 @@
+###
+# Copyright (C) 2014 Andrey Antukh
+# Copyright (C) 2014 Jesús Espino Garcia
+# Copyright (C) 2014 David Barragán Merino
+#
+# 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 .
+#
+# 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])
diff --git a/app/coffee/modules/wiki.coffee b/app/coffee/modules/wiki.coffee
new file mode 100644
index 00000000..cae93384
--- /dev/null
+++ b/app/coffee/modules/wiki.coffee
@@ -0,0 +1,22 @@
+###
+# Copyright (C) 2014 Andrey Antukh
+# Copyright (C) 2014 Jesús Espino Garcia
+# Copyright (C) 2014 David Barragán Merino
+#
+# 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 .
+#
+# File: modules/wiki.coffee
+###
+
+module = angular.module("taigaWiki", [])
diff --git a/app/coffee/modules/wiki/main.coffee b/app/coffee/modules/wiki/main.coffee
new file mode 100644
index 00000000..a2606567
--- /dev/null
+++ b/app/coffee/modules/wiki/main.coffee
@@ -0,0 +1,223 @@
+###
+# Copyright (C) 2014 Andrey Antukh
+# Copyright (C) 2014 Jesús Espino Garcia
+# Copyright (C) 2014 David Barragán Merino
+#
+# 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 .
+#
+# 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("""
+
+
+
+ last modification
+ <%- name %>
+ """)
+
+ 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])
diff --git a/app/coffee/modules/wiki/nav.coffee b/app/coffee/modules/wiki/nav.coffee
new file mode 100644
index 00000000..464048cc
--- /dev/null
+++ b/app/coffee/modules/wiki/nav.coffee
@@ -0,0 +1,118 @@
+###
+# Copyright (C) 2014 Andrey Antukh
+# Copyright (C) 2014 Jesús Espino Garcia
+# Copyright (C) 2014 David Barragán Merino
+#
+# 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 .
+#
+# 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("""
+
+
Links
+
+
+ Add link
+ """)
+ 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])
diff --git a/app/coffee/utils.coffee b/app/coffee/utils.coffee
index a5152fa7..2e88b6d0 100644
--- a/app/coffee/utils.coffee
+++ b/app/coffee/utils.coffee
@@ -44,6 +44,10 @@ trim = (data, char) ->
return _.str.trim(data, char)
+slugify = (data) ->
+ return _.str.slugify(data)
+
+
toggleText = (element, texts) ->
nextTextPosition = element.data('nextTextPosition')
nextTextPosition = 0 if not nextTextPosition? or nextTextPosition >= texts.length
@@ -99,6 +103,7 @@ taiga = @.taiga
taiga.bindOnce = bindOnce
taiga.mixOf = mixOf
taiga.trim = trim
+taiga.slugify = slugify
taiga.toggleText = toggleText
taiga.groupBy = groupBy
taiga.timeout = timeout
diff --git a/app/partials/views/modules/wiki-nav.jade b/app/partials/views/modules/wiki-nav.jade
index 37f9054e..e69de29b 100644
--- a/app/partials/views/modules/wiki-nav.jade
+++ b/app/partials/views/modules/wiki-nav.jade
@@ -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
diff --git a/app/partials/views/modules/wiki-summary.jade b/app/partials/views/modules/wiki-summary.jade
index 138e73bc..0b7ce122 100644
--- a/app/partials/views/modules/wiki-summary.jade
+++ b/app/partials/views/modules/wiki-summary.jade
@@ -1,21 +1,9 @@
div.summary.wiki-summary
ul
li
- span.number 20
- span.description document created
- li
- span.number 20
- span.description document attached
- li
- span.number 125
+ span.number(tg-bo-html="wiki.editions")
span.description times edited
li
- span.number 12/05/2014
+ span.number(tg-bo-html="wiki.modified_date|date:'dd/MM/yyyy HH:mm'")
span.description last edit
- li.username-edition
- 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
+ li.username-edition(tg-wiki-user-info, ng-model='wiki')
diff --git a/app/partials/wiki-edit.jade b/app/partials/wiki-edit.jade
new file mode 100644
index 00000000..b1a1754e
--- /dev/null
+++ b/app/partials/wiki-edit.jade
@@ -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
diff --git a/app/partials/wiki.jade b/app/partials/wiki.jade
index d4c2cb59..1b5a6f0d 100644
--- a/app/partials/wiki.jade
+++ b/app/partials/wiki.jade
@@ -1,60 +1,25 @@
-extends layout
+extends dummy-layout
block head
title Taiga Project management web application with scrum in mind!
block content
- div.wrapper
+ div.wrapper(tg-wiki-detail, ng-controller="WikiDetailController as ctrl",
+ ng-init="section='wiki'")
sidebar.menu-secondary.extrabar
- include views/modules/wiki-nav
+ section.wiki-nav(tg-wiki-nav, ng-model="wikiLinks")
section.main.backlog
//Include views/components/mainTitle
header
h1
- span Taiga
+ span(tg-bo-html="project.name")
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
- section.wiki-content.wysiwyg
- h1 Page title
- p.
- Lorem fistrum pecador benemeritaar ese hombree diodeno ese que llega me cago en tus muelas.
- 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
+
+ section.wiki-content.wysiwyg(tg-bind-html="wiki.html")
+
+ //include views/modules/attachments
diff --git a/app/styles/layout/wiki-edit.scss b/app/styles/layout/wiki-edit.scss
new file mode 100644
index 00000000..7fe0b393
--- /dev/null
+++ b/app/styles/layout/wiki-edit.scss
@@ -0,0 +1,10 @@
+.wysiwyg {
+ margin-bottom: 2rem;
+ textarea {
+ background: white;
+ max-height: none;
+ }
+}
+.save-wiki {
+ float: right;
+}
diff --git a/app/styles/layout/wiki.scss b/app/styles/layout/wiki.scss
index d8cfd8fb..f1501de6 100644
--- a/app/styles/layout/wiki.scss
+++ b/app/styles/layout/wiki.scss
@@ -1,3 +1,9 @@
.wiki-content {
margin-bottom: 2rem;
}
+.edit-wiki {
+ float: right;
+}
+.delete-wiki {
+ float: right;
+}
diff --git a/app/styles/main.scss b/app/styles/main.scss
index 65e63713..4d879775 100755
--- a/app/styles/main.scss
+++ b/app/styles/main.scss
@@ -123,6 +123,7 @@ $prefix-for-spec: true;
@import 'layout/kanban';
@import 'layout/issues';
@import 'layout/wiki';
+@import 'layout/wiki-edit';
//#################################################
// Shame
diff --git a/app/styles/modules/wiki/wiki-nav.scss b/app/styles/modules/wiki/wiki-nav.scss
index 583372b4..10928487 100644
--- a/app/styles/modules/wiki/wiki-nav.scss
+++ b/app/styles/modules/wiki/wiki-nav.scss
@@ -13,6 +13,9 @@
a {
display: block;
padding: 1rem 0 1rem 1rem;
+ span {
+ cursor: pointer;
+ }
}
.icon {
@include transition (opacity 1s linear);
diff --git a/gulpfile.coffee b/gulpfile.coffee
index f3879877..89924bdf 100644
--- a/gulpfile.coffee
+++ b/gulpfile.coffee
@@ -46,6 +46,7 @@ paths = {
"app/coffee/modules/issues/*.coffee",
"app/coffee/modules/userstories/*.coffee",
"app/coffee/modules/tasks/*.coffee",
+ "app/coffee/modules/wiki/*.coffee",
"app/coffee/modules/admin/*.coffee",
"app/coffee/modules/locales/*.coffee",
"app/coffee/modules/base/*.coffee",