Skip to content
This repository was archived by the owner on Mar 4, 2025. It is now read-only.

Commit bad9f2d

Browse files
author
vikasrohit
committed
Merge branch 'dev' into feature/sso-accounts-app-integration
* dev: (64 commits) AS#131482348128949, Refactor Mailchimp API wrapper to be generic user preferences service Fixed lint errors Added code comments Removed tabs updated package.json Final fix - all review comments Fix indentation issue Implemented/Fixed review comments, except package.json. Will do that next. Fixed typos Fixed all review feedbacks Fixed left lint errors Fixed lint errors Fixed issues with tooltip Removed extra semicolon Fixed lint errors Fixed review comments Fixed unused var lint errors Fixed lint issues Fixed issue #814 - [$100] Topcoder Member Profile: Redesign ratings graph AS#131482348128949, Refactor Mailchimp API wrapper to be generic user preferences service ... Conflicts: app/topcoder.constants.js
2 parents e8fd49d + 877e148 commit bad9f2d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+864
-287
lines changed

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ env:
6060
# QA_AWS_SECRET
6161
- secure: azM3x9Cf7jSEe1TC/uhozJbP82oLfTiydvFBuE70SZ8tIJJUGSVGPe7wF6YJfF1zkTCAZJrnzFRLxt3Unecx21ibxabwr6DdlJI+ptJH7VA/TeOL1+PGGjOK46Qb7qF1D2Y8m48uNy4GC7+K4Rs3r6xa702OjAFED+REQRBFDDoaNDLz4K+uYwgGrsu/o/B3y6tPmTFgrKiTCvCWPO0gGZ/mbqbW4ZDcTo/quIXb8vTrInxf978vR6TQDdKaTjgz/u1cNQ1e27ZXl9lkS9I8OBKiVMd8ixM2idC44wTw5HhbInYc0jzUQrOV/LBQfvx4csifRtwX9xm0jD8UqUqlqI/Ay1sVZKRBgMSWkrAfvVF4XeoqjXLhAq0vndblhIFcsUkRtECQePCGQhHPTE+vi6BhcoA9RxF+0vRoFQe2lQsK+GeLB4bww5JmCZ9E0gQzpe48F5p3x2qvuVj070lKeEDCdQ2Dym6VnR6vUUtExuOxlI9ggfcuR7hId1aL9OakMxe8iyui+bouFE9uvUddtxqF0hwt3wuHaOd2gFRjFzPt3iFHf3rtFm6RCFalNYXAmrQ7ODZ1FcwV/wzs0mdVDmMp39Hb8Vm21tBNkGgy8ynB1DC1Zyv+PiivG0cMfJnD7eD/b0mDITUTxJB8My2e1vkKCctxmhRJ78C1ftJafXU=
6262
# MASTER_AWS_KEY
63-
- secure: O6zyOKot+s0t0ANCM84Jd6QSfaKe4ICQX4SoQBJF394Su2+jXDOCvim8L8Z8JfzyB3uub7UE25AXwXSpIDfUTlCbMNIaAnHDjcFqNmcQ/v4kSQ0COK1VlHLHRAQHr8bzocOa1N6sjsQXxZGKWsHWzTQPbfmSdhHpL+NkSOQtM9gQYC8haafnosIEZPxHnRM99s9Ku7lHlEBN3+mMrTZjIU2qeKL9NxyCjPLZkAPQQR1qCYQsF4bG+BNj6OsRKh2rts3GBDz8upRmzStGh0IGX+xgryhu9yC3KV96ZXkMV/i35UQLSQsYo7AKxhljEx/1741GbkaRrLysS1YJ5xg6zMQbsT/Rj+p6WyjqBRH9QjnBwzUVij1GaOOi9gG6UjsULXEuOTwtHPvIod0il8kvjpoau0S63YwmYCVA+7fjNyzx/yZENnZS9hGetKs0Jso84JvzcSnm3HRBxlDyIJPlTXCX4TSpCFJM7p/eyC5XlpItW9Y2qjMOa/6gHOeHt+1AR4wq4BPCa4omYAwDRRYaNRW96VK+hTMHwdcZTuGY7kst/rhnU7ShZg12g/t1OyA4+jY3xm2RAMfMwuuiPffLe/2g5HPltfLKoQSzyuMypwqjH6ECoWCGHGq1NZQu6wSsuxAz/ucAE9a3NlLgnzub2BwN8j2fh8n5mMnfoOXV5Xg=
63+
- secure: natX9uNNhOZBAkVht/f/dxT2Rkv/EP4maS3h9/dRXqejEHO9YQCTnvApGFE1SkDuH+NHoH06yx7RpAh+Gswn8CldHPF3daVnJHVgZYU2gBTyxlc5hFFV3ZmZ+hFSZgzWAXRSedw3l/SD7ceo8RebeVpSH/weDxzmHHSb429f0809wM+gWeUsNAG1sAr/oKw1t++7xIZA9p9k7EpCy8oBpHNRB30vknORNY/VFZMbp/RHfJohiL8SM9Nub2rnh27LKxik32BDCNypm+wE1cMB8642wL+MysIN7b1b1PJ9Hkahzcym8tImY0zJrui/j7tZ2ho0ATaHIc4DHna3TeM/tIK56Rtb+w4/b5rZrtIGCqCDoo6MQMkh1jL45KKeoa9Q5OgdgKqRgOQIkhy9MPQyqayUi/6RTplYXt1MO0vpHKUD2yMDZSfXWfin0XnHywTKAjjdc/lyvvC7YtrucbUu3DSbY6Eq5DH9przWdHWtXQDA0+hNjjxa6M8w2hPYBqOSM5GHF1VjlwY15hDLx/oua1VyGSfe7msd6xo0gkA/lvbA4QrOcuPYduF0cOvXuzj/RsaVqcHOAzRHvyKHaQR2UmmEQH7JoKr0/0mjXTNZX/xPlGtqRBDiWajfHhIjG4RlApbGTcdFUiuMrTNp0USA3QyV72yljWvkZ4L/9PbDjq8=
6464
# MASTER_AWS_SECRET
65-
- secure: kyqe9fRjYLFZ3OhsEnB7iie4GKnARq0vJYaXrFZx2A3dJPm6fljNnrbVS0zdEZgaKMtYMz6Ts+hlE4Oia5VRkXDhpKfPcieatRNTjsApbRo50Ax70qrTsyAaBIfkZxrJcyxC028uv0xhB8d5kv7MVim8tiSHroOd+QwZABZsGBc41U9sj/v5zPQpslsyKv0MJJmB+QwXqx/7GxY5N2dT8LfcBJdoUdJMAyRPBUox5+LmtrW6ws6fx106C2Eh/i8jhssmiIq0MEguiqVZKYH4u01XXsH131uue2AzYu+nVdFpRnvqxgQLzNrNGCMcBsutJKQJ/Iz5f1mRlWDeVlmVDNPJO8195G6P0QO/g4RpR+fybiB9jiNri7HtRDP4dvpRgDqUpXaGfEte533FGGJFhSGCYgkx9zIfkcHWxbYHAelEXSzyJFz7Z40bOQK/rh51xhz+FGNhzHn/MikFOflIftm3WGU+4ZvjQJdbPLEQk9wVl1EUg1YdWnuohBPdX1fiT9hUUjdwJsRDNlmRT4dNQr2+GR1yXeSl8USzVo9G2LxgdaIS31EvvVEDL6ZQ3qPZnxXV8EVP32i7aYyt+TXb0rb+Y8TXTbcMQQEb2y+41ZN5NJqFuyOxbK3WvOUcmGtQgY12PTZJlQh80DiFS0svQRQ9bk54USRyQpG0jNBJZXU=
65+
- secure: fO89NVR5/+qbWD0tcHOftkGGSCa89vrYeH+UJ4zaE9kgos2W7QpIsc/ENt9NscuBOERBsrlOCzS+mBBC1ss40/GxIQbM8xS9b6y8odJqEKDCR34YDWcPEmb/kSbC0Cb7Q6r6r8fbJ0GFBOunYgiGFaGyPLlhVd68NBH2YzzRZ5R24KU7T1/3mFUz50DO/q+6NU56WurkrqTIes6YT3UNAPaXDaHJHtTifts+TibP6NpAsTDcj38gBH4re6+5MkI/iPUAaN7iA+aooDtHsKNWI0iCTyyBORfzNbCd0Nbbqv6GH/3v9RlZXg05+uOWOxjPLSH8TK3aQfGZD9uf1NmZRsNkLVVYMjUHAAZU3g0k8fxXMUtkL0nqbIoi9FTAMdHzc3aHQlU41DPbS7YV+Cs9Y2aHOx+kX1eqber6g0PUSrDSGmdFDlJqJrabHXomgRZxJ/uPyZ/JzGZQDYZxqWuhmtap79uGJOe/OKa1Oubj8wfwH3BIA1IFbLS2I5wAN5UOb0eQkTQTXS8LVtO2VicbX9YdZF1cE5uCpK1cXCv6+cNhziTXIrRFp7W/cYPMN7eZoQNxRgGfTSY+yNCKR3Qh+S8Ota8lZoB60wiPb6ISPIXbO0AwTtRHjrTUsPEfxsQPLZT4AZkYgjGbMEkzuhDVh3vR1gpQ67L8hPbNPAwh0ts=
6666
addons:
6767
apt:
6868
sources:

