Merge branch 'master' into settings-glimmer

This commit is contained in:
Lisa Passing 2015-07-15 15:30:52 +02:00
commit 3cbbbcbfdb
48 changed files with 211 additions and 519 deletions

View File

@ -58,13 +58,18 @@ App = Ember.Application.extend(Ember.Evented,
@on 'user:synced', (user) -> @on 'user:synced', (user) ->
Travis.onUserUpdate(user) Travis.onUserUpdate(user)
@on 'user:signed_out', () ->
if config.userlike
Travis.removeUserlike()
currentDate: -> currentDate: ->
new Date() new Date()
onUserUpdate: (user) -> onUserUpdate: (user) ->
if config.pro if config.pro
@identifyCustomer(user) @identifyCustomer(user)
@setupCharm(user) if config.userlike
@setupUserlike(user)
@subscribePusher(user) @subscribePusher(user)
@ -80,14 +85,26 @@ App = Ember.Application.extend(Ember.Evented,
Travis.pusher.subscribeAll(channels) Travis.pusher.subscribeAll(channels)
setupCharm: (user) -> setupUserlike: (user) ->
$.extend window.__CHARM,
customer: user.login,
customer_id: user.id,
email: user.email
displayCharm: -> btn = document.getElementById('userlikeCustomTab')
__CHARM.show() btn.classList.add("logged-in")
userlikeData = window.userlikeData = {}
userlikeData.user = {}
userlikeData.user.name= user.login;
userlikeData.user.email = user.email;
unless document.getElementById('userlike-script')
s = document.createElement('script')
s.id = 'userlike-script'
s.src = '//userlike-cdn-widgets.s3-eu-west-1.amazonaws.com/0327dbb23382ccbbb91b445b76e8a91d4b37d90ef9f2faf84e11177847ff7bb9.js'
document.body.appendChild(s)
removeUserlike: () ->
btn = document.getElementById('userlikeCustomTab')
btn.classList.remove("logged-in")
identifyCustomer: (user) -> identifyCustomer: (user) ->
if _cio && _cio.identify if _cio && _cio.identify

View File

@ -23,5 +23,7 @@
<script src="assets/travis.js"></script> <script src="assets/travis.js"></script>
{{content-for 'body-footer'}} {{content-for 'body-footer'}}
<a href="javascript:void(0)" class="feedback-button" id="userlikeCustomTab" data-right="20" data-bottom="50" data-orientation="top">Do you have a question?</a>
</body> </body>
</html> </html>

View File

@ -1,17 +0,0 @@
`import config from 'travis/config/environment'`
initialize = (container, app) ->
if config.charmKey
window.__CHARM =
key: config.charmKey
url: window.location.protocol + "//charmscout.herokuapp.com/feedback"
window.bootstrapCharm()
# $('head').append $('<script src="https://charmscout.herokuapp.com/charmeur.js?v=2" async defer></script>')
Initializer =
name: 'charm'
initialize: initialize
`export {initialize}`
`export default Initializer`

View File

@ -8,10 +8,11 @@
@import "app/ansi"; @import "app/ansi";
@import "app/auth"; @import "app/auth";
@import "app/charm"; @import "app/forms";
// @import "app/forms"; @import "app/github";
// @import "app/github";
@import "app/main/annotations"; @import "app/main/annotations";
@import "app/userlike";
@import "app/main/list"; @import "app/main/list";
@import "app/main/log"; @import "app/main/log";

View File

@ -1,104 +0,0 @@
.feedback-button
display: none
.pro
.feedback-button
display: inline-block
.feedback-button
display: inline-block
position: fixed
right: 4%
left: auto
bottom: 0
margin: 0
padding: .5em 1em .5em
border-radius: 4px
// transform: rotate(90deg) translateY(-140%)
transform: translateY(20%)
will-change: transform
transition: transform ease 200ms
background: $white
font-size: 13px
color: #a2afb3
text-transform: uppercase
box-shadow: 0px 0px 3px 1px rgba(0,0,0,0.15)
z-index: 89
&.hidden
display: none
.feedback-button:hover
// transform: rotate(90deg) translateY(-130%)
transform: translateY(5%)
.feedback-popup
position: fixed
top: 50%
left: 50%
width: 30em
transform: translate(-50%, -50%)
padding: 1em 1.3em
background-color: #ffffff
border-radius: 5px
z-index: 85
box-shadow: 0px 0px 3px 1px rgba(0,0,0,0.15)
h1
margin: 0 0 .4em
padding-left: .4em
color: #347389
font-size: 22px
textarea
box-sizing: border-box
display: block
width: 100%
height: 10em
margin-bottom: .8em
padding: .5em .6em
resize: vertical
background-color: #f4f3eb
font-size: 16px
color: #7d7e80
border: none
font-family: $font-family-sans-serif
.submit
margin-right: 1em
padding: .3em .7em
background-color: #37a766
color: $white
font-size: 16px
border: none
border-radius: 4px
font-family: $font-family-sans-serif
cursor: pointer
p
padding-left: 0.7em
margin: 0.3em 0 0
a
color: #7d7e80
font-size: 16px
text-decoration: none
a:hover
text-decoration: underline
.closed &
display: none
.feedback-overlay
display: block
position: fixed
top: 0
right: 0
bottom: 0
left: 0
width: 100%
height: 100%
background-color: rgba(#D5D5CE, 0.7)
z-index: 84
.closed &
display: none
#CHARM_FORM_TARGET
display: none

View File

@ -0,0 +1,24 @@
.feedback-button
display: none
position: fixed
right: 1%
left: auto
bottom: 0
margin: 0
padding: .5em 1em 1em 1em
border-radius: 4px
border: solid 1px #399399
transform: translateY(20%)
will-change: transform
transition: transform ease 200ms
background: $white
font-size: 16px
color: #399399
z-index: 89
.feedback-button:hover
transform: translateY(5%)
.logged-in.feedback-button
display: inline-block

View File

@ -4,16 +4,16 @@
{{#if config.billingEndpoint}} {{#if config.billingEndpoint}}
<div class="cta-btn"> <div class="cta-btn">
{{#if view.subscribed}} {{#if view.subscribed}}
<a class="btn btn-activated" {{bind-attr href="billingUrl"}}> <a class="btn btn-activated" href={{billingUrl}}>
Subscription active! Subscription active!
</a> </a>
{{else}} {{else}}
{{#if view.education}} {{#if view.education}}
<a class="btn btn-activated" {{bind-attr href="billingUrl"}}> <a class="btn btn-activated" href={{billingUrl}}>
Educational account! Educational account!
</a> </a>
{{else}} {{else}}
<a class="btn btn-activate" {{bind-attr href="billingUrl"}}> <a class="btn btn-activate" href={{billingUrl}}>
Sign up this account! Sign up this account!
</a> </a>
{{/if}} {{/if}}
@ -93,9 +93,9 @@
<ul class="profile-hooklist"> <ul class="profile-hooklist">
{{#each hook in hooksWithoutAdmin}} {{#each hook in hooksWithoutAdmin}}
<li {{bind-attr class="hook.active:active :row"}}> <li class="{{if hook.active 'active'}} row">
<button class="profile-switch disabled"></button> <button class="profile-switch disabled"></button>
<a {{bind-attr href="hook.urlGithub"}} rel="nofollow" class="profile-repo"> <a href={{hook.urlGithub}} rel="nofollow" class="profile-repo">
{{hook.slug}} {{hook.slug}}
<span>{{hook.description}}</span> <span>{{hook.description}}</span>
</a> </a>

View File

@ -2,7 +2,7 @@
<div id="annotations"> <div id="annotations">
{{#each annotation in view.annotations}} {{#each annotation in view.annotations}}
<div class="annotation"> <div class="annotation">
<a {{bind-attr href="annotation.url"}}> <a href={{annotation.url}}>
{{annotation.status}} {{annotation.providerName}} {{annotation.status}} {{annotation.providerName}}
</a>: </a>:
{{annotation.description}} {{annotation.description}}

View File

@ -1,19 +1,19 @@
{{#if loading}} {{#if loading}}
{{loading-indicator}} {{loading-indicator}}
{{else}} {{else}}
<section {{bind-attr class=":tile :tile--pass :row build.state"}}> <section class="tile tile--pass row {{build.state}}">
<div class="tile-status"> <div class="tile-status">
<span {{bind-attr class=":icon :icon-status build.state"}} {{bind-attr title="build.state"}}></span> <span class="icon icon-status {{build.state}}" title={{build.state}}></span>
<span {{bind-attr class=":request-kind build.eventType :icon"}} {{bind-attr title="build.eventType"}}></span> <span class="request-kind {{build.eventType}} icon" title={{build.eventType}}></span>
</div> </div>
<div class="tile-main medium-8 columns"> <div class="tile-main medium-8 columns">
<h2 class="repo-main-commit"> <h2 class="repo-main-commit">
{{#if build.pullRequest}} {{#if build.pullRequest}}
<small class="repo-main-branch" {{bind-attr title="build.pullRequestTitle"}}>Pull Request #{{build.pullRequestNumber}}</small> <small class="repo-main-branch" title={{build.pullRequestTitle}}>Pull Request #{{build.pullRequestNumber}}</small>
{{build.pullRequestTitle}} {{build.pullRequestTitle}}
{{else}} {{else}}
<small class="repo-main-branch" {{bind-attr title="build.commit.branch"}}>{{build.commit.branch}}</small> <small class="repo-main-branch" title={{build.commit.branch}}>{{build.commit.branch}}</small>
{{format-message build.commit.subject repo=build.repo}} {{format-message build.commit.subject repo=build.repo}}
{{/if}} {{/if}}
</h2> </h2>
@ -25,11 +25,11 @@
</div> </div>
<div class="tile-author"> <div class="tile-author">
{{#if commit.authorName}} {{#if commit.authorName}}
<img {{bind-attr src="urlAuthorGravatarImage"}}>{{commit.authorName}} authored{{#if commit.authorIsCommitter}} and committed{{/if}} <img src={{urlAuthorGravatarImage}}>{{commit.authorName}} authored{{#if commit.authorIsCommitter}} and committed{{/if}}
{{/if}} {{/if}}
{{#unless commit.authorIsCommitter}} {{#unless commit.authorIsCommitter}}
{{#if commit.committerName}} {{#if commit.committerName}}
<img {{bind-attr src="urlCommitterGravatarImage"}}>{{commit.committerName}} committed <img src={{urlCommitterGravatarImage}}>{{commit.committerName}} committed
{{/if}} {{/if}}
{{/unless}} {{/unless}}
</div> </div>
@ -42,17 +42,17 @@
{{build.number}} {{humanize-state build.state}}{{/link-to}} {{build.number}} {{humanize-state build.state}}{{/link-to}}
</li> </li>
<li> <li>
<a class="commit" {{bind-attr href="urlGithubCommit"}}> <a class="commit" href={{urlGithubCommit}}>
<span class="icon icon--github"></span> <span class="icon icon--github"></span>
Commit {{format-sha commit.sha}} Commit {{format-sha commit.sha}}
</a> </a>
</li> </li>
<li> <li>
{{#if build.pullRequest}} {{#if build.pullRequest}}
<a class="compare" {{bind-attr href="build.commit.compareUrl"}}><span class="icon icon--github"></span> #{{build.pullRequestNumber}}: {{build.pullRequestTitle}}</a> <a class="compare" href={{build.commit.compareUrl}}><span class="icon icon--github"></span> #{{build.pullRequestNumber}}: {{build.pullRequestTitle}}</a>
{{else}} {{else}}
{{#if build.commit.compareUrl}} {{#if build.commit.compareUrl}}
<a class="compare" {{bind-attr href="build.commit.compareUrl"}}> <a class="compare" href={{build.commit.compareUrl}}>
<span class="icon icon--github"></span> <span class="icon icon--github"></span>
Compare {{short-compare-shas build.commit.compareUrl}}</a> Compare {{short-compare-shas build.commit.compareUrl}}</a>
{{/if}} {{/if}}

View File

@ -1,7 +1,7 @@
{{#if cachesExist}} {{#if cachesExist}}
<div class="caches-header"> <div class="caches-header">
<h1 class="caches-title">All caches <small>(<a href="http://docs.travis-ci.com/user/caching/" title="">documentation</a>)</small></h1> <h1 class="caches-title">All caches <small>(<a href="http://docs.travis-ci.com/user/caching/" title="">documentation</a>)</small></h1>
<a href="#" {{action "deleteRepoCache"}} {{bind-attr class="isDeleting:deleting :delete-repo-caches :button--delete"}}> <a href="#" {{action "deleteRepoCache"}} class="{{if isDeleting 'deleting'}} delete-repo-caches button--delete">
Delete all repository caches Delete all repository caches
</a> </a>
</div> </div>

View File

@ -17,7 +17,7 @@
{{/link-to}} {{/link-to}}
{{/if}} {{/if}}
</h2> </h2>
<p class="tile-author"><img {{bind-attr src="urlAuthorGravatarImage"}} alt=""> <p class="tile-author"><img src={{urlAuthorGravatarImage}} alt="">
{{build.commit.committerName}} committed {{build.commit.committerName}} committed
</p> </p>
</div> </div>

View File

@ -1,5 +1,5 @@
<p class="tile-item caches-branch column"> <p class="tile-item caches-branch column">
<span {{bind-attr class=":icon :icon--grey"}}></span> <span class="icon icon--grey"></span>
{{cache.branch}} {{cache.branch}}
</p> </p>
@ -8,7 +8,7 @@
<p class="tile-item caches-size column">{{mb cache.size}}MB</p> <p class="tile-item caches-size column">{{mb cache.size}}MB</p>
<p class="tile-item caches-button column"> <p class="tile-item caches-button column">
<a href="#" {{action "delete"}} {{bind-attr class="isDeleting:deleting :delete-by-slug :delete :button--delete"}}> <a href="#" {{action "delete"}} class="{{if isDeleting 'deleting'}} delete-by-slug delete button--delete">
Delete Delete
</a> </a>
</p> </p>

View File

@ -7,7 +7,7 @@
<p> <p>
Integrating <a href="https://codeclimate.com">Code Climate's test coverage</a> reporting with your test Integrating <a href="https://codeclimate.com">Code Climate's test coverage</a> reporting with your test
suite on Travis CI allows to track changes in coverage over time. If you haven't tried it out already, <a suite on Travis CI allows to track changes in coverage over time. If you haven't tried it out already, <a
{{bind-attr href="config.codeClimateUrl"}} target="_blank">sign href={{config.codeClimateUrl}} target="_blank">sign
up today</a> to improve your code's quality. New customers get 20% off for the first three months! up today</a> to improve your code's quality. New customers get 20% off for the first three months!
</p> </p>

View File

@ -6,7 +6,7 @@
{{#link-to "settings" hook.ownerName hook.name class="profile-settings" title="Repository settings"}}<span class="icon icon--cog"></span>{{/link-to}} {{#link-to "settings" hook.ownerName hook.name class="profile-settings" title="Repository settings"}}<span class="icon icon--cog"></span>{{/link-to}}
{{/if}} {{/if}}
</div> </div>
<a {{bind-attr href="hook.urlGithub"}} rel="nofollow" class="profile-repo"> <a href={{hook.urlGithub}} rel="nofollow" class="profile-repo">
{{hook.slug}} {{hook.slug}}
<span>{{hook.description}}</span></a> <span>{{hook.description}}</span></a>
@ -16,7 +16,7 @@
An error happened when we tried to alter settings on GitHub. An error happened when we tried to alter settings on GitHub.
{{#if githubOrgsOauthAccessSettingsUrl}} {{#if githubOrgsOauthAccessSettingsUrl}}
It may be caused by API restrictions, please It may be caused by API restrictions, please
<a {{bind-attr href="githubOrgsOauthAccessSettingsUrl"}} <a href={{githubOrgsOauthAccessSettingsUrl}}
title="Orgs Oauth Access Settings on GitHub"> title="Orgs Oauth Access Settings on GitHub">
review and add review and add
</a> your authorized Orgs. </a> your authorized Orgs.

View File

@ -1,6 +1,6 @@
{{#link-to "job" repo job}} {{#link-to "job" repo job}}
<div class="tile-status tile-status--job"> <div class="tile-status tile-status--job">
<span {{bind-attr class=":icon :icon--job job.state"}}></span> <span class="icon icon--job {{job.state}}"></span>
</div> </div>
<p class="job-id jobs-item build-status"> <p class="job-id jobs-item build-status">
@ -8,8 +8,8 @@
{{job.number}} {{job.number}}
</p> </p>
<p {{bind-attr class=":job-os :jobs-item :build-os job.config.os"}}> <p class="job-os jobs-item build-os {{job.config.os}}">
<span {{bind-attr class=":icon job.config.os"}}></span> <span class="icon {{job.config.os}}"></span>
</p> </p>
{{#if languages}} {{#if languages}}

View File

@ -2,7 +2,7 @@
<div class="tile-lock"><span class="icon icon-lock"></span></div> <div class="tile-lock"><span class="icon icon-lock"></span></div>
{{/if}} {{/if}}
<div class="tile-status"> <div class="tile-status">
<span {{bind-attr class=":icon :icon-status repo.default_branch.last_build.state"}}></span> <span class="icon icon-status {{repo.default_branch.last_build.state}}"></span>
</div> </div>
<div class="tile-main tile-header column medium-3"> <div class="tile-main tile-header column medium-3">
<h2>{{#link-to "repo" ownerName repoName }}{{repoName}}{{/link-to}}</h2> <h2>{{#link-to "repo" ownerName repoName }}{{repoName}}{{/link-to}}</h2>
@ -18,10 +18,10 @@
<div class="column medium-8 tile-double"> <div class="column medium-8 tile-double">
<div class="column medium-6"> <div class="column medium-6">
<p class="tile-branch"> <p class="tile-branch">
<span {{bind-attr class=":icon :icon--grey :request-kind repo.default_branch.last_build.event_type"}}></span> <span class="icon icon--grey request-kind {{repo.default_branch.last_build.event_type}}"></span>
{{repo.default_branch.name}}</p> {{repo.default_branch.name}}</p>
<p class="tile-commit"> <p class="tile-commit">
<span class="icon icon-github"></span><a {{bind-attr href="repo.default_branch.last_build.commit.compare_url"}}>{{format-sha repo.default_branch.last_build.commit.sha}}</a></p> <span class="icon icon-github"></span><a href={{repo.default_branch.last_build.commit.compare_url}}>{{format-sha repo.default_branch.last_build.commit.sha}}</a></p>
</div> </div>
<div class="column medium-6"> <div class="column medium-6">
<p class="tile-duration"> <p class="tile-duration">

View File

@ -1,7 +1,7 @@
{{#if statusPageStatusUrl}} {{#if statusPageStatusUrl}}
<h3>Travis CI Status</h3> <h3>Travis CI Status</h3>
<ul> <ul>
<li><div {{bind-attr class=":status-circle status"}}>Status:</div> <li><div class="status-circle {{status}}">Status:</div>
<a href="http://www.traviscistatus.com/">Travis CI Status</a> <a href="http://www.traviscistatus.com/">Travis CI Status</a>
</li> </li>
</ul> </ul>

View File

@ -19,12 +19,12 @@
<section class="dashboard-active"> <section class="dashboard-active">
{{#each repo in filteredRepositories}} {{#each repo in filteredRepositories}}
<div {{bind-attr class=":db :row repo.last_build.state"}}> <div class="db row {{repo.last_build.state}}">
{{#if repo.private }} {{#if repo.private }}
<div class="db-lock"><span class="icon icon-lock"></span></div> <div class="db-lock"><span class="icon icon-lock"></span></div>
{{/if}} {{/if}}
<div class="db-status"> <div class="db-status">
<span {{bind-attr class=":icon :icon-status repo.last_build.state"}}></span> <span class="icon icon-status {{repo.last_build.state}}"></span>
<span class="icon icon-star"></span> <span class="icon icon-star"></span>
</div> </div>
<div class="db-repo column medium-3 small-12"> <div class="db-repo column medium-3 small-12">

View File

@ -8,11 +8,11 @@
{{partial 'env_vars/form'}} {{partial 'env_vars/form'}}
{{else}} {{else}}
<a href="#" class="edit-var" {{action "edit"}}>Edit</a> <a href="#" class="edit-var" {{action "edit"}}>Edit</a>
<a href="#" {{action "delete"}} {{bind-attr class=":delete-var isDeleting:deleting"}}> <a href="#" {{action "delete"}} class="delete-var {{if isDeleting 'deleting'}}">
Delete Delete
</a> </a>
<span class="name">{{name}}</span> <span class="name">{{name}}</span>
<span {{bind-attr class=":value :value-display public::secure"}}>{{value}}</span> <span class="value value-display {{unless public 'secure'}}">{{value}}</span>
{{/if}} {{/if}}
</li> </li>
{{/unless}} {{/unless}}

View File

@ -20,7 +20,7 @@
</div> </div>
<div class="actions"> <div class="actions">
<input type="submit" {{bind-attr value=actionType class=":submit-env-var isSaving:saving" disabled=isSaving}} /> <input type="submit" value={{actionType}} class="submit-env-var {{if isSaving 'saving'}}" disabled={{isSaving}} />
<span class="or">or</span> <span class="or">or</span>
<a href="#" class="cancel-env-var" {{action "cancel"}}>Cancel</a> <a href="#" class="cancel-env-var" {{action "cancel"}}>Cancel</a>
</div> </div>

View File

@ -20,9 +20,6 @@
<li><a href="http://docs.travis-ci.com/">Documentation</a></li> <li><a href="http://docs.travis-ci.com/">Documentation</a></li>
<li><a href="http://blog.travis-ci.com/">Blog</a></li> <li><a href="http://blog.travis-ci.com/">Blog</a></li>
<li><a href="mailto:support@travis-ci.com">Email</a></li> <li><a href="mailto:support@travis-ci.com">Email</a></li>
{{#if config.pro}}
<li><a href="https://chat.travis-ci.com">Live Chat</a></li>
{{/if}}
<li><a href="https://twitter.com/travisci">Twitter</a></li> <li><a href="https://twitter.com/travisci">Twitter</a></li>
</ul> </ul>
</div> </div>

View File

@ -53,9 +53,9 @@
<div class="medium-6 columns"> <div class="medium-6 columns">
<ul class="tiles-landing"> <ul class="tiles-landing">
{{#each repo in repos}} {{#each repo in repos}}
<li {{bind-attr class=":db :column repo.lastBuild.state"}}> <li class="db column {{repo.lastBuild.state}}">
<div class="db-status"> <div class="db-status">
<span {{bind-attr class=":icon :icon-status repo.lastBuild.state"}}></span> <span class="icon icon-status {{repo.lastBuild.state}}"></span>
</div> </div>
<div class="db-repo column"> <div class="db-repo column">
<h3>{{repo.owner}}</h3> <h3>{{repo.owner}}</h3>

View File

@ -1,14 +1,14 @@
{{#if job.isLoaded}} {{#if job.isLoaded}}
<section {{bind-attr class=":tile :tile--pass :row job.state"}} {{!-- id="new-summary" --}}> <section class="tile tile--pass row {{job.state}}" {{!-- id="new-summary" --}}>
<div class="tile-status"> <div class="tile-status">
<span {{bind-attr class=":icon :icon-status job.state"}} {{bind-attr title="job.state"}}></span> <span class="icon icon-status {{job.state}}" title={{job.state}}></span>
<span {{bind-attr class=":request-kind job.build.eventType :icon"}} {{bind-attr title="job.build.eventType"}}></span> <span class="request-kind {{job.build.eventType}} icon" title={{job.build.eventType}}></span>
</div> </div>
<div class="tile-main medium-8 columns"> <div class="tile-main medium-8 columns">
<h2 class="repo-main-commit"> <h2 class="repo-main-commit">
<small class="repo-main-branch" {{bind-attr title="job.commit.branch"}}>{{job.commit.branch}}</small> <small class="repo-main-branch" title={{job.commit.branch}}>{{job.commit.branch}}</small>
{{format-message job.commit.subject repoBinding=job.repo}} {{format-message job.commit.subject repoBinding=job.repo}}
</h2> </h2>
<div class="repo-main-description"> <div class="repo-main-description">
@ -16,11 +16,11 @@
</div> </div>
<div class="tile-author"> <div class="tile-author">
{{#if job.commit.authorName}} {{#if job.commit.authorName}}
<img {{bind-attr src="view.urlAuthorGravatarImage"}}/>{{job.commit.authorName}} authored{{#if job.commit.authorIsCommitter}} and committed{{/if}} <img src={{view.urlAuthorGravatarImage}} />{{job.commit.authorName}} authored{{#if job.commit.authorIsCommitter}} and committed{{/if}}
{{/if}} {{/if}}
{{#unless job.commit.authorIsCommitter}} {{#unless job.commit.authorIsCommitter}}
{{#if job.commit.committerName}} {{#if job.commit.committerName}}
<img {{bind-attr src="view.urlCommitterGravatarImage"}}/>{{job.commit.committerName}} committed <img src={{view.urlCommitterGravatarImage}} />{{job.commit.committerName}} committed
{{/if}} {{/if}}
{{/unless}} {{/unless}}
</div> </div>
@ -35,14 +35,14 @@
{{/link-to}} {{/link-to}}
</li> </li>
<li> <li>
<a class="commit" {{bind-attr href="controller.urlGithubCommit"}}><span class="icon icon--github"></span> Commit {{format-sha job.commit.sha}}</a> <a class="commit" href={{controller.urlGithubCommit}}><span class="icon icon--github"></span> Commit {{format-sha job.commit.sha}}</a>
</li> </li>
<li> <li>
{{#if job.build.pullRequest}} {{#if job.build.pullRequest}}
<div class="compare"><a class="compare" {{bind-attr href="job.commit.compareUrl"}}><span class="icon icon--github"></span> #{{job.build.pullRequestNumber}}: {{job.build.pullRequestTitle}}</a></div> <div class="compare"><a class="compare" href={{job.commit.compareUrl}}><span class="icon icon--github"></span> #{{job.build.pullRequestNumber}}: {{job.build.pullRequestTitle}}</a></div>
{{else}} {{else}}
{{#if job.build.commit.compareUrl}} {{#if job.build.commit.compareUrl}}
<div class="compare"><a class="compare" {{bind-attr href="job.commit.compareUrl"}}><span class="icon icon--github"></span> Compare {{short-compare-shas job.build.commit.compareUrl}}</a></div> <div class="compare"><a class="compare" href={{job.commit.compareUrl}}><span class="icon icon--github"></span> Compare {{short-compare-shas job.build.commit.compareUrl}}</a></div>
{{/if}} {{/if}}
{{/if}} {{/if}}
</li> </li>

View File

@ -1,5 +1,5 @@
{{#if view.jobs.length}} {{#if view.jobs.length}}
<section {{bind-attr id=view.jobTableId}}> <section id={{view.jobTableId}}>
{{#if view.required}} {{#if view.required}}
<h2 class="build-title">Build Jobs</h2> <h2 class="build-title">Build Jobs</h2>
@ -14,12 +14,12 @@
{{#each job in view.jobs}} {{#each job in view.jobs}}
{{#view 'jobs-item' context=job}} {{#view 'jobs-item' context=job}}
<div {{bind-attr class=":tile :tile--jobs :row job.state" }}> <div class="tile tile--jobs row {{job.state}}">
{{#if job.config}} {{#if job.config}}
{{#link-to "job" job.repo job}} {{#link-to "job" job.repo job}}
<div class="tile-status tile-status--job"> <div class="tile-status tile-status--job">
<span {{bind-attr class=":icon :icon--job job.state"}}></span> <span class="icon icon--job {{job.state}}"></span>
</div> </div>
<p class="job-id jobs-item build-status"> <p class="job-id jobs-item build-status">
@ -31,8 +31,8 @@
{{/if}} {{/if}}
</p> </p>
<p {{bind-attr class=":job-os :jobs-item :build-os config.os"}}> <p class="job-os jobs-item build-os {{config.os}}">
<span {{bind-attr class=":icon config.os"}}></span> <span class="icon {{config.os}}"></span>
{{!-- {{config.os}} --}} {{!-- {{config.os}} --}}
</p> </p>
@ -61,14 +61,14 @@
</p> </p>
{{/if}} {{/if}}
<p class="job-duration jobs-item" {{bind-attr title="startedAt"}}> <p class="job-duration jobs-item" title={{startedAt}}>
<span class="icon icon--clock-dark"></span> <span class="icon icon--clock-dark"></span>
{{format-duration duration}} {{format-duration duration}}
</p> </p>
</div> </div>
{{!-- <p class="" {{bind-attr title="formattedFinishedAt"}}> {{!-- <p class="" title={{formattedFinishedAt}}>
<span class="icon icon--cal"></span> <span class="icon icon--cal"></span>
{{format-time finishedAt}} {{format-time finishedAt}}
</p> --}} </p> --}}

View File

@ -18,12 +18,12 @@
{{/if}} {{/if}}
<div {{bind-attr class="view.job.notStarted:hidden"}}> <div class="{{if view.job.notStarted 'hidden'}}">
<menu class="log-header"> <menu class="log-header">
{{#if view.canRemoveLog}} {{#if view.canRemoveLog}}
<a href="#" class="button button--grey open-popup" {{action "removeLogPopup" target=view}}><span class="icon icon--removeLog"></span> Remove Log</a> <a href="#" class="button button--grey open-popup" {{action "removeLogPopup" target=view}}><span class="icon icon--removeLog"></span> Remove Log</a>
{{/if}} {{/if}}
<a class="button button--grey" {{bind-attr href="view.plainTextLogUrl"}}><span class="icon icon--downloadLog"></span> Download Log</a> <a class="button button--grey" href={{view.plainTextLogUrl}}><span class="icon icon--downloadLog"></span> Download Log</a>
</menu> </menu>
<div class="log-body"> <div class="log-body">
{{#if view.showTailing}} {{#if view.showTailing}}
@ -44,13 +44,12 @@
{{#if view.showToTop}} {{#if view.showToTop}}
<a href='#' class="to-top" {{action "toTop" target=view}}>Top</a> <a href='#' class="to-top" {{action "toTop" target=view}}>Top</a>
{{/if}} {{/if}}
</div>
</div>
{{#if view.limited}} {{#if view.limited}}
<p class="warning"> <p class="warning">
This log is too long to be displayed. Please reduce the verbosity of your This log is too long to be displayed. Please reduce the verbosity of your
build or download the <a {{bind-attr href="view.plainTextLogUrl"}}>raw log</a>. build or download the <a href={{view.plainTextLogUrl}}>raw log</a>.
</p> </p>
{{/if}} {{/if}}
</div>
</div>
</section> </section>

View File

@ -1,4 +1,4 @@
<div {{bind-attr class=":wrapper auth.signedIn:non-centered:centered"}}> <div class="wrapper {{if auth.signedIn 'non-centered' 'centered'}}">
<header id="top" class="top"> <header id="top" class="top">
{{render "top"}} {{render "top"}}
@ -12,11 +12,11 @@
</div> </div>
</div> </div>
<aside id="left" {{bind-attr class="auth.signedIn::hidden"}}> <aside id="left" class="{{unless auth.signedIn 'hidden'}}">
{{outlet "left"}} {{outlet "left"}}
</aside> </aside>
</div> </div>
<footer {{bind-attr class="auth.signedIn:hidden"}}> <footer class="{{if auth.signedIn 'hidden'}}">
{{render "footer"}} {{render "footer"}}
</footer> </footer>

View File

@ -1,10 +1,10 @@
<header class="owner-header row"> <header class="owner-header row">
<div class="owner-avatar"> <div class="owner-avatar">
<img {{bind-attr src="avatarURL"}} alt="" width="125" height="125"> <img src={{avatarURL}} alt="" width="125" height="125">
</div> </div>
<div class="owner-info"> <div class="owner-info">
<h1 class="owner-title">{{owner.name}}</h1> <h1 class="owner-title">{{owner.name}}</h1>
<p class="owner-handle"><a {{bind-attr href="githubProfile"}} title=""><span class="icon icon--github-circle"></span> {{owner.login}}</a></p> <p class="owner-handle"><a href={{githubProfile}} title=""><span class="icon icon--github-circle"></span> {{owner.login}}</a></p>
{{!-- {{owner-sync-button owner=owner}} --}} {{!-- {{owner-sync-button owner=owner}} --}}
</div> </div>
</header> </header>

View File

@ -2,7 +2,7 @@
<section class="profile-user"> <section class="profile-user">
<div class="media"> <div class="media">
<div class="media-elem"> <div class="media-elem">
<img {{bind-attr src="auth.gravatarUrl"}} alt=""> <img src={{auth.gravatarUrl}} alt="">
</div> </div>
<div class="media-body"> <div class="media-body">
{{#link-to 'profile'}} {{#link-to 'profile'}}
@ -19,7 +19,7 @@
{{#link-to "account" view.account class="name"}} {{#link-to "account" view.account class="name"}}
<div class="media"> <div class="media">
<div class="media-elem"> <div class="media-elem">
<img {{bind-attr src="view.avatarUrl"}} alt=""> <img src={{view.avatarUrl}} alt="">
</div> </div>
<div class="media-body"> <div class="media-body">
<h2>{{view.name}}</h2> <h2>{{view.name}}</h2>
@ -34,7 +34,7 @@
{{#if config.githubOrgsOauthAccessSettingsUrl}} {{#if config.githubOrgsOauthAccessSettingsUrl}}
<section class="profile-additional"> <section class="profile-additional">
<p>Is an organization missing?<br> <p>Is an organization missing?<br>
<a {{bind-attr href="config.githubOrgsOauthAccessSettingsUrl"}} title="Orgs Oauth Access Settings on GitHub">Review and add</a> your authorized organizations.</p> <a href={{config.githubOrgsOauthAccessSettingsUrl}} title="Orgs Oauth Access Settings on GitHub">Review and add</a> your authorized organizations.</p>
</section> </section>
{{/if}} {{/if}}
</aside> </aside>

View File

@ -1,11 +1,11 @@
<ul class="tabs"> <ul class="tabs">
<li id="tab_hooks" {{bind-attr class="view.classHooks"}}> <li id="tab_hooks" class={{view.classHooks}}>
<h5> <h5>
{{#link-to "account" account}}Repositories{{/link-to}} {{#link-to "account" account}}Repositories{{/link-to}}
</h5> </h5>
</li> </li>
{{#if view.displayUser}} {{#if view.displayUser}}
<li id="tab_user" {{bind-attr class="view.classUser"}}> <li id="tab_user" class={{view.classUser}}>
<h5> <h5>
{{#link-to "accounts.info"}}Profile{{/link-to}} {{#link-to "accounts.info"}}Profile{{/link-to}}
</h5> </h5>
@ -14,7 +14,7 @@
{{#if config.billingEndpoint}} {{#if config.billingEndpoint}}
<li id="tab_billing" class="right"> <li id="tab_billing" class="right">
<h5> <h5>
<a {{bind-attr href="billingUrl"}}>Billing</a> <a href={{billingUrl}}>Billing</a>
</h5> </h5>
</li> </li>
{{/if}} {{/if}}

View File

@ -1,4 +1,4 @@
{{!-- <img {{bind-attr src="view.gravatarUrl"}}> {{!-- <img src={{view.gravatarUrl}}>
<dl class="profile"> <dl class="profile">
<div> <div>
@ -6,7 +6,7 @@
GitHub GitHub
</dt> </dt>
<dd> <dd>
<a {{bind-attr href="urlGithub"}}>{{user.login}}</a> <a href={{urlGithub}}>{{user.login}}</a>
</dd> </dd>
</div> </div>
<div> <div>

View File

@ -1,9 +1,9 @@
{{#if isLoaded}} {{#if isLoaded}}
{{#if length}} {{#if length}}
{{#each job in controller}} {{#each job in controller}}
<div {{bind-attr class=":tile :tile--sidebar job.state"}}> <div class="tile tile--sidebar {{job.state}}">
{{#if job.repo.slug}} {{#if job.repo.slug}}
<span {{bind-attr class=":icon :icon--job job.state"}}></span> <span class="icon icon--job {{job.state}}"></span>
{{#link-to "job" job.repo job}}{{job.repo.slug}}{{/link-to}} {{#link-to "job" job.repo job}}{{job.repo.slug}}{{/link-to}}
{{/if}} {{/if}}

View File

@ -1,17 +1,17 @@
<div id="repo" {{bind-attr class="view.className :repo"}}> <div id="repo" class="{{view.className}} repo">
{{#if view.isEmpty}} {{#if view.isEmpty}}
{{view 'repos-empty'}} {{view 'repos-empty'}}
{{else}} {{else}}
{{#if repo.isLoaded}} {{#if repo.isLoaded}}
<article id="repo-header" {{bind-attr class=":repo-header :passed"}}> <article id="repo-header" class="repo-header passed">
<header> <header>
<h1 class="repo-header-title">{{#link-to "repo" repo}}{{repo.slug}}{{/link-to}}</h1> <h1 class="repo-header-title">{{#link-to "repo" repo}}{{repo.slug}}{{/link-to}}</h1>
<div class="repo-header-icons"> <div class="repo-header-icons">
<a {{bind-attr href="controller.urlGithub"}}><span class="icon icon--github-circle"></span></a> <a href={{controller.urlGithub}}><span class="icon icon--github-circle"></span></a>
<a href="#" id="status-image-popup" name="status-images" class="open-popup" {{action "statusImages" target=view}}> <a href="#" id="status-image-popup" name="status-images" class="open-popup" {{action "statusImages" target=view}}>
<img {{bind-attr src="view.statusImageUrl"}} title="Build Status Images"/> <img src={{view.statusImageUrl}} title="Build Status Images"/>
</a> </a>
</div> </div>
<p class="description">{{description}}</p> <p class="description">{{description}}</p>

View File

@ -22,10 +22,10 @@
{{#collection 'repos-list' content=this}} {{#collection 'repos-list' content=this}}
{{#with view.repo as repo}} {{#with view.repo as repo}}
<div {{bind-attr class=":tile :tile--sidebar repo.lastBuildState"}}> <div class="tile tile--sidebar {{repo.lastBuildState}}">
<h2 class="tile-title"> <h2 class="tile-title">
{{#if repo.slug}} {{#if repo.slug}}
<span {{bind-attr class=":icon :icon--job repo.lastBuildState"}}></span> <span class="icon icon--job {{repo.lastBuildState}}"></span>
{{#link-to "repo" repo class="slug"}}{{repo.slug}}{{/link-to}} {{#link-to "repo" repo class="slug"}}{{repo.slug}}{{/link-to}}
{{/if}} {{/if}}
</h2> </h2>
@ -44,7 +44,7 @@
<p> <p>
<span class="icon icon--clock"></span> <span class="icon icon--clock"></span>
Duration: Duration:
<abbr class="duration" {{bind-attr title="lastBuildStartedAt"}}> <abbr class="duration" title={{lastBuildStartedAt}}>
{{format-duration repo.lastBuildDuration}} {{format-duration repo.lastBuildDuration}}
</abbr> </abbr>
</p> </p>
@ -52,7 +52,7 @@
<p> <p>
<span class="icon icon--cal"></span> <span class="icon icon--cal"></span>
Finished: Finished:
<abbr class="finished_at timeago" {{bind-attr title="lastBuildFinishedAt"}}> <abbr class="finished_at timeago" title={{lastBuildFinishedAt}}>
{{format-time repo.lastBuildFinishedAt}} {{format-time repo.lastBuildFinishedAt}}
</abbr> </abbr>
</p> </p>

View File

@ -1,16 +1,16 @@
<div class="tabnav tabnav--sidebar" role="tablist"> <div class="tabnav tabnav--sidebar" role="tablist">
<ul class="tab tabs--sidebar"> <ul class="tab tabs--sidebar">
<li id="tab_owned" {{bind-attr class="view.classOwned"}}> <li id="tab_owned" class={{view.classOwned}}>
<a href="#" {{action "showMyRepositories"}}>My Repositories</a> <a href="#" {{action "showMyRepositories"}}>My Repositories</a>
</li> </li>
{{#if config.pro}} {{#if config.pro}}
<li id="tab_running" {{bind-attr class="view.classRunning"}}> <li id="tab_running" class={{view.classRunning}}>
<a href="#" {{action "showRunningJobs"}}>Running ({{startedJobsCount}}/{{allJobsCount}})</a> <a href="#" {{action "showRunningJobs"}}>Running ({{startedJobsCount}}/{{allJobsCount}})</a>
</li> </li>
{{/if}} {{/if}}
<li id="tab_new" {{bind-attr class="view.classNew"}}> <li id="tab_new" class={{view.classNew}}>
{{#link-to "profile" trackEvent="add-repository-from-list" title="Add New Repository"}} {{#link-to "profile" trackEvent="add-repository-from-list" title="Add New Repository"}}
<span class="icon icon--plus"></span> <span class="icon icon--plus"></span>
{{/link-to}} {{/link-to}}

View File

@ -1,34 +1,34 @@
<div class="tabnav" role="tablist"> <div class="tabnav" role="tablist">
<ul class="tab tabs--main"> <ul class="tab tabs--main">
<li id="tab_current" {{bind-attr class="view.classCurrent"}}> <li id="tab_current" class={{view.classCurrent}}>
{{#if repo.slug}} {{#if repo.slug}}
{{#link-to "repo" repo current-when="repo.index"}} {{#link-to "repo" repo current-when="repo.index"}}
Current Current
{{/link-to}} {{/link-to}}
{{/if}} {{/if}}
</li> </li>
<li id="tab_branches" {{bind-attr class="view.classBranches"}}> <li id="tab_branches" class={{view.classBranches}}>
{{#if repo.slug}} {{#if repo.slug}}
{{#link-to "branches" repo}} {{#link-to "branches" repo}}
Branches Branches
{{/link-to}} {{/link-to}}
{{/if}} {{/if}}
</li> </li>
<li id="tab_builds" {{bind-attr class="view.classBuilds"}}> <li id="tab_builds" class={{view.classBuilds}}>
{{#if repo.slug}} {{#if repo.slug}}
{{#link-to "builds" repo}} {{#link-to "builds" repo}}
Build History Build History
{{/link-to}} {{/link-to}}
{{/if}} {{/if}}
</li> </li>
<li id="tab_pull_requests" {{bind-attr class="view.classPullRequests"}}> <li id="tab_pull_requests" class={{view.classPullRequests}}>
{{#if repo.slug}} {{#if repo.slug}}
{{#link-to "pullRequests" repo}} {{#link-to "pullRequests" repo}}
Pull Requests Pull Requests
{{/link-to}} {{/link-to}}
{{/if}} {{/if}}
</li> </li>
<li id="tab_build" {{bind-attr class="view.classBuild"}}> <li id="tab_build" class={{view.classBuild}}>
{{#if build.id}} {{#if build.id}}
{{#if repo.slug}} {{#if repo.slug}}
{{#link-to "build" repo build}} {{#link-to "build" repo build}}
@ -37,7 +37,7 @@
{{/if}} {{/if}}
{{/if}} {{/if}}
</li> </li>
<li id="tab_job" {{bind-attr class="view.classJob"}}> <li id="tab_job" class={{view.classJob}}>
{{#if job.id}} {{#if job.id}}
{{#if repo.slug}} {{#if repo.slug}}
{{#link-to "job" repo job}} {{#link-to "job" repo job}}
@ -46,14 +46,14 @@
{{/if}} {{/if}}
{{/if}} {{/if}}
</li> </li>
<li id="tab_settings" {{bind-attr class="view.classSettings"}}> <li id="tab_settings" class={{view.classSettings}}>
{{#if repo.slug}} {{#if repo.slug}}
{{#link-to "settings" repo}} {{#link-to "settings" repo}}
Settings Settings
{{/link-to}} {{/link-to}}
{{/if}} {{/if}}
</li> </li>
<li id="tab_requests" {{bind-attr class="view.classRequests"}}> <li id="tab_requests" class="{{view.classRequests}}">
{{#if repo.slug}} {{#if repo.slug}}
{{#link-to "requests" repo}} {{#link-to "requests" repo}}
Requests Requests
@ -61,7 +61,7 @@
{{/if}} {{/if}}
</li> </li>
{{#if config.caches_enabled}} {{#if config.caches_enabled}}
<li id="tab_caches" {{bind-attr class="view.classCaches"}}> <li id="tab_caches" class={{view.classCaches}}>
{{#if repo.slug}} {{#if repo.slug}}
{{#link-to "caches" repo}} {{#link-to "caches" repo}}
Caches Caches
@ -70,7 +70,7 @@
</li> </li>
{{/if}} {{/if}}
<li id="tab_request" {{bind-attr class="view.classRequest"}}> <li id="tab_request" class={{view.classRequest}}>
{{#if request.id}} {{#if request.id}}
{{#if repo.slug}} {{#if repo.slug}}
{{#link-to "request" repo request}} {{#link-to "request" repo request}}

View File

@ -1,10 +1,10 @@
<div id="request" {{bind-attr class="isAccepted:accepted:rejected"}}> <div id="request" class="{{if isAccepted 'accepted' 'rejected'}}">
<h3>{{status}}{{#unless isAccepted}}: {{message}}{{/unless}}</h3> <h3>{{status}}{{#unless isAccepted}}: {{message}}{{/unless}}</h3>
<p class="request-details"> <p class="request-details">
{{#if isPullRequest}} {{#if isPullRequest}}
This request is based on the This request is based on the
<span class="pr-number" {{bind-attr title="pullRequestTitle"}}>#{{pullRequestNumber}}</span> <span class="pr-number" title={{pullRequestTitle}}>#{{pullRequestNumber}}</span>
pull request. pull request.
{{else}} {{else}}
This request is based on a commit {{format-commit commit}} by {{commit.authorName}} This request is based on a commit {{format-commit commit}} by {{commit.authorName}}

View File

@ -1,7 +1,7 @@
{{#if config.pro}} {{#if config.pro}}
<div class="travis-lint"> <div class="travis-lint">
<p>Travis Lint for clean .yml files <p>Travis Lint for clean .yml files
<a {{bind-attr href="lintUrl"}}>lint.travis-ci.org/{{repo.slug}}</a> <a href={{lintUrl}}>lint.travis-ci.org/{{repo.slug}}</a>
</p> </p>
</div> </div>
{{/if}} {{/if}}

View File

@ -1,9 +1,9 @@
{{#if isLoaded}} {{#if isLoaded}}
{{#if controller.length}} {{#if controller.length}}
{{#each job in controller}} {{#each job in controller}}
<div {{bind-attr class=":tile :tile--sidebar job.state"}}> <div class="tile tile--sidebar {{job.state}}">
{{#if job.repo.slug}} {{#if job.repo.slug}}
<span {{bind-attr class=":icon :icon--job job.state"}}></span> <span class="icon icon--job {{job.state}}"></span>
{{#link-to "job" job.repo job}}{{job.repo.slug}}{{/link-to}} {{#link-to "job" job.repo job}}{{job.repo.slug}}{{/link-to}}
{{/if}} {{/if}}
@ -17,7 +17,7 @@
<p> <p>
<span class="icon icon--clock"></span> <span class="icon icon--clock"></span>
Duration: Duration:
<abbr class="duration" {{bind-attr title="job.startedAt"}}> <abbr class="duration" title={{job.startedAt}}>
{{format-duration job.duration}} {{format-duration job.duration}}
</abbr> </abbr>
</p> </p>

View File

@ -15,7 +15,7 @@
</p> </p>
<p class="settings-row"> <p class="settings-row">
<p {{bind-attr class=":short-settings-element settings.maximum_number_of_builds_valid"}}> <p class="short-settings-element {{settings.maximum_number_of_builds_valid}}">
{{input value=settings.maximum_number_of_builds size="4" pattern='/^[0-9]+$/'}} {{input value=settings.maximum_number_of_builds size="4" pattern='/^[0-9]+$/'}}
</p> </p>
<label> <label>

View File

@ -16,7 +16,7 @@
</div> </div>
</div> </div>
<div class="actions"> <div class="actions">
<a href="#" {{action "delete"}} {{bind-attr class=":delete-ssh-key isDeleting:deleting"}}> <a href="#" {{action "delete"}} class="delete-ssh-key {{if isDeleting 'deleting'}}">
Delete Delete
</a> </a>
</div> </div>

View File

@ -4,53 +4,52 @@
<button type="button" id="burger" class="burger-btn" {{action 'toggleBurgerMenu'}}>&equiv;</button> <button type="button" id="burger" class="burger-btn" {{action 'toggleBurgerMenu'}}>&equiv;</button>
</div> </div>
<ul id="navigation" {{bind-attr class=":navigation is-open"}}> <ul id="navigation" class="navigation {{is-open}}">
<li><a href="http://blog.travis-ci.com">Blog</a></li> <li><a href="http://blog.travis-ci.com">Blog</a></li>
{{!-- <li><a href="http://docs.travis-ci.com">Help</a></li> --}}
<li><a href="http://www.traviscistatus.com/">Status</a></li> <li><a href="http://www.traviscistatus.com/">Status</a></li>
{{#unless config.pro}}
<li class="navigation-sub navigation--community"> <li class="navigation-sub navigation--community">
<p class="handle navigation-handle"> <p class="handle navigation-handle">
<span>Help</span> <span>Help</span>
</p> </p>
<ul class="navigation-nested"> <ul class="navigation-nested">
<li><a href="http://docs.travis-ci.com">Docs</a></li> <li><a href="http://docs.travis-ci.com">Docs</a></li>
{{#unless config.pro}}
<li><a href="http://stackoverflow.com/questions/ask?tags=travis-ci">Ask a Question</a></li> <li><a href="http://stackoverflow.com/questions/ask?tags=travis-ci">Ask a Question</a></li>
<li><a href="http://docs.travis-ci.com/imprint.html" alt="Imprint">Imprint</a></li> <li><a href="http://docs.travis-ci.com/imprint.html" alt="Imprint">Imprint</a></li>
{{/unless}}
{{#if config.pro}}
<li><a href="https://chat.travis-ci.com/">Live Chat</a></li>
{{/if}}
</ul> </ul>
</li> </li>
{{/unless}}
{{#if config.pro}} {{#if config.pro}}
<li><a href="http://docs.travis-ci.com">Docs</a></li>
<li class="navigation-sub navigation--legal"> <li class="navigation-sub navigation--legal">
<p class="handle navigation-handle"> <p class="handle navigation-handle">
<span>Legal</span> <span>Legal</span>
</p> </p>
<ul class="navigation-nested"> <ul class="navigation-nested">
<li> <li>
<a {{bind-attr href="config.urls.imprint"}}>Imprint</a> <a href={{config.urls.imprint}}>Imprint</a>
</li> </li>
<li> <li>
<a {{bind-attr href="config.urls.security"}}>Security</a> <a href={{config.urls.security}}>Security</a>
</li> </li>
<li> <li>
<a {{bind-attr href="config.urls.terms"}}>Terms</a> <a href={{config.urls.terms}}>Terms</a>
</li> </li>
</ul> </ul>
</li> </li>
{{/if}} {{/if}}
<li {{bind-attr class="view.classProfile :navigation-sub"}}> <li class="{{view.classProfile}} navigation-sub">
<p class="handle navigation-handle"> <p class="handle navigation-handle">
{{#if auth.signedOut}} {{#if auth.signedOut}}
<button class="signed-out button--signin" {{action "signIn" target="auth"}}>Sign in with GitHub</button> <button class="signed-out button--signin" {{action "signIn" target="auth"}}>Sign in with GitHub</button>
{{/if}} {{/if}}
{{#if auth.signedIn}} {{#if auth.signedIn}}
{{#link-to "profile" class="signed-in"}}{{userName}}<img {{bind-attr src="gravatarUrl"}}/>{{/link-to}} {{#link-to "profile" class="signed-in"}}{{userName}}
<img src={{gravatarUrl}} />
{{/link-to}}
{{/if}} {{/if}}
{{#if auth.signingIn}} {{#if auth.signingIn}}
<button class="signing-in button--signingin">Signing In <span class="loading-indicator--white"><i></i><i></i><i></i></span></button> <button class="signing-in button--signingin">Signing In <span class="loading-indicator--white"><i></i><i></i><i></i></span></button>
@ -63,7 +62,7 @@
</li> </li>
{{#if config.billingEndpoint}} {{#if config.billingEndpoint}}
<li> <li>
<a {{bind-attr href="config.billingEndpoint"}}>Billing</a> <a href={{config.billingEndpoint}}>Billing</a>
</li> </li>
{{/if}} {{/if}}
<li> <li>

View File

@ -25,6 +25,7 @@ Auth = Ember.Object.extend
@store.unloadAll('user') @store.unloadAll('user')
@set('currentUser', null) @set('currentUser', null)
@sendToApp('afterSignOut') @sendToApp('afterSignOut')
Travis.trigger('user:signed_out')
signIn: (data) -> signIn: (data) ->
if data if data

View File

@ -3,6 +3,7 @@ languageConfigKeys = {
php: 'PHP' php: 'PHP'
node_js: 'Node.js' node_js: 'Node.js'
perl: 'Perl' perl: 'Perl'
perl6: 'Perl6'
python: 'Python' python: 'Python'
scala: 'Scala' scala: 'Scala'
ruby: 'Ruby' ruby: 'Ruby'

View File

@ -23,6 +23,24 @@ Log.Scroll.prototype = $.extend new Log.Listener,
$('#main').scrollTop(0) $('#main').scrollTop(0)
$('html, body').scrollTop(element.offset()?.top - (window.innerHeight / 3)) # weird, html works in chrome, body in firefox $('html, body').scrollTop(element.offset()?.top - (window.innerHeight / 3)) # weird, html works in chrome, body in firefox
Log.Limit = (max_lines, limitedLogCallback) ->
@max_lines = max_lines || 1000
@limitedLogCallback = limitedLogCallback || (->)
this
Log.Limit.prototype = Log.extend new Log.Listener,
count: 0,
insert: (log, node, pos) ->
if node.type == 'paragraph' && !node.hidden
@count += 1
if @limited
@limitedLogCallback()
return @count
Object.defineProperty Log.Limit.prototype, 'limited',
get: ->
@count >= @max_lines
View = BasicView.extend View = BasicView.extend
templateName: 'jobs/pre' templateName: 'jobs/pre'
currentUserBinding: 'controller.auth.currentUser' currentUserBinding: 'controller.auth.currentUser'
@ -66,7 +84,10 @@ View = BasicView.extend
console.log 'log view: create engine' if Log.DEBUG console.log 'log view: create engine' if Log.DEBUG
@scroll = new Log.Scroll beforeScroll: => @scroll = new Log.Scroll beforeScroll: =>
@unfoldHighlight() @unfoldHighlight()
@engine = Log.create(limit: Log.LIMIT, listeners: [@scroll]) @limit = new Log.Limit Log.LIMIT, =>
@set('limited', true)
@engine = Log.create(listeners: [@scroll, @limit])
@engine.limit = @limit
@logFolder = new LogFolder(@$().find('#log')) @logFolder = new LogFolder(@$().find('#log'))
@lineSelector = new LinesSelector(@$().find('#log'), @scroll, @logFolder) @lineSelector = new LinesSelector(@$().find('#log'), @scroll, @logFolder)
@observeParts() @observeParts()
@ -85,13 +106,8 @@ View = BasicView.extend
console.log 'log view: parts did change' if Log.DEBUG console.log 'log view: parts did change' if Log.DEBUG
for part, i in parts.slice(start, start + added) for part, i in parts.slice(start, start + added)
# console.log "limit in log view: #{@get('limited')}" # console.log "limit in log view: #{@get('limited')}"
break if @get('limited') break if @engine?.limit?.limited
@engine.set(part.number, part.content) @engine.set(part.number, part.content)
@propertyDidChange('limited')
limited: (->
@engine?.limit?.limited
).property()
plainTextLogUrl: (-> plainTextLogUrl: (->
if id = @get('log.job.id') if id = @get('log.job.id')

View File

@ -52,7 +52,7 @@ module.exports = function(environment) {
sshKey: true, sshKey: true,
caches: true caches: true
}; };
ENV.charmKey = 'gy5gx7dy6dh86hxzkz1wmtvupwvievu'; ENV.userlike = true;
ENV.urls = { ENV.urls = {
legal: ENV.billingEndpoint + "/pages/legal", legal: ENV.billingEndpoint + "/pages/legal",
imprint: ENV.billingEndpoint + "/pages/imprint", imprint: ENV.billingEndpoint + "/pages/imprint",

246
vendor/charmscout.js vendored
View File

@ -1,246 +0,0 @@
// Copyright (c) 2010-2012 Slash7 LLC http://charmhq.com/
// Copyright (c) 2010-2012 Thomas Fuchs http://mir.aculo.us/
// License: https://github.com/cheerful/charmeur/blob/master/MIT-LICENSE
window.bootstrapCharm = function(){
var tab, box, email, shown = false, sending = false, openmsg = null, callbacks = {},
BOX =
'<div class="feedback-popup">' +
'<h1>Have feedback or questions?</h1>' +
'<iframe id="CHARM_FORM_TARGET" name="CHARM_FORM_TARGET" src="javascript:void(0)" onload="__CHARM&&__CHARM.iFrameLoaded&&__CHARM.iFrameLoaded()" onerror="__CHARM&&__CHARM.iFrameError&&__CHARM.iFrameError()"></iframe>' +
'<form id="CHARM_FORM" target="CHARM_FORM_TARGET" method="POST" accept-charset="utf-8">'+
'<div id="CHARM_YOUR_EMAIL"></div>'+
'<div id="CHARM_YOUR_COMMENT"></div>'+
'<textarea id="CHARM_COMMENT" name="content" class="ignore-return-pressed" placeholder="Let us know and we will get right back to you by email"></textarea>' +
'<input id="CHARM_SUBMIT" type="submit" class="submit" value="Send Feedback">' +
'<a href="#" title="" id="CHARM_CANCEL">cancel</a>' +
'</form>' +
'</div>' +
'<div class="feedback-overlay"></div>',
DEFAULTS = {
text: '',
submit: 'Send feedback',
cancel: 'cancel',
your_email: 'Your email address:',
your_comment: 'Your message:',
feedback_sending: '<p>Sending...</p>',
feedback_sent: '<h1>Your feedback was sent!</h1><p>We will get back to you as soon as possible!</p>',
feedback_error: 'There was a problem sending your message.<br/>Please contact support directly.<br/><br/>close this message'
};
function log(s){
'console' in window && 'log' in console && console.log(s);
}
if(!("__CHARM" in window)) {
log('no CHARM data found');
return;
}
if(!(typeof __CHARM == 'object')) {
log('CHARM must be an object');
return;
}
function $(id){ return typeof id == 'string' ? document.getElementById(id) : id; }
function init(){
tab = document.createElement('a');
tab.id = "CHARM_TAB";
tab.className = 'feedback-button';
tab.innerHTML = 'Feedback & Support';
tab.href = "https://secure.charmhq.com/feedback/" + __CHARM.key;
tab.onclick = function(){ show(); return false };
document.body.appendChild(tab);
}
function template(string){
for(var prop in __CHARM)
string = string.replace(new RegExp('{'+prop+'}'), __CHARM[prop]);
return string;
}
function customize(id, property){
$('CHARM_'+id.toUpperCase())[property||'innerHTML'] = template((id in __CHARM) ? __CHARM[id] : DEFAULTS[id]);
}
function userdata(name){
if(name in __CHARM) data(name, __CHARM[name]);
}
function data(name, value){
var node = document.createElement('input');
node.type = 'hidden';
node.value = value;
node.name = name;
$('CHARM_FORM').appendChild(node);
}
__CHARM.iFrameLoaded = function(){
if(!sending) return; sending = false; success();
};
__CHARM.iFrameError = function(){
if(!sending) return; sending = false; error();
};
function show(options){
if(shown) return;
hideTab();
shown = true;
callbacks = options || {};
before();
if(!box) {
box = document.createElement('div');
box.id = "CHARM_BOX";
//box.className = 'feedback-popup';
box.innerHTML = BOX;
document.body.appendChild(box);
if(!('email' in __CHARM) || !(/@/.test(__CHARM.email+''))){
email = document.createElement('input');
email.id = 'CHARM_EMAIL';
email.type = 'text';
email.name = 'email';
email.value = '';
customize('your_email');
customize('your_comment');
$('CHARM_YOUR_EMAIL').appendChild(email);
box.className = 'feedback-popup closed' + ($('CHARM_YOUR_EMAIL') ? ' with-email' : '');
} else {
$('CHARM_YOUR_EMAIL').parentNode.removeChild($('CHARM_YOUR_EMAIL'));
$('CHARM_YOUR_COMMENT').parentNode.removeChild($('CHARM_YOUR_COMMENT'));
userdata('email');
}
// customize('text');
// customize('submit', 'value');
// customize('cancel');
userdata('key');
userdata('customer');
userdata('customer_info');
userdata('first_name');
userdata('last_name');
userdata('user_info');
userdata('customer_id');
userdata('subject');
data('location', location.href);
data('user_agent', navigator.userAgent);
data('local_time', (new Date).toString());
$('CHARM_FORM').action = __CHARM['url'];
setTimeout(function(){
var scrollTop = document.body.scrollTop;
box.className = 'open' + ($('CHARM_YOUR_EMAIL') ? ' with-email' : '');
$('CHARM_FORM').onsubmit = function(){
var ok = !($('CHARM_COMMENT').value.replace(/^\s+/, '').replace(/\s+$/, '') == "");
if(ok){
sending = true;
hide();
message('feedback_sending', false);
}
return ok;
};
$('CHARM_CANCEL').onclick = function(){ cancel(); return false };
setTimeout(function(){
if($('CHARM_EMAIL'))
$('CHARM_EMAIL').focus();
else
$('CHARM_COMMENT').focus();
document.body.scrollTop = scrollTop;
}, 10);
}, 10);
return;
}
box.offsetLeft;
box.className = 'open' + ($('CHARM_YOUR_EMAIL') ? ' with-email' : '');
if($('CHARM_EMAIL'))
$('CHARM_EMAIL').focus();
else
$('CHARM_COMMENT').focus();
}
__CHARM.show = show;
function cancel(){
hide();
showTab();
after();
}
function success(){
showTab();
message('feedback_sent');
if(__CHARM.success) __CHARM.success();
if(callbacks.success) callbacks.success();
after();
$('CHARM_COMMENT').value = "";
callbacks = {};
}
function error(){
show();
message('feedback_error', false);
if(__CHARM.error) __CHARM.error();
if(callbacks.error) callbacks.error();
after();
callbacks = {};
}
function message(id, autoclose){
if(openmsg) closeMessage(openmsg);
var msg = document.createElement('div');
msg.id = "CHARM_MESSAGE";
msg.innerHTML = template((id in __CHARM) ? __CHARM[id] : DEFAULTS[id]);
document.body.appendChild(msg);
msg.className = 'feedback-popup open';
msg.onclick = function(){ closeMessage(msg); };
if(autoclose === undefined || !autoclose === false)
setTimeout(function(){ closeMessage(msg); }, 4000);
openmsg = msg;
}
function closeMessage(msg){
msg.className = 'closed';
setTimeout(function(){
if(msg && msg.parentNode) msg.parentNode.removeChild(msg);
}, 260);
openmsg = null;
}
function hide(){
if(!shown) return;
shown = false;
box.className = 'closed' + ($('CHARM_YOUR_EMAIL') ? ' with-email' : '');
}
function hideTab(){
tab.classList.add('hidden');
}
function showTab(){
tab.classList.remove('hidden');
}
function after(){
if(__CHARM.after) __CHARM.after();
if(callbacks.after) callbacks.after();
callbacks = {};
}
function before(){
if(__CHARM.before) __CHARM.before();
if(callbacks.before) callbacks.before();
}
init();
};

View File

@ -50,6 +50,7 @@ if ENV['TRAVIS_ENTERPRISE']
end end
run Travis::Web::App.build( run Travis::Web::App.build(
userlike: ENV['USERLIKE'],
environment: ENV['RACK_ENV'] || 'development', environment: ENV['RACK_ENV'] || 'development',
api_endpoint: ENV['API_ENDPOINT'], api_endpoint: ENV['API_ENDPOINT'],
pages_endpoint: ENV['PAGES_ENDPOINT'], pages_endpoint: ENV['PAGES_ENDPOINT'],

View File

@ -200,6 +200,7 @@ class Travis::Web::App
config['charmKey'] = options[:charm_key] if options[:charm_key] config['charmKey'] = options[:charm_key] if options[:charm_key]
config['githubOrgsOauthAccessSettingsUrl'] = options[:github_orgs_oauth_access_settings_url] config['githubOrgsOauthAccessSettingsUrl'] = options[:github_orgs_oauth_access_settings_url]
config['ajaxPolling'] = true if options[:ajax_polling] config['ajaxPolling'] = true if options[:ajax_polling]
config['userlike'] = true if options[:userlike]
config['endpoints'] = { config['endpoints'] = {
'sshKey' => options[:ssh_key_enabled], 'sshKey' => options[:ssh_key_enabled],