From 563d69f91f8a89fd75310255badde6342212cfc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Wed, 25 Nov 2015 16:31:45 +0100 Subject: [PATCH] Tribe integration in taiga --- CHANGELOG.md | 1 + app-loader/app-loader.coffee | 1 + app/coffee/modules/userstories/detail.coffee | 18 ++- app/images/monster-fight.png | Bin 0 -> 35983 bytes app/images/tribe-logo.png | Bin 0 -> 6212 bytes app/locales/taiga/locale-en.json | 11 ++ .../tribe-button.directive.coffee | 37 ++++++ .../components/tribe-button/tribe-button.jade | 10 ++ .../tribe-linked.directive.coffee | 48 +++++++ .../components/tribe-button/tribe-linked.jade | 33 +++++ .../components/tribe-button/tribe-linked.scss | 123 ++++++++++++++++++ app/modules/external-apps/external-app.scss | 7 +- app/partials/us/us-detail.jade | 16 +++ app/styles/components/buttons.scss | 25 ++++ app/themes/high-contrast/variables.scss | 4 +- app/themes/material-design/variables.scss | 4 +- app/themes/taiga/variables.scss | 4 +- conf/conf.example.json | 3 +- 18 files changed, 334 insertions(+), 11 deletions(-) create mode 100644 app/images/monster-fight.png create mode 100644 app/images/tribe-logo.png create mode 100644 app/modules/components/tribe-button/tribe-button.directive.coffee create mode 100644 app/modules/components/tribe-button/tribe-button.jade create mode 100644 app/modules/components/tribe-button/tribe-linked.directive.coffee create mode 100644 app/modules/components/tribe-button/tribe-linked.jade create mode 100644 app/modules/components/tribe-button/tribe-linked.scss diff --git a/CHANGELOG.md b/CHANGELOG.md index ad2e8f5b..1f05dcd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Features - Show a confirmation notice when you exit edit mode by pressing ESC in the markdown inputs. +- Add the tribe button to link stories from tree.taiga.io with gigs in tribe.taiga.io. ### Misc - Lots of small and not so small bugfixes. diff --git a/app-loader/app-loader.coffee b/app-loader/app-loader.coffee index 6cbe2f03..cee8fe74 100644 --- a/app-loader/app-loader.coffee +++ b/app-loader/app-loader.coffee @@ -3,6 +3,7 @@ window._version = "___VERSION___" window.taigaConfig = { "api": "http://localhost:8000/api/v1/", "eventsUrl": null, + "tribeHost": null, "eventsMaxMissedHeartbeats": 5, "eventsHeartbeatIntervalTime": 60000, "debug": true, diff --git a/app/coffee/modules/userstories/detail.coffee b/app/coffee/modules/userstories/detail.coffee index 8836c8e7..db09821d 100644 --- a/app/coffee/modules/userstories/detail.coffee +++ b/app/coffee/modules/userstories/detail.coffee @@ -50,15 +50,18 @@ class UserStoryDetailController extends mixOf(taiga.Controller, taiga.PageMixin) "$tgNavUrls", "$tgAnalytics", "$translate", + "$tgConfig", "$tgQueueModelTransformation" ] - constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, - @log, @appMetaService, @navUrls, @analytics, @translate, @modelTransform) -> + constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @log, @appMetaService, + @navUrls, @analytics, @translate, @configService, @modelTransform) -> bindMethods(@) @scope.usRef = @params.usref @scope.sectionName = @translate.instant("US.SECTION_NAME") + @scope.tribeEnabled = @configService.config.tribeHost + @.initializeEventHandlers() promise = @.loadInitialData() @@ -239,6 +242,17 @@ class UserStoryDetailController extends mixOf(taiga.Controller, taiga.PageMixin) return @rs.userstories.unwatch(@scope.usId).then(onSuccess, onError) + onTribeInfo: -> + publishTitle = @translate.instant("US.TRIBE.PUBLISH_MORE_INFO_TITLE") + image = $('') + .attr({ + 'src': "/#{window._version}/images/monster-fight.png", + 'alt': @translate.instant("US.TRIBE.PUBLISH_MORE_INFO_TITLE") + }) + text = @translate.instant("US.TRIBE.PUBLISH_MORE_INFO_TEXT") + publishDesc = $('
').append(image).append(text) + @confirm.success(publishTitle, publishDesc) + module.controller("UserStoryDetailController", UserStoryDetailController) diff --git a/app/images/monster-fight.png b/app/images/monster-fight.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd83f364d48dcf5f145e53231229028bdef31d7 GIT binary patch literal 35983 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 literal 0 HcmV?d00001 diff --git a/app/images/tribe-logo.png b/app/images/tribe-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4643c5b4b07f98a5d650d4fa5a8839aa8b7baf GIT binary patch literal 6212 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 you need help with a particular piece of work you can easily create gigs on Taiga Tribe and receive help from all over the world. You will be able to control and manage the gig enjoying a great community eager to contribute.