app/blocks/logger/logger.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ import angular from 'angular'
3333
$log.error(message)
3434

3535
if (window.NREUM) {
36-
var err = new Error(message)
37-
38-
window.NREUM.noticeError(err)
36+
window.NREUM.noticeError(message)
3937
}
4038
}
4139

app/community/members.controller.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import angular from 'angular'
1212
ctrl.notSearch = true
1313
ctrl.showing = 'list'
1414
ctrl.domain = CONSTANTS.domain
15-
ctrl.currentMonth = 'March 2016'
15+
ctrl.currentMonth = 'April 2016'
1616
ctrl.memberLeaderboard = []
1717
ctrl.copilots = []
1818
CommunityDataService.getMembersData()

app/community/members.jade

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
.platform-stats-container
1414
.stat
1515
p.statVal {{ctrl.platformStats.memberCount | number : 0}}
16-
p.statLabel ACTIVE MEMBER
16+
p.statLabel ACTIVE MEMBERS
1717
.stat
1818
p.statVal {{ctrl.platformStats.activeMembersCount | number : 0}}
1919
p.statLabel COMPETING TODAY
2020
.stat
2121
p.statVal {{ctrl.platformStats.prizePurse | currency:undefined:0}}
22-
p.statLabel AVAILABLE PRIZE
22+
p.statLabel AVAILABLE PRIZES
2323
.stat
2424
p.statVal {{ctrl.platformStats.activeContestsCount | number : 0}}
2525
p.statLabel ACTIVE CHALLENGES

