diff --git a/app/coffee/modules/admin/third-parties.coffee b/app/coffee/modules/admin/third-parties.coffee index 80abf881..1f71b4c9 100644 --- a/app/coffee/modules/admin/third-parties.coffee +++ b/app/coffee/modules/admin/third-parties.coffee @@ -57,6 +57,10 @@ class GithubController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi promise.then null, @.onInitialDataError.bind(@) + loadModules: -> + return @rs.modules.list(@scope.projectId, "github").then (github) => + @scope.github = github + loadProject: -> return @rs.projects.get(@scope.projectId).then (project) => @scope.project = project @@ -71,11 +75,11 @@ class GithubController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi return data return promise.then(=> @.loadProject()) + .then(=> @.loadModules()) module.controller("GithubController", GithubController) - SelectInputText = -> link = ($scope, $el, $attrs) -> $el.on "click", ".select-input-content", () -> @@ -85,3 +89,40 @@ SelectInputText = -> return {link:link} module.directive("tgSelectInputText", SelectInputText) + +############################################################################# +## GithubWebhooks Directive +############################################################################# + +GithubWebhooksDirective = ($repo, $confirm, $loading, $navurls, $location) -> + link = ($scope, $el, $attrs) -> + form = $el.find("form").checksley({"onlyOneErrorElement": true}) + submit = (target) => + return if not form.validate() + + $loading.start(target) + + promise = $repo.saveAttribute($scope.github, "github") + promise.then -> + $loading.finish(target) + $confirm.notify("success") + + promise.then null, (data) -> + $loading.finish(target) + form.setErrors(data) + if data._error_message + $confirm.notify("error", data._error_message) + + + $el.on "click", "a.button-green", (event) -> + event.preventDefault() + target = angular.element(event.currentTarget) + submit(target) + + $el.on "submit", "form", (event) -> + event.preventDefault() + submit() + + return {link:link} + +module.directive("tgGithubWebhooks", ["$tgRepo", "$tgConfirm", "$tgLoading", "$tgNavUrls", "$tgLocation", GithubWebhooksDirective]) diff --git a/app/coffee/modules/base/repository.coffee b/app/coffee/modules/base/repository.coffee index 05ca4846..ed65360f 100644 --- a/app/coffee/modules/base/repository.coffee +++ b/app/coffee/modules/base/repository.coffee @@ -28,8 +28,11 @@ class RepositoryService extends taiga.Service super() resolveUrlForModel: (model) -> - idAttrName = model.getIdAttrName() - return "#{@urls.resolve(model.getName())}/#{model[idAttrName]}" + if model.parent + return @urls.resolve(model.getName(), model.parent) + else + idAttrName = model.getIdAttrName() + return "#{@urls.resolve(model.getName())}/#{model[idAttrName]}" create: (name, data, dataTypes={}, extraParams={}) -> defered = @q.defer() @@ -89,6 +92,37 @@ class RepositoryService extends taiga.Service return defered.promise + saveAttribute: (model, attribute, patch=true) -> + defered = @q.defer() + + if not model.isModified() and patch + defered.resolve(model) + return defered.promise + + url = @.resolveUrlForModel(model) + + data = {} + + data[attribute] = model.getAttrs() + + if patch + promise = @http.patch(url, data) + else + promise = @http.put(url, data) + + promise.success (data, status) => + model._isModified = false + model._attrs = _.extend(model.getAttrs(), data) + model._modifiedAttrs = {} + + model.applyCasts() + defered.resolve(model) + + promise.error (data, status) -> + defered.reject(data) + + return defered.promise + refresh: (model) -> defered = @q.defer() @@ -115,6 +149,19 @@ class RepositoryService extends taiga.Service return @http.get(url, params, httpOptions).then (data) => return _.map(data.data, (x) => @model.make_model(name, x)) + queryOneAttribute: (name, id, attribute, params, options={}) -> + url = @urls.resolve(name, id) + httpOptions = {headers: {}} + + if not options.enablePagination + httpOptions.headers["x-disable-pagination"] = "1" + + return @http.get(url, params, httpOptions).then (data) => + model = @model.make_model(name, data.data[attribute]) + model.parent = id + + return model + queryOne: (name, id, params, options={}) -> url = @urls.resolve(name) url = "#{url}/#{id}" if id diff --git a/app/coffee/modules/resources.coffee b/app/coffee/modules/resources.coffee index 18675d29..2bce1f4b 100644 --- a/app/coffee/modules/resources.coffee +++ b/app/coffee/modules/resources.coffee @@ -83,6 +83,7 @@ urls = { "issue-types": "/issue-types" "priorities": "/priorities" "severities": "/severities" + "project-modules": "/projects/%s/modules" # History "history/us": "/history/userstory" @@ -138,5 +139,6 @@ module.run([ "$tgMdRenderResourcesProvider", "$tgHistoryResourcesProvider", "$tgKanbanResourcesProvider", + "$tgModulesResourcesProvider", initResources ]) diff --git a/app/coffee/modules/resources/modules.coffee b/app/coffee/modules/resources/modules.coffee new file mode 100644 index 00000000..fcb6e6a7 --- /dev/null +++ b/app/coffee/modules/resources/modules.coffee @@ -0,0 +1,12 @@ +resourceProvider = ($repo) -> + service = {} + + service.list = (projectId, module) -> + return $repo.queryOneAttribute("project-modules", projectId, module) + + return (instance) -> + instance.modules = service + + +module = angular.module("taigaResources") +module.factory("$tgModulesResourcesProvider", ["$tgRepo", resourceProvider]) diff --git a/app/partials/admin-third-parties-github.jade b/app/partials/admin-third-parties-github.jade index 1fe70404..4f84553e 100644 --- a/app/partials/admin-third-parties-github.jade +++ b/app/partials/admin-third-parties-github.jade @@ -2,7 +2,7 @@ block head title Taiga Your agile, free, and open source project management tool block content - div.wrapper.roles(ng-controller="GithubController as ctrl", + 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 @@ -15,14 +15,14 @@ block content form fieldset label(for="secret-key") Secret key - input(type="text", name="secret-key", placeholder="Secret key", id="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", name="payload-url", readonly="readonly", placeholder="Payload URL", id="payload-url") + 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 @@ -49,9 +49,7 @@ block content li Click on span Settings | > - span Webhooks - | > - span Services + span Webhooks & Services | > span Add webhook