From 7c1b889483d461b822ad251fed1a51695d13a663 Mon Sep 17 00:00:00 2001 From: shubhu Date: Sat, 28 Jan 2017 03:57:01 +0530 Subject: [PATCH 01/16] fixes #906 infinite scolling for user challenges --- .../tc-endless-paginator.directive.js | 5 ++++- .../tc-endless-paginator.jade | 2 +- app/directives/tc-section/tc-section.jade | 2 +- app/my-challenges/my-challenges.controller.js | 13 ++++++----- app/profile/subtrack/subtrack.controller.js | 22 ++++++++++++++++--- app/topcoder.constants.js | 4 +++- assets/css/directives/tc-section.scss | 1 + 7 files changed, 37 insertions(+), 12 deletions(-) diff --git a/app/directives/tc-endless-paginator/tc-endless-paginator.directive.js b/app/directives/tc-endless-paginator/tc-endless-paginator.directive.js index d46baaeda..c7732ea54 100644 --- a/app/directives/tc-endless-paginator/tc-endless-paginator.directive.js +++ b/app/directives/tc-endless-paginator/tc-endless-paginator.directive.js @@ -10,12 +10,15 @@ import angular from 'angular' template: require('./tc-endless-paginator')(), scope: { state: '=', - pageParams: '=' + pageParams: '=', + firstLoadMore: '=?' }, controller: ['$scope', function($scope) { + $scope.firstLoadMore = true $scope.loadMore = function() { $scope.pageParams.currentOffset += $scope.pageParams.limit $scope.pageParams.updated++ + $scope.firstLoadMore = false } }] } diff --git a/app/directives/tc-endless-paginator/tc-endless-paginator.jade b/app/directives/tc-endless-paginator/tc-endless-paginator.jade index ad76510d8..d735bf64b 100644 --- a/app/directives/tc-endless-paginator/tc-endless-paginator.jade +++ b/app/directives/tc-endless-paginator/tc-endless-paginator.jade @@ -1,3 +1,3 @@ div.paginator tc-section(state="state") - button.tc-btn.tc-btn-s(ng-show="pageParams.totalCount > pageParams.currentCount", ng-click="loadMore()") Load More + button.tc-btn.tc-btn-s(ng-show="pageParams.totalCount > pageParams.currentCount && firstLoadMore", ng-click="loadMore()") Load More diff --git a/app/directives/tc-section/tc-section.jade b/app/directives/tc-section/tc-section.jade index 76f9f2d85..7c57379e3 100644 --- a/app/directives/tc-section/tc-section.jade +++ b/app/directives/tc-section/tc-section.jade @@ -1,5 +1,5 @@ section(ng-switch="state") - .section-loading(ng-switch-when="loading") + .section-loading(ng-transclude, ng-switch-when="loading") .section-error(ng-switch-when="error") p {{errMsg}} diff --git a/app/my-challenges/my-challenges.controller.js b/app/my-challenges/my-challenges.controller.js index d8623372c..41f6f5ad1 100644 --- a/app/my-challenges/my-challenges.controller.js +++ b/app/my-challenges/my-challenges.controller.js @@ -20,6 +20,7 @@ import _ from 'lodash' vm.loadMore = loadMore vm.getChallenges = getChallenges vm.totalCount = 0 + vm.firstLoadMore = true // this will help to keep track of pagination across individual api calls var counts = { devDesign: {total: 0, current: 0}, @@ -99,7 +100,7 @@ import _ from 'lodash' function getDevDesignChallenges(offset) { var params = { - limit: 12, + limit: CONSTANTS.CHALLENGES_LOADING_CHUNK, offset: offset, orderBy: vm.orderBy + ' desc', filter: 'status=' + vm.statusFilter @@ -125,7 +126,7 @@ import _ from 'lodash' _filter = 'status=past&isRatedForMM=true' } var params = { - limit: 12, + limit: CONSTANTS.CHALLENGES_LOADING_CHUNK, offset: offset, orderBy: vm.statusFilter === 'active' ? 'startDate' : 'endDate desc', filter: _filter @@ -142,12 +143,14 @@ import _ from 'lodash' } function loadMore() { - currentOffset+=12 - vm.getChallenges(currentOffset, false) + if (vm.loading === CONSTANTS.STATE_READY) { + currentOffset += CONSTANTS.CHALLENGES_LOADING_CHUNK + vm.getChallenges(currentOffset, false) + } } window.onscroll = function() { - if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) { + if ((window.innerHeight + window.scrollY) >= (document.body.offsetHeight - CONSTANTS.INFINITE_SCROLL_OFFSET)) { if (vm.totalCount > vm.myChallenges.length) { vm.loadMore() } diff --git a/app/profile/subtrack/subtrack.controller.js b/app/profile/subtrack/subtrack.controller.js index 8e4b5b131..5c4fa1ad7 100644 --- a/app/profile/subtrack/subtrack.controller.js +++ b/app/profile/subtrack/subtrack.controller.js @@ -26,9 +26,9 @@ import _ from 'lodash' vm.showNav = showNav vm.back = back vm.subTrackStats = [] - + vm.loadMore = loadMore vm.pageName = vm.subTrack - + vm.firstLoadMore = true vm.tabs = ['statistics'] if (vm.track !== 'COPILOT') { @@ -41,7 +41,7 @@ import _ from 'lodash' // paging params, these are updated by tc-pager vm.pageParams = { currentOffset : 0, - limit: 16, + limit: CONSTANTS.CHALLENGES_LOADING_CHUNK, currentCount: 0, totalCount: 0, // counter used to indicate page change @@ -139,6 +139,7 @@ import _ from 'lodash' // watches page change counter to reload the data $scope.$watch('vm.pageParams.updated', function(newValue, oldValue) { if (newValue !== oldValue) { + vm.firstLoadMore = false _getChallenges() } }) @@ -156,6 +157,21 @@ import _ from 'lodash' $window.history.back() } + function loadMore() { + if (vm.status.challenges === CONSTANTS.STATE_READY) { + vm.pageParams.currentOffset += CONSTANTS.CHALLENGES_LOADING_CHUNK + _getChallenges() + } + } + + window.onscroll = function() { + if ((window.innerHeight + window.scrollY) >= (document.body.offsetHeight - CONSTANTS.INFINITE_SCROLL_OFFSET)) { + if (vm.pageParams.totalCount > vm.challenges.length && vm.firstLoadMore == false) { + vm.loadMore() + } + } + } + function _getChallenges() { vm.status.challenges = CONSTANTS.STATE_LOADING var params = { diff --git a/app/topcoder.constants.js b/app/topcoder.constants.js index 708842a25..b022ec98f 100644 --- a/app/topcoder.constants.js +++ b/app/topcoder.constants.js @@ -43,5 +43,7 @@ angular.module('CONSTANTS', []).constant('CONSTANTS', { 'REGISTERED' : 'REGISTERED', 'SUBMISSION_TYPE_CONTEST': 'Contest Submission', 'STATUS_ACTIVE' : 'Active', - 'STATUS_COMPLETED_WITHOUT_WIN' : 'Completed Without Win' + 'STATUS_COMPLETED_WITHOUT_WIN' : 'Completed Without Win', + 'CHALLENGES_LOADING_CHUNK' : 12, + 'INFINITE_SCROLL_OFFSET' : '400' // footer is 300px and challenge tile is 400px }) diff --git a/assets/css/directives/tc-section.scss b/assets/css/directives/tc-section.scss index c53ab8adb..10d784d6c 100644 --- a/assets/css/directives/tc-section.scss +++ b/assets/css/directives/tc-section.scss @@ -5,6 +5,7 @@ .section-loading { width: 100%; + min-width: 50px; min-height: 100px; background: url(../../images/ripple.gif) no-repeat center center; } From c3521a1bc7fef2655a48ba22a2f7a8c0136c546e Mon Sep 17 00:00:00 2001 From: shubhu Date: Sat, 28 Jan 2017 19:54:25 +0530 Subject: [PATCH 02/16] indicator on my-challenges --- app/my-challenges/my-challenges.jade | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/my-challenges/my-challenges.jade b/app/my-challenges/my-challenges.jade index 644a84e4b..723c9c8ca 100644 --- a/app/my-challenges/my-challenges.jade +++ b/app/my-challenges/my-challenges.jade @@ -30,3 +30,5 @@ challenge-tile( ng-repeat="challenge in vm.myChallenges | orderBy:vm.orderBy:true", challenge="challenge", view="vm.view", ng-class="vm.view + '-view'") + + tc-section.load-more-section(state="vm.loading") From c9939450a3421ee4847726411dc1c1598684059f Mon Sep 17 00:00:00 2001 From: shubhu Date: Sun, 29 Jan 2017 01:21:56 +0530 Subject: [PATCH 03/16] fixes #952 hide others menu from top menu --- assets/css/layout/footer.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/assets/css/layout/footer.scss b/assets/css/layout/footer.scss index 8d0906753..8384e7f4f 100644 --- a/assets/css/layout/footer.scss +++ b/assets/css/layout/footer.scss @@ -44,10 +44,6 @@ margin-top: 10px; } - .menu-visible .bottom-footer .menu-item { - display: block; - } - .social-links { .fb-link { background-image: url(../../images/ico-facebook.svg); From dc823d26ebc6b8d9e36f0a1f9e996967d4b92d7b Mon Sep 17 00:00:00 2001 From: shubhu Date: Mon, 30 Jan 2017 16:25:08 +0530 Subject: [PATCH 04/16] fixes #906 removed load more from profile challenges --- .../tc-endless-paginator/tc-endless-paginator.directive.js | 5 +---- app/profile/subtrack/subtrack.controller.js | 3 +-- app/topcoder.constants.js | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/app/directives/tc-endless-paginator/tc-endless-paginator.directive.js b/app/directives/tc-endless-paginator/tc-endless-paginator.directive.js index c7732ea54..d46baaeda 100644 --- a/app/directives/tc-endless-paginator/tc-endless-paginator.directive.js +++ b/app/directives/tc-endless-paginator/tc-endless-paginator.directive.js @@ -10,15 +10,12 @@ import angular from 'angular' template: require('./tc-endless-paginator')(), scope: { state: '=', - pageParams: '=', - firstLoadMore: '=?' + pageParams: '=' }, controller: ['$scope', function($scope) { - $scope.firstLoadMore = true $scope.loadMore = function() { $scope.pageParams.currentOffset += $scope.pageParams.limit $scope.pageParams.updated++ - $scope.firstLoadMore = false } }] } diff --git a/app/profile/subtrack/subtrack.controller.js b/app/profile/subtrack/subtrack.controller.js index 5c4fa1ad7..c75641407 100644 --- a/app/profile/subtrack/subtrack.controller.js +++ b/app/profile/subtrack/subtrack.controller.js @@ -28,7 +28,6 @@ import _ from 'lodash' vm.subTrackStats = [] vm.loadMore = loadMore vm.pageName = vm.subTrack - vm.firstLoadMore = true vm.tabs = ['statistics'] if (vm.track !== 'COPILOT') { @@ -166,7 +165,7 @@ import _ from 'lodash' window.onscroll = function() { if ((window.innerHeight + window.scrollY) >= (document.body.offsetHeight - CONSTANTS.INFINITE_SCROLL_OFFSET)) { - if (vm.pageParams.totalCount > vm.challenges.length && vm.firstLoadMore == false) { + if (vm.pageParams.totalCount > vm.challenges.length) { vm.loadMore() } } diff --git a/app/topcoder.constants.js b/app/topcoder.constants.js index b022ec98f..8fd2fd272 100644 --- a/app/topcoder.constants.js +++ b/app/topcoder.constants.js @@ -44,6 +44,6 @@ angular.module('CONSTANTS', []).constant('CONSTANTS', { 'SUBMISSION_TYPE_CONTEST': 'Contest Submission', 'STATUS_ACTIVE' : 'Active', 'STATUS_COMPLETED_WITHOUT_WIN' : 'Completed Without Win', - 'CHALLENGES_LOADING_CHUNK' : 12, + 'CHALLENGES_LOADING_CHUNK' : 36, 'INFINITE_SCROLL_OFFSET' : '400' // footer is 300px and challenge tile is 400px }) From 20ae1280758a648f7745bdd6028f03ae76292829 Mon Sep 17 00:00:00 2001 From: shubhu Date: Mon, 30 Jan 2017 16:27:04 +0530 Subject: [PATCH 05/16] removed unsed vars --- app/profile/subtrack/subtrack.controller.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/profile/subtrack/subtrack.controller.js b/app/profile/subtrack/subtrack.controller.js index c75641407..14b1ce99b 100644 --- a/app/profile/subtrack/subtrack.controller.js +++ b/app/profile/subtrack/subtrack.controller.js @@ -138,7 +138,6 @@ import _ from 'lodash' // watches page change counter to reload the data $scope.$watch('vm.pageParams.updated', function(newValue, oldValue) { if (newValue !== oldValue) { - vm.firstLoadMore = false _getChallenges() } }) From 19a651b94e564b9b8d50c49b794b0132f830bbac Mon Sep 17 00:00:00 2001 From: Sukma Nugraha Date: Mon, 30 Jan 2017 23:29:50 +0700 Subject: [PATCH 06/16] Fix for issue #946 - Update angular-ui-router version to 0.4.2 (https://github.com/angular-ui/ui-router/issues/2889) Additional fix: - Replace deprecated $http.success/error in blog.service.js as it also produces error log in console window. --- app/services/blog.service.js | 5 ++--- package.json | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/services/blog.service.js b/app/services/blog.service.js index 3047dcceb..fe632e3d6 100644 --- a/app/services/blog.service.js +++ b/app/services/blog.service.js @@ -19,7 +19,7 @@ import X2JS from 'xml2js' // fetch blog rss feed $http.get(CONSTANTS.BLOG_LOCATION) - .success(function(data) { + .then(function(data) { // parse the blog rss feed using x2js var parseString = X2JS.parseString parseString(data.trim(), function (err, res) { @@ -38,8 +38,7 @@ import X2JS from 'xml2js' deferred.resolve(result) }) - }) - .error(function(error) { + }, function(error) { deferred.reject(error) }) diff --git a/package.json b/package.json index 1c9d60547..fec389a11 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "angular-sanitize": "^1.4.9", "angular-storage": "0.0.13", "angular-touch": "^1.4.9", - "angular-ui-router": "^0.2.16", + "angular-ui-router": "^0.4.2", "angularjs-toaster": "^1.0.0", "appirio-styles": "0.x.x", "appirio-tech-ng-iso-constants": "^1.0.6", From b2855ed9f58b475d35571d0d9ee64b4e410c67f9 Mon Sep 17 00:00:00 2001 From: "Dr. Sergey Pogodin" Date: Wed, 1 Feb 2017 00:03:13 +0100 Subject: [PATCH 07/16] Fixed name of the Predix Badge --- app/profile/badges/badges.controller.js | 4 ++-- assets/css/directives/badge-tooltip.scss | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/profile/badges/badges.controller.js b/app/profile/badges/badges.controller.js index 7c831d7b9..4359ac019 100644 --- a/app/profile/badges/badges.controller.js +++ b/app/profile/badges/badges.controller.js @@ -658,8 +658,8 @@ import moment from 'moment-timezone' }, { id: 1008, - name: 'Predix Coder', - groupClass: 'Predix-Coder', + name: 'Predix Community', + groupClass: 'Predix-Community', active: false } ] diff --git a/assets/css/directives/badge-tooltip.scss b/assets/css/directives/badge-tooltip.scss index 4e2b463b4..156b73aea 100644 --- a/assets/css/directives/badge-tooltip.scss +++ b/assets/css/directives/badge-tooltip.scss @@ -437,7 +437,7 @@ .Crowd-for-Good { background-position: 0px -672px; } -.Predix-Coder { +.Predix-Community { background-position: -50px -672px; } .Wireframe { From 63085414475a832d6d8b63c21869b87f8bca5c32 Mon Sep 17 00:00:00 2001 From: shubhu Date: Wed, 1 Feb 2017 23:21:53 +0530 Subject: [PATCH 08/16] fixed #976 added min-width for badge modal --- assets/css/profile/badges.scss | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/assets/css/profile/badges.scss b/assets/css/profile/badges.scss index 00e180538..271ed3ef3 100644 --- a/assets/css/profile/badges.scss +++ b/assets/css/profile/badges.scss @@ -40,6 +40,7 @@ background: #fbfbfb; border: 1px solid #f0f0f0; width: 30%; + min-width: 300px; display: flex; flex-direction: column; justify-content: center; @@ -60,23 +61,23 @@ } .ngdialog-close { display: block; - } + } } - + .ngdialog-close { display: none; } - + .ngdialog-close.close-outside { display: block; height: 100%; width: 100%; cursor: default; } - + .ngdialog-close.close-outside:before { display: none; - } + } } } From ba3d0fb96d3d9657e02e59bb3bb5ef21956fefb5 Mon Sep 17 00:00:00 2001 From: Thomas Kranitsas Date: Thu, 2 Feb 2017 00:45:38 +0200 Subject: [PATCH 09/16] Fix footer links for mobile view --- app/layout/footer/footer.jade | 1 - assets/css/layout/footer.scss | 98 ++++++++++++++++++++--------------- 2 files changed, 55 insertions(+), 44 deletions(-) diff --git a/app/layout/footer/footer.jade b/app/layout/footer/footer.jade index af8a7e04d..9da14e773 100644 --- a/app/layout/footer/footer.jade +++ b/app/layout/footer/footer.jade @@ -1,7 +1,6 @@ footer.bottom-footer // Footer links nav.menu-item - .menu-item-header.show-small OTHERS ul.submenu li.submenu-item #[a.menu-link(ng-href="https://www.{{domain}}/sitemap") SITE MAP] diff --git a/assets/css/layout/footer.scss b/assets/css/layout/footer.scss index 8384e7f4f..d0c1f06c5 100644 --- a/assets/css/layout/footer.scss +++ b/assets/css/layout/footer.scss @@ -1,17 +1,31 @@ @import 'topcoder/tc-includes'; +footer { + font-family: "Merriweather Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + font-weight: 400; +} + .bottom-footer { background-color: $gray-darkest; padding: 1px 20px 30px 20px; } +.bottom-footer .menu-item .menu-link { + color: $tc-white; + font-size: ; +} + +.bottom-footer .menu-item .menu-link:hover { + color: $primary; +} + .social-links { font-size: 13px; line-height: 1.2em; text-align: center; font-weight: normal; margin: 35px 0; - color: #fff; + color: $tc-white; a { display: inline-block; @@ -23,60 +37,80 @@ margin-left: 30px; } } + + .fb-link { + background-image: url(@@cdn/i/ico-facebook_desktop.svg); + width: 27px; + height: 27px; + } + + .twitter-link { + background-image: url(@@cdn/i/ico-twitter_desktop.svg); + width: 28px; + height: 24px; + } + + .linkedin-link { + background-image: url(@@cdn/i/ico-linkedin_desktop.svg); + width: 27px; + height: 27px; + } + + .google-link { + background-image: url(@@cdn/i/ico-google_desktop.svg); + width: 27px; + height: 27px; + } } .copyright-notice { text-align: center; font-size: 12px; line-height: 14px; - color: #656565; + color: $tc-white; } @media only screen and (max-width : 1024px) { // removed fold-pusher from the rule to remove white space - // .bottom-footer, .fold-pusher { - .bottom-footer { - height: 200px; + .bottom-footer, .fold-pusher { + // .bottom-footer { + height: auto; } .bottom-footer .menu-item { - display: none; - margin-top: 10px; + display: block; } .social-links { + margin-top: 0; + margin-bottom: 6px; + .fb-link { - background-image: url(../../images/ico-facebook.svg); width: 27px; height: 27px; } .twitter-link { - background-image: url(../../images/ico-twitter.svg); width: 28px; height: 24px; } .linkedin-link { - background-image: url(../../images/ico-linkedin.svg); width: 27px; height: 27px; } .google-link { - background-image: url(../../images/ico-google.svg); width: 27px; height: 27px; } } .bottom-footer nav { - position: absolute; - top: 1047px; - left: 0; - width: 100%; - padding: 20px; - background-color: $gray-darkest; + position: relative;; + top: auto; + left: auto; + text-align: center; ul a { color: $white; @@ -86,9 +120,9 @@ @media only screen and (min-width : 1025px) { // removed fold-pusher from the rule to remove white space - // .bottom-footer, .fold-pusher { - .bottom-footer { - height: 270px; + .bottom-footer, .fold-pusher { + // .bottom-footer { + height: 200px; } .bottom-footer { padding-top: 40px; @@ -102,25 +136,19 @@ font-weight: normal; .menu-link { - color: #fff; - font-size: 16px; line-height: 21px; } - .menu-link:hover { - color: #0096ff; - } } } .copyright-notice { font-size: 15px; - color: #fff; + color: $tc-white; } .account-footer { .copyright-notice { font-size: 12px; - color: #656565; } } @@ -132,21 +160,5 @@ height: 26px; margin-top: 13px; } - - .fb-link { - background-image: url(../../images/ico-facebook_desktop.svg); - } - - .twitter-link { - background-image: url(../../images/ico-twitter_desktop.svg); - } - - .linkedin-link { - background-image: url(../../images/ico-linkedin_desktop.svg); - } - - .google-link { - background-image: url(../../images/ico-google_desktop.svg); - } } } From e56da768a623cf3c921e75e530d91e57942da325 Mon Sep 17 00:00:00 2001 From: Tom Ladendorf Date: Fri, 3 Feb 2017 21:10:44 +0100 Subject: [PATCH 10/16] fix to package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fec389a11..5e5663811 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "appirio-styles": "0.x.x", "appirio-tech-ng-iso-constants": "^1.0.6", "appirio-tech-ng-ui-components": "^2.1.2", - "appirio-tech-react-components": "appirio-tech/react-components.git#cl-styles-1", + "appirio-tech-react-components": "appirio-tech/react-components.git#challenge-listings", "auth0-angular": "^4.1.0", "auth0-js": "^6.8.0", "d3": "^3.5.14", From b97cb9ddb397da98d5d8c3795201d77c081b6fe9 Mon Sep 17 00:00:00 2001 From: lijulat Date: Sat, 4 Feb 2017 17:00:17 +0100 Subject: [PATCH 11/16] fix issue 979 --- assets/scripts/kissmetrics.analytics.js | 0 assets/scripts/munchkin.analytics.js | 22 ---------------------- 2 files changed, 22 deletions(-) delete mode 100644 assets/scripts/kissmetrics.analytics.js delete mode 100644 assets/scripts/munchkin.analytics.js diff --git a/assets/scripts/kissmetrics.analytics.js b/assets/scripts/kissmetrics.analytics.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/assets/scripts/munchkin.analytics.js b/assets/scripts/munchkin.analytics.js deleted file mode 100644 index 8b60ec182..000000000 --- a/assets/scripts/munchkin.analytics.js +++ /dev/null @@ -1,22 +0,0 @@ -// tracking code for Marketo -(function() { - var didInit = false - function initMunchkin() { - if(didInit === false) { - didInit = true - /*eslint no-undef:0 */ - Munchkin.init('921-UOU-112', {'wsInfo':'jFRS'}) - } - } - var s = document.createElement('script') - s.type = 'text/javascript' - s.async = true - s.src = '//munchkin.marketo.net/munchkin.js' - s.onreadystatechange = function() { - if (this.readyState == 'complete' || this.readyState == 'loaded') { - initMunchkin() - } - } - s.onload = initMunchkin - document.getElementsByTagName('head')[0].appendChild(s) -})() From aef29913f707d82a61bc18f9b8f191085c3a4ebf Mon Sep 17 00:00:00 2001 From: Liju Date: Sat, 4 Feb 2017 17:57:21 +0100 Subject: [PATCH 12/16] Update footer.scss Fix as CI build errors --- assets/css/layout/footer.scss | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/assets/css/layout/footer.scss b/assets/css/layout/footer.scss index d0c1f06c5..64d41f229 100644 --- a/assets/css/layout/footer.scss +++ b/assets/css/layout/footer.scss @@ -12,7 +12,7 @@ footer { .bottom-footer .menu-item .menu-link { color: $tc-white; - font-size: ; + font-size: 16px; } .bottom-footer .menu-item .menu-link:hover { @@ -39,25 +39,25 @@ footer { } .fb-link { - background-image: url(@@cdn/i/ico-facebook_desktop.svg); + background-image: url(../../images/ico-facebook_desktop.svg); width: 27px; height: 27px; } .twitter-link { - background-image: url(@@cdn/i/ico-twitter_desktop.svg); + background-image: url(../../images/ico-twitter_desktop.svg); width: 28px; height: 24px; } .linkedin-link { - background-image: url(@@cdn/i/ico-linkedin_desktop.svg); + background-image: url(../../images/ico-linkedin_desktop.svg); width: 27px; height: 27px; } .google-link { - background-image: url(@@cdn/i/ico-google_desktop.svg); + background-image: url(../../images/ico-google_desktop.svg); width: 27px; height: 27px; } From 27a05aa86bc332a5fdd887371bb974cf0fcacd86 Mon Sep 17 00:00:00 2001 From: "Dr. Sergey Pogodin" Date: Sun, 5 Feb 2017 13:19:26 +0100 Subject: [PATCH 13/16] A slight correction: added top padding to the footer in mobile layout --- assets/css/layout/footer.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/css/layout/footer.scss b/assets/css/layout/footer.scss index 64d41f229..dcbcb09fb 100644 --- a/assets/css/layout/footer.scss +++ b/assets/css/layout/footer.scss @@ -80,6 +80,9 @@ footer { .bottom-footer .menu-item { display: block; } + .bottom-footer { + padding-top: 36px; + } .social-links { margin-top: 0; From efaf5b9df5952bddea9a1011aa7f4b43df6a2301 Mon Sep 17 00:00:00 2001 From: Thomas Kranitsas Date: Mon, 6 Feb 2017 17:48:12 +0200 Subject: [PATCH 14/16] Fix /my-dashboard ENDS IN time counter issue --- app/directives/challenge-tile/challenge-tile.jade | 6 +++--- app/services/challenge.service.js | 1 + assets/css/directives/challenge-tile.scss | 12 ++++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/directives/challenge-tile/challenge-tile.jade b/app/directives/challenge-tile/challenge-tile.jade index 4660e4dfb..092f8e700 100644 --- a/app/directives/challenge-tile/challenge-tile.jade +++ b/app/directives/challenge-tile/challenge-tile.jade @@ -12,8 +12,8 @@ .challenge-details p.currentPhase {{challenge.userCurrentPhase}} - .challenge-calendar(ng-show="challenge.userCurrentPhaseEndTime") - p.ends-in Ends In + .challenge-calendar(ng-show="challenge.userCurrentPhaseEndTime", ng-class="{'challenge-late' : challenge.isLate}") + p.ends-in {{challenge.isLate ? 'Late for' : 'Ends In'}} p.time-remaining {{challenge.userCurrentPhaseEndTime[0]}} p.unit-of-time {{challenge.userCurrentPhaseEndTime[1]}} @@ -88,7 +88,7 @@ p.roles(ng-hide="challenge.track === 'DATA_SCIENCE'") #[span Role: ] #[span {{challenge.userDetails.roles | listRoles}}] .challenge-details - .challenge-info + .challenge-info(ng-class="{'challenge-late' : challenge.isLate}") p.currentPhase {{challenge.userCurrentPhase}} p.ends-in(ng-show="challenge.userCurrentPhaseEndTime") Ends: {{challenge.userCurrentPhaseEndTime[2] | localTime}} diff --git a/app/services/challenge.service.js b/app/services/challenge.service.js index c71b4978e..a9ecd0492 100644 --- a/app/services/challenge.service.js +++ b/app/services/challenge.service.js @@ -119,6 +119,7 @@ import moment from 'moment' // Add actual time ['2', 'months', actual date] timeAndUnit.push(fullTime) challenge.userCurrentPhaseEndTime = timeAndUnit + challenge.isLate = moment().diff(fullTime) > 0 // If > 0 then the challenge has 'Late Deliverables' or } }) } diff --git a/assets/css/directives/challenge-tile.scss b/assets/css/directives/challenge-tile.scss index 163886747..ef8b13dc8 100644 --- a/assets/css/directives/challenge-tile.scss +++ b/assets/css/directives/challenge-tile.scss @@ -222,6 +222,12 @@ challenge-tile .challenge.tile-view { text-transform: lowercase; color: #7F7F7F; } + + &.challenge-late { + .ends-in, .time-remaining, .unit-of-time { + color: #ee6666; + } + } } .stalled-challenge { @@ -462,6 +468,12 @@ challenge-tile .challenge.list-view { font-size: 14px; color: #A3A3AE; } + + &.challenge-late { + .ends-in, .time-remaining, .unit-of-time { + color: #ee6666; + } + } } .marathon-score { From 8f20d4a80a7dc6290c0c9dc579a53be17ba0e83e Mon Sep 17 00:00:00 2001 From: shubhu Date: Tue, 7 Feb 2017 01:23:51 +0530 Subject: [PATCH 15/16] fixed #987 added ios community badge --- app/profile/badges/badges.controller.js | 6 ++++++ assets/css/directives/badge-tooltip.scss | 3 +++ assets/images/badge.grid.large.png | Bin 198981 -> 200822 bytes 3 files changed, 9 insertions(+) diff --git a/app/profile/badges/badges.controller.js b/app/profile/badges/badges.controller.js index 4359ac019..f99750f43 100644 --- a/app/profile/badges/badges.controller.js +++ b/app/profile/badges/badges.controller.js @@ -661,6 +661,12 @@ import moment from 'moment-timezone' name: 'Predix Community', groupClass: 'Predix-Community', active: false + }, + { + id: 1009, + name: 'iOS Community', + groupClass: 'iOS-Community', + active: false } ] } diff --git a/assets/css/directives/badge-tooltip.scss b/assets/css/directives/badge-tooltip.scss index 156b73aea..fbcf074cf 100644 --- a/assets/css/directives/badge-tooltip.scss +++ b/assets/css/directives/badge-tooltip.scss @@ -440,6 +440,9 @@ .Predix-Community { background-position: -50px -672px; } +.iOS-Community { + background-position: -95px -672px; +} .Wireframe { width: 31px; background-position: 0px -1009px !important; diff --git a/assets/images/badge.grid.large.png b/assets/images/badge.grid.large.png index 7e3a747d52bfaf0d963c0cd071d51c4b6ecda19b..b7c73ef24a8051acd657c44f687e14534105c58d 100644 GIT binary patch delta 25322 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 Date: Thu, 9 Feb 2017 15:21:08 +0100 Subject: [PATCH 16/16] Fixed unit tests The updated of `angular-mocks` up to v1.6.2 broke those unit tests, which injected a fake window object into environment. Some functions inside `angular-mocks` assume that `window.angular.callbacks` exists, and they crush otherwise. Adding such field into all fake windows injected by broken tests resolved the issue. --- app/account/logout/logout.spec.js | 8 +++++--- app/services/helpers.service.spec.js | 5 +++++ app/services/jwtInterceptor.service.spec.js | 5 +++++ package.json | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/account/logout/logout.spec.js b/app/account/logout/logout.spec.js index 8926430c1..da1f544b0 100644 --- a/app/account/logout/logout.spec.js +++ b/app/account/logout/logout.spec.js @@ -4,6 +4,11 @@ import angular from 'angular' describe('Logout Controller', function() { var controller var fakeWindow = { + // Without the `angular` field our fake window will crush + // `angular-mocks@1.6.2` and higher! + angular: { + callbacks: {} + }, location: { href: '' } @@ -15,14 +20,11 @@ describe('Logout Controller', function() { angular.mock.module('tc.account', function($provide) { $provide.value('$window', fakeWindow) }) - bard.inject(this, '$controller', 'TcAuthService', '$window', '$q', 'CONSTANTS') - bard.mockService(TcAuthService, { logout: $q.when({}), _default: $q.when({}) }) - controller = $controller('LogoutController') }) diff --git a/app/services/helpers.service.spec.js b/app/services/helpers.service.spec.js index 9e1757f6f..2508bfe9f 100644 --- a/app/services/helpers.service.spec.js +++ b/app/services/helpers.service.spec.js @@ -5,6 +5,11 @@ const mockData = require('../../tests/test-helpers/mock-data') describe('Helper Service', function() { var fakeWindow = { + // Without the `angular` field our fake window will crush + // `angular-mocks@1.6.2` and higher! + angular: { + callbacks: {} + }, location: { href: '/' }, diff --git a/app/services/jwtInterceptor.service.spec.js b/app/services/jwtInterceptor.service.spec.js index 8715e1896..ec11b7461 100644 --- a/app/services/jwtInterceptor.service.spec.js +++ b/app/services/jwtInterceptor.service.spec.js @@ -33,6 +33,11 @@ describe('JWT Interceptor Service', function() { }) }, fakeWindow = { + // Without the `angular` field our fake window will crush + // `angular-mocks@1.6.2` and higher! + angular: { + callbacks: {} + }, location: '' } diff --git a/package.json b/package.json index 5e5663811..ca19358b7 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "test": "karma start --tc --test" }, "devDependencies": { - "angular-mocks": "^1.4.9", + "angular-mocks": "^1.6.2", "appirio-tech-webpack-config": "^0.3.8", "babel-polyfill": "^6.7.2", "bardjs": "^0.1.8",