app/directives/distribution-graph/distribution-graph.directive.js

Lines changed: 82 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import angular from 'angular'
22
import d3 from 'd3'
3+
import React from 'react' // eslint-disable-line no-unused-vars
4+
import ReactDOM from 'react-dom'
5+
import Tooltip from 'appirio-tech-react-components/components/Tooltip/Tooltip.jsx'
36

47
(function() {
58
'use strict'
@@ -59,7 +62,7 @@ import d3 from 'd3'
5962
]
6063

6164
var measurements = {
62-
w: 600,
65+
w: 900,
6366
h: 400,
6467
padding: {
6568
top: 20,
@@ -176,7 +179,24 @@ import d3 from 'd3'
176179
.attr('fill', function(d) {
177180
return ratingToColor($scope.colors, d.start)
178181
})
179-
182+
183+
var mousemoveInterval = null
184+
185+
/* render react tooltip component */
186+
ReactDOM.unmountComponentAtNode(document.getElementById('chart-tooltip'))
187+
ReactDOM.render(<Tooltip popMethod='click'>
188+
<div className='tooltip-target'></div>
189+
<div className='tooltip-body'>
190+
<div className='tooltip-rating'></div>
191+
<div className='tooltip-challenge'>
192+
<div className='challenge-name'></div>
193+
<div className='challenge-date'></div>
194+
</div>
195+
</div>
196+
</Tooltip>
197+
, document.getElementById('chart-tooltip'))
198+
199+
$scope.isFocused = false
180200
svg.selectAll('rect.hover')
181201
.data(ranges)
182202
.enter()
@@ -187,24 +207,81 @@ import d3 from 'd3'
187207
return xScale(i)
188208
})
189209
.attr('y', function(d) {
190-
return padding.top
210+
return yScale(d.number)
191211
})
192212
.attr('width', xScale.rangeBand())
193213
.attr('height', function(d) {
194-
return totalH - padding.bottom - padding.top
214+
return totalH - padding.bottom - yScale(d.number)
195215
})
196216
.on('mouseover', function(d) {
217+
$scope.isFocused = true
197218
$scope.highlightedRating = d.start
198219
$scope.displayCoders = true
199220
$scope.numCoders = d.number
221+
222+
/* update tooltip location on mouseover, feature currently not inbuilt in react tooltip component */
223+
d3.select('#chart-tooltip')
224+
.style('left', (d3.event.pageX-4) + 'px')
225+
.style('top', (d3.event.pageY-4) + 'px')
226+
227+
$('#chart-tooltip').addClass('distribution')
228+
d3.select('#chart-tooltip .tooltip-container')
229+
.style('left', '20px !important')
230+
.style('top', '-20px !important')
231+
232+
d3.select('#chart-tooltip .tooltip-container .tooltip-pointer')
233+
.style('left', '-5.5px !important')
234+
.style('bottom', '25px !important')
235+
236+
d3.select('#chart-tooltip .challenge-name').text($scope.numCoders + ' Coders')
237+
d3.select('#chart-tooltip .challenge-date').text('Rating Range: '+ $scope.highlightedRating + '-'+($scope.highlightedRating+99))
238+
d3.select('#chart-tooltip .tooltip-rating').text($scope.numCoders)
239+
d3.select('#chart-tooltip .tooltip-rating').style('background', ratingToColor($scope.colors, $scope.highlightedRating))
200240
$scope.$digest()
201241
})
242+
.on('mousemove', function(d) {
243+
244+
/* update tooltip on mousemove, using interval of 50ms to improve performance */
245+
window.clearTimeout(mousemoveInterval)
246+
var left = (d3.event.pageX-4)
247+
var top = (d3.event.pageY-4)
248+
249+
mousemoveInterval = window.setTimeout(function(){
250+
d3.select('#chart-tooltip')
251+
.style('left', left + 'px')
252+
.style('top', top + 'px')
253+
254+
d3.select('#chart-tooltip .tooltip-container')
255+
.style('left', '20px !important')
256+
.style('top', '-20px !important')
257+
258+
d3.select('#chart-tooltip .tooltip-container .tooltip-pointer')
259+
.style('left', '-5.5px !important')
260+
.style('bottom', '25px !important')
261+
}, 50)
262+
263+
})
202264
.on('mouseout', function(d) {
203265
$scope.displayCoders = false
204266
$scope.highlightedRating = false
267+
$scope.isFocused = false
205268
$scope.$digest()
206269
})
207-
270+
271+
/* hide tooltip when clicked anywhere outside */
272+
d3.select('body').on('click', function(){
273+
if((d3.event.target.classList[0] != 'tooltip-target') && !$('#chart-tooltip .tooltip-container').hasClass('tooltip-hide') &&
274+
!isInArray(d3.event.target.classList[0], ['tooltip-content-container', 'tooltip-container', 'tooltip-body', 'Tooltip']) &&
275+
(d3.event.target.tagName.toLowerCase()!='circle') && !(d3.event.target.tagName.toLowerCase()=='rect' && d3.event.target.classList[0] == 'hover')) {
276+
$('#chart-tooltip .tooltip-target').trigger('click')
277+
$('#chart-tooltip').removeClass('distribution')
278+
}
279+
})
280+
281+
function isInArray(value, array) {
282+
return array.indexOf(value) > -1
283+
}
284+
208285
svg.selectAll('line.xaxis')
209286
.data(ranges)
210287
.enter()
Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
.distribution-graph-directive(ng-show="graphState.show == 'distribution'")
22

3-
.graph-viewer
4-
.distribution-graph
3+
.graph-title
4+
.text Rating Distribution Graph
5+
.button-group
6+
button.tc-btn.tc-btn-s(ng-click="graphState.show = 'history'") View Rating History
7+
button.tc-btn.tc-btn-s.active(ng-click="graphState.show = 'distribution'") View Rating Distribution
58

6-
.info-port
7-
.coders(ng-if="displayCoders", style="background: {{highlightedRating || rating | ratingColor}}")
8-
.num {{numCoders}}
9-
.label CODERS
10-
.coders(ng-if="!displayCoders", style="background: {{rating | ratingColor}}")
11-
.num {{rating}}
12-
.label RATING
13-
button.tc-btn.tc-btn-s.compare(ng-click="graphState.show = 'history'")
14-
| View Rating History
9+
.graph-viewer
1510

11+
.distribution-graph

app/directives/history-graph/history-graph.directive.js

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import angular from 'angular'
22
import moment from 'moment'
33
import d3 from 'd3'
4+
import React from 'react' // eslint-disable-line no-unused-vars
5+
import ReactDOM from 'react-dom'
6+
import Tooltip from 'appirio-tech-react-components/components/Tooltip/Tooltip.jsx'
47

58
(function() {
69
'use strict'
@@ -16,11 +19,11 @@ import d3 from 'd3'
1619
rating: '=',
1720
graphState: '='
1821
},
19-
controller: ['$scope', HistoryGraphController]
22+
controller: ['$scope', '$state', '$filter', 'CONSTANTS', HistoryGraphController]
2023
}
2124
}
2225

