Blocked projects

Add blocked project page

Fix styles in plugins

Add blocked warning in dashboard

Add blocked warning to dropdown

Add blocked warning to projects list

Add blocked project in project profile

Minor style code fixes in project like/watch

Bloc project listing

Profile Favs in blocked projects

Blocked projects

Fix jade syntax error

Fixing tests

Updating changelog
stable
Alejandro Alonso 2016-02-25 16:24:19 +01:00 committed by Juanfran
parent c5f0b4a5c4
commit 088986626d
28 changed files with 319 additions and 47 deletions

View File

@ -5,6 +5,7 @@
### Features
- Ability to create url custom fields. (thanks to [@astagi](https://github.com/astagi)).
- Blocked projects support
- Moved from iconfont to SVG sprite icon system and redesign.
- Redesign 'Admin > Project > Modules' panel.
- Add badge to project owners

View File

@ -111,6 +111,16 @@ configure = ($routeProvider, $locationProvider, $httpProvider, $provide, $tgEven
}
)
$routeProvider.when("/blocked-project/:pslug/",
{
templateUrl: "projects/project/blocked-project.html",
loader: true,
controller: "Project",
controllerAs: "vm"
}
)
$routeProvider.when("/project/:pslug/",
{
templateUrl: "projects/project/project.html",
@ -515,6 +525,42 @@ configure = ($routeProvider, $locationProvider, $httpProvider, $provide, $tgEven
$httpProvider.interceptors.push("versionCheckHttpIntercept")
blockingIntercept = ($q, $routeParams, $location, $navUrls) ->
# API calls can return blocked elements and in that situation the user will be redirected
# to the blocked project page
# This can happens in two scenarios
# - An ok response containing a blocked_code in the data
# - An error reponse when updating/creating/deleting including a 451 error code
redirectToBlockedPage = ->
pslug = $routeParams.pslug
blockedUrl = $navUrls.resolve("blocked-project", {project: pslug})
currentUrl = $location.url()
if currentUrl.indexOf(blockedUrl) == -1
$location.replace().path(blockedUrl)
responseOk = (response) ->
if response.data.blocked_code
redirectToBlockedPage()
return response
responseError = (response) ->
if response.status == 451
redirectToBlockedPage()
return $q.reject(response)
return {
response: responseOk
responseError: responseError
}
$provide.factory("blockingIntercept", ["$q", "$routeParams", "$location", "$tgNavUrls", blockingIntercept])
$httpProvider.interceptors.push("blockingIntercept")
$compileProvider.debugInfoEnabled(window.taigaConfig.debugInfo || false)
if localStorage.userInfo

View File

@ -67,6 +67,7 @@ urls = {
"profile": "/profile"
"user-profile": "/profile/:username"
"blocked-project": "/blocked-project/:project"
"project": "/project/:project"
"project-backlog": "/project/:project/backlog"
"project-taskboard": "/project/:project/taskboard/:sprint"

View File

@ -740,6 +740,11 @@
"FANS_COUNTER_TITLE": "{total, plural, one{one fan} other{# fans}}",
"WATCHERS_COUNTER_TITLE": "{total, plural, one{one watcher} other{# watchers}}",
"MEMBERS_COUNTER_TITLE": "{total, plural, one{one member} other{# members}}",
"BLOCKED_PROJECT": {
"BLOCKED": "Blocked project",
"THIS_PROJECT_IS_BLOCKED": "This project is temporarily blocked",
"TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF": "To unblock your projects you must contact with the admin staff"
},
"STATS": {
"PROJECT": "project<br/> points",
"DEFINED": "defined<br/> points",

View File

@ -1,7 +1,7 @@
a.list-itemtype-ticket(
href="{{ ::vm.duty.get('url') }}"
title="{{ ::duty.get('subject') }}"
ng-class="{'blocked': vm.duty.get('is_blocked')}"
ng-class="{'blocked': vm.duty.get('is_blocked'), 'blocked-project': vm.duty.get('blockedProject')}"
)
div.list-itemtype-avatar(ng-if="::vm.duty.get('assigned_to_extra_info')")
img(
@ -16,8 +16,12 @@ a.list-itemtype-ticket(
div.list-itemtype-ticket-data
p
span.ticket-project {{ ::vm.duty.get('projectName')}}
span.ticket-type {{ ::vm.getDutyType() }}
span.ticket-status(ng-style="{'color': vm.duty.get('status_extra_info').get('color')}") {{ ::vm.duty.get('status_extra_info').get('name') }}
svg.icon.icon-blocked-project(ng-if="vm.duty.get('blockedProject')")
use(xlink:href="#icon-blocked-project")
title(translate="PROJECT.BLOCKED_PROJECT.BLOCKED")
h2
span.ticket-id(tg-bo-ref="duty.get('ref')")

View File

@ -41,6 +41,7 @@ class HomeService extends taiga.Service
duty = duty.set('url', url)
duty = duty.set('projectName', project.get('name'))
duty = duty.set('blockedProject', project.get('blocked_code'))
duty = duty.set("_name", objType)
return duty

View File

@ -128,6 +128,7 @@ describe "tgHome", ->
project: '1',
url: '/testing-project/us/1',
projectName: 'fake1',
blockedProject: undefined,
_name: 'userstories'
}]
tasks: [{
@ -136,6 +137,7 @@ describe "tgHome", ->
project: '1',
url: '/testing-project/tasks/1',
projectName: 'fake1',
blockedProject: undefined,
_name: 'tasks'
}]
issues: [{
@ -144,6 +146,7 @@ describe "tgHome", ->
project: '1',
url: '/testing-project/issues/1',
projectName: 'fake1',
blockedProject: undefined,
_name: 'issues'
}]
}
@ -154,6 +157,7 @@ describe "tgHome", ->
project: '1',
url: '/testing-project/us/1',
projectName: 'fake1',
blockedProject: undefined,
_name: 'userstories'
}]
tasks: [{
@ -162,6 +166,7 @@ describe "tgHome", ->
project: '1',
url: '/testing-project/tasks/1',
projectName: 'fake1',
blockedProject: undefined,
_name: 'tasks'
}]
issues: [{
@ -170,6 +175,7 @@ describe "tgHome", ->
project: '1',
url: '/testing-project/issues/1',
projectName: 'fake1',
blockedProject: undefined,
_name: 'issues'
}]
}

View File

@ -1,6 +1,10 @@
section.home-project-list(ng-if="vm.projects.size")
.home-project(tg-bind-scope, tg-repeat="project in vm.projects")
.home-project(
tg-bind-scope
tg-repeat="project in vm.projects"
ng-class="{'blocked-project': project.get('blocked_code')}"
)
.tags-container
.project-tag(
style="background: {{tag.get('color')}}"
@ -19,7 +23,7 @@ section.home-project-list(ng-if="vm.projects.size")
alt="{{::project.get('name')}}"
)
h2.project-card-name
a(
a.project-title(
href="#"
tg-nav="project:project=project.get('slug')"
title="{{::project.get('name')}}"
@ -27,6 +31,10 @@ section.home-project-list(ng-if="vm.projects.size")
svg.look-for-people.icon.icon-recruit(ng-if="project.get('is_looking_for_people')")
use(xlink:href="#icon-recruit")
title="{{ ::project.get('looking_for_people_note') }}"
svg.icon.icon-blocked-project(ng-if="project.get('blocked_code')")
use(xlink:href="#icon-blocked-project")
title(translate="PROJECT.BLOCKED_PROJECT.BLOCKED")
p.project-card-description {{::project.get('description')| limitTo:100 }}
span(ng-if="::project.get('description').length > 100") ...
.project-card-statistics

View File

@ -9,6 +9,20 @@
&:hover {
border: 1px solid $primary-light;
}
&.blocked-project {
border: $whitish;
&:hover {
border: $whitish;
}
.tags-container,
.project-card-logo,
.project-card-name a,
.icon-recruit,
.project-card-description,
.project-card-statistics {
opacity: .3;
}
}
}
.projects-empty {

View File

@ -20,7 +20,11 @@ section.watching-container
.title-bar.watching-title(translate="HOME.WATCHING_SECTION")
.watching(ng-if="vm.watching.size")
.duty-single(tg-duty="duty", tg-repeat="duty in vm.watching", ng-class="{'blocked': duty.is_blocked}")
.duty-single(
tg-duty="duty"
tg-repeat="duty in vm.watching"
ng-class="{'blocked': duty.is_blocked}"
)
.watching-empty(ng-if="vm.watching != undefined && vm.watching.size === 0")
p(translate="HOME.EMPTY_WATCHING")

View File

@ -4,8 +4,16 @@ a(href="", title="Projects", tg-nav="projects")
div.navbar-dropdown.dropdown-project-list
ul
li(tg-repeat="project in vm.projects track by project.get('id')")
a(href="#", tg-nav="project:project=project.get('slug')") {{::project.get("name")}}
li(tg-repeat="project in vm.projects track by project.get('id')")
a(
href="#"
tg-nav="project:project=project.get('slug')"
ng-class="{'blocked-project': project.get('blocked_code')}"
)
span {{::project.get("name")}}
svg.icon.icon-blocked-project(ng-if="project.get('blocked_code')")
use(xlink:href="#icon-blocked-project")
title(translate="PROJECT.BLOCKED_PROJECT.BLOCKED")
a.see-more-projects-btn.button-gray(
href="#",

View File

@ -173,6 +173,14 @@ $dropdown-width: 350px;
&.create-project-btn {
flex: 1;
}
&.blocked-project {
color: $gray;
svg {
margin-left: .5rem;
position: relative;
top: .25rem;
}
}
}
.import-project-button {
&:hover {

View File

@ -1,7 +1,6 @@
.list-itemtype-project
.list-itemtype-project(ng-class="{'blocked-project': vm.item.get('project_blocked_code')}")
.list-itemtype-project-left
.list-itemtype-project-data-wrapper
a.list-itemtype-project-image(
href="#"
tg-nav="project:project=vm.item.get('slug')"
@ -14,20 +13,21 @@
.list-itemtype-project-data
h2
a(
a.list-itemtype-project-name(
href="#"
tg-nav="project:project=vm.item.get('slug')"
title="{{ ::vm.item.get('name') }}"
) {{ ::vm.item.get('name') }}
span.private(ng-if="::project.get('is_private')", title="{{'PROJECT.PRIVATE' | translate}}")
p {{ ::vm.item.get('description') }}
.list-itemtype-project-tags.tags-container(ng-if="::vm.item.get('tags_colors').size")
span.tag(
tg-repeat="tag in ::vm.item.get('tags_colors')"
style='border-left: 5px solid {{ ::tag.get("color") }};'
)
span.tag-name {{ ::tag.get('name') }}
span.private(
ng-if="::vm.item.get('project_is_private')"
title="{{'PROJECT.PRIVATE' | translate}}"
)
svg.icon.icon-lock
use(xlink:href="#icon-lock")
svg.icon.icon-blocked-project(ng-if="vm.item.get('project_blocked_code')")
use(xlink:href="#icon-blocked-project")
title(translate="PROJECT.BLOCKED_PROJECT.BLOCKED")
p.list-itemtype-project-description {{ ::vm.item.get('description') }}
.list-itemtype-track
span.list-itemtype-track-likers(

View File

@ -1,4 +1,4 @@
div.list-itemtype-ticket
div.list-itemtype-ticket(ng-class="{'blocked-project': vm.item.get('project_blocked_code')}")
a.list-itemtype-avatar(
href=""
ng-if="::vm.item.get('assigned_to')"
@ -38,6 +38,9 @@ div.list-itemtype-ticket
)
span.ticket-status(ng-style="::{'color': vm.item.get('status_color')}")
| {{:: vm.item.get('status') }}
svg.icon.icon-blocked-project(ng-if="vm.item.get('project_blocked_code')")
use(xlink:href="#icon-blocked-project")
title(translate="PROJECT.BLOCKED_PROJECT.BLOCKED")
h2
span.ticket-id(tg-bo-ref="vm.item.get('ref')")
a.ticket-title(
@ -45,22 +48,19 @@ div.list-itemtype-ticket
ng-if="::vm.item.get('type') === 'userstory'"
tg-nav="project-userstories-detail:project=vm.item.get('project_slug'),ref=vm.item.get('ref')"
title="#{{ ::vm.item.get('ref') }} {{ ::vm.item.get('subject') }}"
)
| {{ ::vm.item.get('subject') }}
) {{ ::vm.item.get('subject') }}
a.ticket-title(
href="#"
ng-if="::vm.item.get('type') === 'task'"
tg-nav="project-tasks-detail:project=vm.item.get('project_slug'),ref=vm.item.get('ref')"
title="#{{ ::vm.item.get('ref') }} {{ ::vm.item.get('subject') }}"
)
| {{ ::vm.item.get('subject') }}
) {{ ::vm.item.get('subject') }}
a.ticket-title(
href="#"
ng-if="::vm.item.get('type') === 'issue'"
tg-nav="project-issues-detail:project=vm.item.get('project_slug'),ref=vm.item.get('ref')"
title="#{{ ::vm.item.get('ref') }} {{ ::vm.item.get('subject') }}"
)
| {{ ::vm.item.get('subject') }}
) {{ ::vm.item.get('subject') }}
div.list-itemtype-track
span.list-itemtype-track-likers(

View File

@ -184,4 +184,3 @@ class ProfileWatchedController extends FavsBaseController
angular.module("taigaProfile")
.controller("ProfileWatched", ProfileWatchedController)

View File

@ -60,10 +60,26 @@ section.profile-favs
tg-repeat="item in vm.items track by $index"
ng-switch="item.get('type')"
)
div(ng-switch-when="project", tg-fav-item="item", item-type="project")
div(ng-switch-when="userstory", tg-fav-item="item", item-type="userstory")
div(ng-switch-when="task", tg-fav-item="item", item-type="task")
div(ng-switch-when="issue", tg-fav-item="item", item-type="issue")
div(
ng-switch-when="project"
tg-fav-item="item"
item-type="project"
)
div(
ng-switch-when="userstory"
tg-fav-item="item"
item-type="userstory"
)
div(
ng-switch-when="task"
tg-fav-item="item"
item-type="task"
)
div(
ng-switch-when="issue"
tg-fav-item="item"
item-type="issue"
)
div(ng-if="vm.isLoading")
div.spin

View File

@ -11,8 +11,10 @@ section.profile-projects
translate="USER.PROFILE.PROJECTS_EMPTY"
translate-values="{username: vm.user.get('full_name_display')}"
)
.list-itemtype-project(tg-repeat="project in vm.projects")
.list-itemtype-project(
tg-repeat="project in vm.projects"
ng-class="{'blocked-project': project.get('blocked_code')}"
)
.list-itemtype-project-left
.project-list-single-title-wrapper
a.list-itemtype-project-image(
@ -26,19 +28,15 @@ section.profile-projects
)
.project-list-single-title
h2
a(
a.project-title(
href="#"
tg-nav="project:project=project.get('slug')"
title="{{ ::project.get('name') }}"
) {{::project.get('name')}}
p {{ ::project.get('description') | limitTo:300 }}
.list-itemtype-project-tags.tags-container(ng-if="::project.get('tags').size")
span.tag(
style='border-left: 5px solid {{::tag.get("color")}};'
tg-repeat="tag in ::project.get('colorized_tags')"
)
span.tag-name {{::tag.get('name')}}
svg.icon.icon-blocked-project(ng-if="project.get('blocked_code')")
use(xlink:href="#icon-blocked-project")
title(translate="PROJECT.BLOCKED_PROJECT.BLOCKED")
p.project-description {{ ::project.get('description') | limitTo:300 }}
.list-itemtype-project-right

View File

@ -11,7 +11,6 @@
padding: 0;
}
.timeline-wrapper {
background: lighten($whitish, 10%);
margin-right: 3.5rem;
width: 768px;
> div {

View File

@ -0,0 +1,25 @@
###
# Copyright (C) 2014-2016 Taiga Agile LLC <taiga@taiga.io>
#
# 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: blocked-project-explanation.directive.coffee
###
BlockedProjectExplanationDirective = () ->
return {
templateUrl: "projects/project/blocked-project-explanation.html"
}
angular.module("taigaProjects").directive("tgBlockedProjectExplanation", BlockedProjectExplanationDirective)

View File

@ -23,6 +23,7 @@
li.list-itemtype-project(
tg-bind-scope
tg-repeat="project in vm.projects track by project.get('id')"
ng-class="{'blocked-project': project.get('blocked_code')}"
)
.list-itemtype-project-left
@ -38,7 +39,7 @@
)
.list-itemtype-project-data
h2
a(
a.project-title(
href="#"
tg-nav="project:project=project.get('slug')"
title="{{ ::project.get('name') }}"
@ -53,9 +54,12 @@
svg.icon.icon-badge(ng-if="project.get('i_am_owner')")
use(xlink:href="#icon-badge")
title(translate="COMMON.OWNER")
svg.icon.icon-blocked-project(ng-if="project.get('blocked_code')")
use(xlink:href="#icon-blocked-project")
title(translate="PROJECT.BLOCKED_PROJECT.BLOCKED")
p {{ ::project.get('description') | limitTo:300 }}
p.project-description {{ ::project.get('description') | limitTo:300 }}
span(ng-if="::project.get('description').length > 300") ...
svg.drag.icon.icon-drag

View File

@ -3,7 +3,16 @@
.list-itemtype-project {
display: flex;
justify-content: space-between;
min-height: 10rem;
min-height: 9rem;
padding: .75rem;
&.blocked-project {
.list-itemtype-project-image,
.project-title,
.project-description,
.list-itemtype-project-right {
opacity: .4;
}
}
.project-list-single-title-wrapper {
display: flex;
}
@ -14,7 +23,11 @@
display: flex;
flex-direction: column;
flex-shrink: 0;
justify-content: space-between;
width: 200px;
}
.icon-blocked-project {
@include svg-size();
}
}
}

View File

@ -14,7 +14,8 @@
}
}
.icon-lock,
.icon-badge {
.icon-badge,
.icon-blocked-project {
@include svg-size();
}
.icon-badge {
@ -62,6 +63,16 @@
opacity: 1;
}
}
&.blocked-project {
.list-itemtype-project-image,
.project-title,
.private,
.project-description,
.icon-badge,
.icon-drag {
opacity: .25;
}
}
.list-itemtype-project-data-wrapper {
display: flex;
}

View File

@ -0,0 +1,5 @@
div(ng-if="!vm.project.get('i_am_owner')")
div {{'PROJECT.BLOCKED_PROJECT.THIS_PROJECT_IS_BLOCKED' | translate}}
div(ng-if="vm.project.get('i_am_owner')")
div {{'PROJECT.BLOCKED_PROJECT.TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF' | translate}}

View File

@ -0,0 +1,15 @@
.blocked-project-detail
.blocked-project-inner
.blocked-project-title
.project-image
img(
tg-project-logo-small-src="vm.project"
alt="{{::vm.project.get('name')}}"
)
svg.icon.icon-blocked-project
use(xlink:href="#icon-blocked-project")
title(translate="PROJECT.BLOCKED_PROJECT.BLOCKED")
span.project-title {{::vm.project.get("name")}}
.blocked-project-message
h1.project-block-title {{'PROJECT.BLOCKED_PROJECT.BLOCKED' | translate}}
tg-blocked-project-explanation.project-block-message

View File

@ -0,0 +1,42 @@
.blocked-project-detail {
align-items: center;
background: url('../images/discover.png') bottom center repeat-x;
display: flex;
justify-content: center;
min-height: calc(100vh - 40px);
}
.blocked-project-inner {
width: 330px;
}
.blocked-project-title {
align-items: center;
display: flex;
.project-image {
flex-basis: 6rem;
margin-right: 1rem;
max-width: 6rem;
position: relative;
}
img {
width: 100%;
}
.icon-blocked-project {
@include svg-size(1.5rem);
position: absolute;
right: -.5rem;
top: -.5rem;
}
.project-title {
@extend %larger;
}
}
.blocked-project-message {
margin-top: 4rem;
text-align: center;
.project-block-title {
@extend %xlarge;
}
}

View File

@ -32,9 +32,21 @@
.list-itemtype-project {
@include list-itemtype-common;
justify-content: space-between;
&.blocked-project {
.list-itemtype-track,
.list-itemtype-project-image,
.list-itemtype-project-name,
.list-itemtype-project-description,
.list-itemtype-project-private {
opacity: .4;
}
}
h2 {
@extend %large;
}
.icon-blocked-project {
@include svg-size();
}
.list-itemtype-project-data-wrapper {
display: flex;
}
@ -75,6 +87,20 @@
.list-itemtype-ticket {
@include list-itemtype-common;
position: relative;
&.blocked-project {
.ticket-project,
.ticket-type,
.ticket-status,
.list-itemtype-avatar,
.list-itemtype-track,
.ticket-title {
opacity: .4;
}
.icon-blocked-project {
@include svg-size();
}
}
h2 {
@extend %medium;
}
@ -97,7 +123,6 @@
color: $red;
margin-left: .3rem;
}
}

View File

@ -418,5 +418,12 @@
<path
d="M165 91.5c-33 0-60 28.7-60 64 0 35.2 27 64 60 64s60-28.8 60-64c0-35.3-27-64-60-64zm0 16.2c24.8 0 44.8 21.3 44.8 47.8 0 26.5-20 47.8-44.8 47.8-25 0-45-21.3-45-47.8 0-26.5 20-47.8 45-47.8zm-77.8 13.5c-29.2 0-53 25.5-53 56.7 0 31 23.8 56.5 53 56.5 16 0 27.5-4.5 37.3-16.6-21.8-9.7-34-36-34-62.5 0-12 3-23.3 8.5-33-3.8-.8-7.7-1.3-11.8-1.3zM165 229.7c-53.3 0-95.8 50.8-96 112.5v8h192v-8c-.2-61.7-42.8-112.5-96-112.5zm-78.7 13.6c-3.4 0-5.8.3-5.8.3-47.2 0-78 45-78.3 99.5v7.3h52.2v-8c0-41.3 15.2-78.6 43.7-98.2-3.8-.6-8.2-.8-11.7-.7zM165 246c42 0 76.8 38.2 80.5 88h-161c3.6-49.8 38.6-88 80.5-88zM339.3 49.7C307 49.7 281 76 281 108.2c0 32.2 26 58.4 58.3 58.4s58.5-26.2 58.5-58.4c0-32.3-26.2-58.5-58.5-58.5zm0 7.3c28.3 0 51.2 23 51.2 51.2 0 28.3-23 51-51.2 51-28.3 0-51-22.7-51-51S311 57 339.2 57zm-.2 11.8c-7 0-14 1.7-20.5 5l3 7c3.5-1.6 6.5-2.7 9-3.3 2.7-.7 5.4-1 8-1 4.4 0 7.6 1 10 3 2.2 1.8 3.3 4.5 3.3 8 0 3-.6 5.4-1.8 7.4-1.2 2-4.2 5-9 9-3.3 2.8-5.7 5.6-7 8.2-1.2 2.6-1.8 6-1.8 10v2.8h6.7v-1.7c0-3.3.5-6 1.6-8 1-2 3.5-4.4 7-7.3 4.4-4 7.2-6.6 8.5-8.3 1.4-1.8 2.4-3.6 3-5.5.8-2 1-4.2 1-6.7 0-6-1.7-10.6-5.4-13.8-3.7-3.3-8.8-5-15.5-5zm-6.8 62.5V148h7.3v-16.7h-7.3z"></path>
</symbol>
<symbol id="icon-blocked-project" viewBox="0 0 1024 1024">
<title>Blocked Project</title>
<path fill="#ff8282" d="M1017.075 512c0 278.946-226.13 505.076-505.076 505.076s-505.076-226.13-505.076-505.076c0-278.946 226.13-505.076 505.076-505.076s505.076 226.13 505.076 505.076z"></path>
<path
fill="#fff"
d="M511.998 107.939c-222.856 0-404.061 181.204-404.061 404.061s181.205 404.061 404.061 404.061c222.856 0 404.061-181.203 404.061-404.061s-181.205-404.061-404.061-404.061zM511.998 158.447c88.671 0 169.621 32.484 231.616 86.222l-498.947 498.948c-53.74-61.998-86.223-142.945-86.223-231.617 0-195.561 157.992-353.553 353.553-353.553zM779.328 280.383c53.74 61.998 86.223 142.945 86.223 231.617 0 195.561-157.992 353.553-353.553 353.553-88.671 0-169.617-32.484-231.616-86.222l498.947-498.948z"></path>
</symbol>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

View File

@ -138,4 +138,11 @@ describe('project home', function() {
expect(watchCounter).to.be.equal(watchCounterOld + 1);
});
it('blocked project', async function() {
browser.get(browser.params.glob.host + 'project/project-6/');
await utils.common.waitLoader();
await utils.common.takeScreenshot("project", "blocked-project");
expect(browser.getCurrentUrl()).to.be.eventually.equal(browser.params.glob.host + 'blocked-project/project-6/');
});
});