TaigaTribe was born as a Taiga sibling. Both platforms can live separately but we believe that there is much power in using them combined so we are making sure the integration works like a charm.

" + }, "FIELDS": { "TEAM_REQUIREMENT": "Team Requirement", "CLIENT_REQUIREMENT": "Client Requirement", diff --git a/app/modules/components/tribe-button/tribe-button.directive.coffee b/app/modules/components/tribe-button/tribe-button.directive.coffee new file mode 100644 index 00000000..4f961f06 --- /dev/null +++ b/app/modules/components/tribe-button/tribe-button.directive.coffee @@ -0,0 +1,37 @@ +### +# Copyright (C) 2014-2015 Taiga Agile LLC +# +# 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: tribe-button.directive.coffee +### + +TribeButtonDirective = (configService) -> + link = (scope, el, attrs) -> + + scope.vm = {} + scope.vm.tribeHost = configService.config.tribeHost + + return { + scope: {usId: "=", projectSlug: "="} + controllerAs: "vm", + templateUrl: "components/tribe-button/tribe-button.html", + link: link + } + +TribeButtonDirective.$inject = [ + "$tgConfig" +] + +angular.module("taigaComponents").directive("tgTribeButton", TribeButtonDirective) diff --git a/app/modules/components/tribe-button/tribe-button.jade b/app/modules/components/tribe-button/tribe-button.jade new file mode 100644 index 00000000..1d1cad90 --- /dev/null +++ b/app/modules/components/tribe-button/tribe-button.jade @@ -0,0 +1,10 @@ +a.button-tribe( + ng-href="{{::vm.tribeHost}}/gigs/import-from-taiga?project={{projectSlug}}&us={{usId}}", + title="{{ 'US.TRIBE.PUBLISH' | translate }}" + target="_blank" +) + img.tribe-logo( + src="/#{v}/images/tribe-logo.png" + alt="{{ 'US.TRIBE.PUBLISH' | translate }}" + ) + span {{ 'US.TRIBE.PUBLISH' | translate }} diff --git a/app/modules/components/tribe-button/tribe-linked.directive.coffee b/app/modules/components/tribe-button/tribe-linked.directive.coffee new file mode 100644 index 00000000..0c062aaf --- /dev/null +++ b/app/modules/components/tribe-button/tribe-linked.directive.coffee @@ -0,0 +1,48 @@ +### +# Copyright (C) 2014-2015 Taiga Agile LLC +# +# 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: tribe-linked.directive.coffee +### + +TribeLinkedDirective = (configService) -> + link = (scope, el, attrs) -> + + scope.vm = {} + + scope.vm.tribeHost = configService.config.tribeHost + + scope.vm.show = () -> + scope.vm.open = true + + scope.vm.hide = (event) -> + scope.vm.open = false + + directive = { + templateUrl: "components/tribe-button/tribe-linked.html", + scope: { + gigTitle: "=", + gigId: "=" + }, + link: link + } + + return directive + +TribeLinkedDirective.$inject = [ + "$tgConfig" +] + +angular.module("taigaComponents").directive("tgTribeLinked", TribeLinkedDirective) diff --git a/app/modules/components/tribe-button/tribe-linked.jade b/app/modules/components/tribe-button/tribe-linked.jade new file mode 100644 index 00000000..6be83206 --- /dev/null +++ b/app/modules/components/tribe-button/tribe-linked.jade @@ -0,0 +1,33 @@ +.tribe-linked.js-tribe-linked(ng-class="{'is-active': vm.open, 'is-inactive': vm.open == false}") + .tribe-linked-inner + .tribe-linked-header + img.tribe-logo( + ng-click="vm.show()" + alt="" + title="{{ 'US.TRIBE.PUBLISHED_AS_GIG' | translate }}" + src="/#{v}/images/tribe-logo.png" + ) + p.title {{ "US.TRIBE.PUBLISHED_AS_GIG" | translate }} + a.close( + ng-click="vm.hide()" + href="" + title="{{ 'US.TRIBE.CLOSE' | translate }}" + ) + svg.icon.icon-remove + use(xlink:href="#icon-remove") + + a.gig-title( + href="{{::vm.tribeHost}}/gigs/{{gigId}}" + title="gigTitle" + target="_blank" + ) {{gigTitle}} + + a.delete-link( + href="{{::vm.tribeHost}}/gigs/{{gigId}}/link-with-taiga?from=taiga" + title="{{ 'US.TRIBE.EDIT_LINK' | translate }}" + ) {{ 'US.TRIBE.EDIT_LINK' | translate }} + + a.synchronize-link.button-tribe( + ng-href="{{::vm.tribeHost}}/gigs/sync/{{gigId}}?from=taiga" + title="{{ 'US.TRIBE.SINCHRONIZE_LINK' }}" + ) {{ 'US.TRIBE.SYNCHRONIZE_LINK' | translate }} diff --git a/app/modules/components/tribe-button/tribe-linked.scss b/app/modules/components/tribe-button/tribe-linked.scss new file mode 100644 index 00000000..0da433ef --- /dev/null +++ b/app/modules/components/tribe-button/tribe-linked.scss @@ -0,0 +1,123 @@ +.tribe-linked { + margin-left: auto; + overflow: hidden; + position: absolute; + right: 0; + top: 0; + z-index: 99; + .tribe-linked-inner { + padding: .5rem; + transition: .2s; + &:hover { + background: $white; + cursor: pointer; + } + .title, + .gig-title, + .delete-link, + .synchronize-link, + .close { + display: none; + opacity: 0; + } + } + .tribe-logo { + height: 2rem; + width: 2rem; + } + &.is-active { + animation-duration: 1s; + animation-name: slideTribeInner; + background: $white; + box-shadow: 1px 1px 5px rgba($grayer, .2); + overflow: hidden; + .tribe-linked-inner { + height: 100%; + min-width: 300px; + .title, + .gig-title, + .delete-link, + .synchronize-link, + .close { + animation-duration: 1.25s; + animation-name: fadeInFromNone; + display: block; + opacity: 1; + } + } + .tribe-linked-header { + align-items: center; + display: flex; + margin-bottom: 1rem; + } + .tribe-logo { + margin-right: .5rem; + vertical-align: text-bottom; + } + svg { + fill: $red-light; + height: 1.5rem; + max-height: 1.5rem; + max-width: 1.5rem; + transition: all .2s; + width: 1.5rem; + &:hover { + fill: $red; + } + } + .title { + margin-bottom: 0; + } + .gig-title { + @include font-type(light); + color: $tribe-primary; + margin-bottom: .5rem; + } + .delete-link { + @include font-type(light); + @include font-size(small); + color: $primary; + display: block; + margin-bottom: 1rem; + } + .synchronize-link { + display: block; + padding: .5rem; + } + .close { + align-self: flex-start; + margin-left: 1rem; + } + } +} + +@keyframes slideTribeInner { + 0% { + max-height: 60px; + width: 100px; + } + 20% { + max-height: 60px; + width: 300px; + } + 100% { + max-height: 225px; + } +} + +@keyframes fadeInFromNone { + 0% { + display: none; + opacity: 0; + } + + 80% { + display: block; + opacity: 0; + } + + 100% { + display: block; + opacity: 1; + } +} diff --git a/app/modules/external-apps/external-app.scss b/app/modules/external-apps/external-app.scss index 17f5ff08..cc00b2b3 100644 --- a/app/modules/external-apps/external-app.scss +++ b/app/modules/external-apps/external-app.scss @@ -3,9 +3,12 @@ text-align: center; width: 480px; .logo { - height: 6rem; + height: 4rem; margin: 0 auto; - width: 6rem; + width: 4rem; + } + svg { + @include svg-size(4rem); } h1 { margin-bottom: 0; diff --git a/app/partials/us/us-detail.jade b/app/partials/us/us-detail.jade index 20a72a44..0896a232 100644 --- a/app/partials/us/us-detail.jade +++ b/app/partials/us/us-detail.jade @@ -107,6 +107,12 @@ div.wrapper( ng-model="us" ) + tg-tribe-linked( + ng-if="tribeEnabled && us.tribe_gig", + gig-title="us.tribe_gig.title" + gig-id="us.tribe_gig.id" + ) + tg-us-estimation.ticket-estimation(ng-model="us") section.ticket-assigned-to( @@ -129,6 +135,16 @@ div.wrapper( required-perm="modify_us" ) + section.ticket-to-tribe(ng-if="tribeEnabled && !us.tribe_gig") + tg-tribe-button( + us-id="us.id" + project-slug="project.slug" + ) + a.tribe-more-info( + href="" + title="{{'US.TRIBE.PUBLISH_TITLE' | translate}}" + ng-click="ctrl.onTribeInfo()" + ) {{'US.TRIBE.PUBLISH_INFO' | translate}} section.ticket-detail-settings tg-us-team-requirement-button(ng-model="us") diff --git a/app/styles/components/buttons.scss b/app/styles/components/buttons.scss index 99795199..f6f95f46 100755 --- a/app/styles/components/buttons.scss +++ b/app/styles/components/buttons.scss @@ -130,3 +130,28 @@ a.button-gray { background: $black; } } + +.button-tribe { + @extend %button; + align-items: center; + background: $tribe-primary; + display: flex; + padding: .4rem; + padding-left: 1.5rem; + &:hover, + &.active { + background: $tribe-secondary; + color: $white; + } + .tribe-logo { + margin-right: .5rem; + width: 1.5rem; + } +} + +.tribe-more-info { + @include font-size(small); + color: $primary; + display: inline-block; + margin-top: .5rem; +} diff --git a/app/themes/high-contrast/variables.scss b/app/themes/high-contrast/variables.scss index 861556da..cd5ef6e6 100755 --- a/app/themes/high-contrast/variables.scss +++ b/app/themes/high-contrast/variables.scss @@ -31,8 +31,8 @@ $red-amaranth: #e91e63; $purple-eggplant: #9c27b0; $yellow-pear: #ffc107; -$tribe-primary: #98e0eb; -$tribe-secondary: #107a8a; +$tribe-primary: #107a8a; +$tribe-secondary: darken($tribe-primary, 10%); $top-icon-color: $white; $dropdown-color: rgba(darken($primary-dark, 20%), 1); diff --git a/app/themes/material-design/variables.scss b/app/themes/material-design/variables.scss index cf662a5d..c76c2e0b 100755 --- a/app/themes/material-design/variables.scss +++ b/app/themes/material-design/variables.scss @@ -31,8 +31,8 @@ $red-amaranth: #e91e63; $purple-eggplant: #9c27b0; $yellow-pear: #ffc107; -$tribe-primary: #98e0eb; -$tribe-secondary: #107a8a; +$tribe-primary: #107a8a; +$tribe-secondary: darken($tribe-primary, 10%); $top-icon-color: $white; $dropdown-color: rgba(darken($primary-dark, 20%), 1); diff --git a/app/themes/taiga/variables.scss b/app/themes/taiga/variables.scss index 3eaa69df..e8d00c10 100755 --- a/app/themes/taiga/variables.scss +++ b/app/themes/taiga/variables.scss @@ -31,8 +31,8 @@ $red-amaranth: #e43050; $purple-eggplant: #810061; $yellow-pear: #bbe831; -$tribe-primary: #98e0eb; -$tribe-secondary: #107a8a; +$tribe-primary: #107a8a; +$tribe-secondary: darken($tribe-primary, 10%); $top-icon-color: #11241f; $dropdown-color: rgba(darken($grayer, 20%), 1); diff --git a/conf/conf.example.json b/conf/conf.example.json index 1779eec1..7868fbf1 100644 --- a/conf/conf.example.json +++ b/conf/conf.example.json @@ -13,5 +13,6 @@ "privacyPolicyUrl": null, "termsOfServiceUrl": null, "maxUploadFileSize": null, - "contribPlugins": [] + "contribPlugins": [], + "tribeHost": null }