23-
function HistoryGraphController($scope) {
26+
function HistoryGraphController($scope, $state, $filter, CONSTANTS) {
2427
$scope.colors = [
2528
// grey
2629
{
@@ -59,7 +62,7 @@ import d3 from 'd3'
5962
}
6063
]
6164
var measurements = {
62-
w: 600,
65+
w: 900,
6366
h: 400,
6467
padding: {
6568
top: 20,
@@ -156,7 +159,6 @@ import d3 from 'd3'
156159
.attr('width', w + padding.left + padding.right)
157160
.attr('height', h + padding.top + padding.bottom)
158161

159-
160162
svg.append('rect')
161163
.attr('x', padding.left)
162164
.attr('y', padding.top)
@@ -243,7 +245,21 @@ import d3 from 'd3'
243245
return y
244246
}
245247
}
246-
248+
249+
/* render react tooltip component */
250+
ReactDOM.unmountComponentAtNode(document.getElementById('chart-tooltip'))
251+
ReactDOM.render(<Tooltip popMethod='click'>
252+
<div className='tooltip-target'></div>
253+
<div className='tooltip-body'>
254+
<div className='tooltip-rating'></div>
255+
<div className='tooltip-challenge'>
256+
<div className='challenge-name'></div>
257+
<div className='challenge-date'></div>
258+
</div>
259+
</div>
260+
</Tooltip>
261+
, document.getElementById('chart-tooltip'))
262+
247263
svg.selectAll('circle')
248264
.data(history)
249265
.enter()
@@ -261,20 +277,44 @@ import d3 from 'd3'
261277
$scope.historyRating = d.newRating
262278
$scope.historyDate = moment(d.ratingDate).format('YYYY-MM-DD')
263279
$scope.historyChallenge = d.challengeName
280+
$('#chart-tooltip .tooltip-container').on('click', function(){
281+
if($state.params && ($state.params.subTrack === 'SRM' || $state.params.subTrack === 'MARATHON_MATCH'))
282+
location.href = $filter('challengeLinks')({'rounds': [{id: d.challengeId, forumId: null}], 'track': $state.params.track, 'subTrack': $state.params.subTrack}, 'detail')
283+
else
284+
location.href = $filter('challengeLinks')({id: d.challengeId, 'track': $state.params.track, 'subTrack': $state.params.subTrack}, 'detail')
285+
})
286+
287+
/* update tooltip location on mouseover, feature currently not inbuilt in react tooltip component */
288+
d3.select('#chart-tooltip')
289+
.style('left', (d3.event.pageX-5) + 'px')
290+
.style('top', (d3.event.pageY-5) + 'px')
291+
d3.select('#chart-tooltip .tooltip-container')
292+
.style('left', '20px !important')
293+
.style('top', '-20px !important')
294+
d3.select('#chart-tooltip .tooltip-container .tooltip-pointer')
295+
.style('left', '-5.5px !important')
296+
.style('bottom', '25px !important')
297+
298+
d3.select('#chart-tooltip .challenge-name').text($scope.historyChallenge)
299+
d3.select('#chart-tooltip .challenge-date').text(moment(d.ratingDate).format('MMM DD, YYYY'))
300+
d3.select('#chart-tooltip .tooltip-rating').text($scope.historyRating)
301+
d3.select('#chart-tooltip .tooltip-rating').style('background', ratingToColor($scope.colors, $scope.historyRating))
302+
$('#chart-tooltip').removeClass('distribution')
264303
$scope.$digest()
265-
d3.select(this)
266-
.attr('r', 6.0)
267304
})
268305
.on('mouseout', function(d) {
269306
$scope.historyRating = undefined
270307
$scope.$digest()
271-
d3.select(this)
272-
.attr('r', 4.5)
273-
.attr('stroke', 'none')
274-
.attr('stroke-width', '0px')
275308
})
276-
.attr('r', 4.5)
277309

310+
/* hide tooltip when clicked anywhere outside */
311+
d3.select('body').on('click', function(){
312+
if((d3.event.target.classList[0] != 'tooltip-target') && !$('#chart-tooltip .tooltip-container').hasClass('tooltip-hide') &&
313+
(d3.event.target.tagName.toLowerCase()!='circle') && !(d3.event.target.tagName.toLowerCase()=='rect' && d3.event.target.classList[0] == 'hover')) {
314+
$('#chart-tooltip .tooltip-target').trigger('click')
315+
$('#chart-tooltip .tooltip-container').off('click')
316+
}
317+
})
278318

279319
}
280320

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
.history-graph-directive(ng-show="graphState.show == 'history'")
2-
.history-graph-container
32

4-
.history-graph
3+
.graph-title
4+
.text Rating History Graph
5+
.button-group
6+
button.tc-btn.tc-btn-s.active(ng-click="graphState.show = 'history'") View Rating History
7+
button.tc-btn.tc-btn-s(ng-click="graphState.show = 'distribution'") View Rating Distribution
8+
9+
.history-graph-container
510

6-
.info-port
7-
.rating(style="background: {{historyRating || rating | ratingColor}}")
8-
.num {{historyRating || rating}}
9-
.label RATING
10-
.history-info
11-
.challenge(ng-if="historyRating") {{historyChallenge}}
12-
.date(ng-if="historyRating") {{historyDate | date}}
13-
button.tc-btn.tc-btn-s.compare(ng-click="graphState.show = 'distribution'") View Rating Distribution
11+
.history-graph

app/directives/page-state-header/page-state-header.jade

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
img.profile-circle(ng-if="!vm.profile.photoURL", src=require("../../../assets/images/ico-user-default.svg"))
1414

15-
.user-stats(id="metrics", ng-hide="vm.loading")
15+
.user-metrics(id="metrics", ng-hide="vm.loading")
1616
a.handle(style="color:{{vm.handleColor}};", ui-sref="profile.about({userHandle: vm.profile.handle})") {{vm.profile.handle}}
1717

1818
.money-earned(ng-hide="hideMoney")

app/directives/tc-banner/tc-banner.jade

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
.tc-banner-placeholder(class="{{vm.theme}}")
22
.image
33
img(ng-src="{{vm.img}}")
4-
.title(ng-bind="vm.title")
4+
.title(ng-bind="vm.title", ng-show="vm.title !== null")
55
.content(ng-transclude, ng-show="transcluded")
6-
.description(ng-bind-html="vm.description")
6+
.description(ng-bind-html="vm.description", ng-show="vm.description !== null")
77
.ctas
88
.cta(ng-repeat="link in vm.ctas")
99
a(class="{{link.cssClass}}", title="{{link.title}}", ng-href="{{link.url}}", ng-if="link.url") {{link.title}}

0 commit comments

Comments
 (0)