Compare commits

..

295 Commits

Author SHA1 Message Date
Curtis Ekstrom
1f5eb7f525 Revert to old container lookup behavior
This fixes a bug that affected only pro
2016-04-15 05:58:52 +02:00
lislis
812bf1a4f5 update org landing page, fix gigantic number 2016-04-14 17:00:55 +02:00
Justine
b9688352f4 Merge pull request #497 from jtangelder/ansi-contrast
Improve contrast of the highlight ansi colors
2016-04-14 10:24:40 -04:00
Lisa
2701581c12 Merge pull request #499 from travis-ci/lp-updates
Multiple smaller updates
2016-04-14 16:24:05 +02:00
Lisa
1ff47c63c4 Merge pull request #494 from travis-ci/modify_broadcast_copy
Shorten broadcast copy
2016-04-14 16:15:25 +02:00
lislis
dbedf34be1 add title attrs to team flags 2016-04-14 16:04:27 +02:00
lislis
5733d14ae4 fix layout issue with last synced message 2016-04-14 15:44:59 +02:00
lislis
4cb225d578 hide 'signup account' message if on enterprise 2016-04-14 15:29:30 +02:00
lislis
249deb0eff remove case sensitive notice from getting started 2016-04-14 15:24:12 +02:00
Piotr Sarnacki
446a9bc9b1 Merge pull request #498 from travis-ci/remove_moment_deprecation
Remove moment deprecation on builds page
2016-04-14 14:21:42 +02:00
Curtis Ekstrom
ee4b26a7d7
Remove moment deprecation on builds page
See https://github.com/moment/moment/issues/1407 for more details. All that was needed was to manually instantiate a new Date() object
2016-04-14 13:22:15 +02:00
Piotr Sarnacki
7601173aaa Merge pull request #495 from travis-ci/remove_2.2_deprecations
Upgrade Ember to 2.4.5 and remove all application deprecations
2016-04-14 13:09:53 +02:00
Curtis Ekstrom
e74b29c313
Remove getOwner polyfill 2016-04-14 12:25:24 +02:00
Jorik Tangelder
eb7a746549 Improve contrast of the highlight ansi colors
The contrast of the green, red and yellow highlight colors was too low.
2016-04-14 11:54:36 +02:00
Curtis Ekstrom
d85469c98e
Bump Ember to 2.4.5 2016-04-14 09:44:50 +02:00
Curtis Ekstrom
fe8a5a13e1
Remove Ember 2.3 deprecation warnings 2016-04-14 09:38:59 +02:00
Curtis Ekstrom
f8d05dea78
Remove all remaining app deprecations 2016-04-13 18:06:28 +02:00
Curtis Ekstrom
dc34ab38e7
Install polyfill addon until upgraded to Ember 2.3 2016-04-13 18:06:28 +02:00
Curtis Ekstrom
5c3d905424
Remove unnecessary deprecation handlers
These deprecations are no longer being triggered by the application (as
far as I can tell).
2016-04-13 18:05:52 +02:00
Curtis Ekstrom
f00a899e74
Shorten broadcast copy
This shortens the broadcast copy and makes more sense grammatically
2016-04-13 16:03:19 +02:00
Piotr Sarnacki
1c49615a2d Merge pull request #488 from fauxton/ce_upgrade_ember_cli
Upgrade Ember-CLI to 2.4.3
2016-04-13 11:05:00 +02:00
Piotr Sarnacki
d6c4f1beea Merge pull request #489 from travis-ci/remove-sponsors
Remove unused images
2016-04-13 11:03:44 +02:00
Piotr Sarnacki
f459fed279 Merge pull request #492 from travis-ci/adding-igor-carmen-maren-buck
Remove Buck for now
2016-04-13 11:01:17 +02:00
Curtis Ekstrom
8de13d1949
Simplify testem logic and remove console logging 2016-04-12 23:04:08 +02:00
Buck Doyle
35f9d00a7d Remove Buck for now 2016-04-12 18:25:40 +02:00
Buck Doyle
17f200081a Merge pull request #491 from travis-ci/adding-igor-carmen-maren-buck
Adding Igor, Carmen, Maren, and Buck
2016-04-12 17:58:52 +02:00
Buck Doyle
a17556baf6 Remove mistakenly-added line 2016-04-12 17:41:11 +02:00
Buck Doyle
575d78e38d Auto-merged master into adding-igor-carmen-maren-buck on deployment. 2016-04-12 17:02:56 +02:00
Justine Arreche
d6d1b7c738 update bucks gif 2016-04-12 10:54:50 -04:00
Curtis Ekstrom
3fa2fcea93 Auto-merged master into remove-sponsors on deployment. 2016-04-12 16:30:06 +02:00
Buck Doyle
67104fc1f1 Merge pull request #490 from travis-ci/speed_up_production_builds
Exclude emoji images from fingerprinting to speed up production builds
2016-04-12 16:23:06 +02:00
Justine Arreche
ebb451d70c adding in Maren and Buck 2016-04-12 09:54:22 -04:00
Buck Doyle and Curtis Ekstrom
e14003eb53
Exclude emoji images from fingerprinting to speed up production builds 2016-04-12 15:32:15 +02:00
Buck Doyle and Curtis Ekstrom
bc8efb758f Remove unused images 2016-04-12 15:12:46 +02:00
Curtis Ekstrom
8cd14b8952
Upgrade Ember-CLI to 2.4.3
This upgrades several Ember-CLI related packages, but does not change
our Ember/Ember-Data versions (those will require code changes that are
best handled in separate commits).

In addition, Testem can now be dynamically configured, meaning we no longer need
custom scripts to run as part of CI to set dynamic launcher configuration values
based on PR status.
2016-04-12 10:25:44 +02:00
Justine Arreche
f62143217e created dual nationality flag for Igor 2016-04-11 13:38:41 -04:00
Justine Arreche
2c56238de0 Added Igor and Carmen to the team page 2016-04-11 12:59:55 -04:00
lislis
286b59c8ed update user numbers 2016-04-11 12:51:51 -04:00
Sven Fuchs
c5f3cc4873 Merge branch 'te-dev' 2016-04-08 14:42:11 +02:00
Sven Fuchs
36e1f9b30e camelize channelPrefix option 2016-04-08 14:41:22 +02:00
Lisa
7035b3f763 Merge pull request #486 from travis-ci/lp-remove-org-landing-bg
Update org landing page
2016-04-06 15:54:24 +02:00
lislis
862b14bad3 only remove gce notice 2016-04-06 15:15:20 +02:00
lislis
38e45810e9 update org landing 2016-04-06 14:11:16 +02:00
Lisa
bf636b05f2 Merge pull request #483 from mithun/master
fix image format for POD
2016-04-06 12:44:41 +02:00
Lisa
fa000b80c9 Merge pull request #484 from travis-ci/te-dev
pass through Env.pusher.channelPrefix for enterprise
2016-04-06 12:42:31 +02:00
lislis
ae57f3903e make permissions dependend on array.length 2016-04-06 12:38:20 +02:00
Sven Fuchs
6505a058d6 pass through Env.pusher.channelPrefix for enterprise 2016-04-05 18:09:41 +02:00
Lisa
e3efe7d7fc Merge pull request #482 from travis-ci/lp-remove-builds-from-org-landing
Remove builds from org landing
2016-04-05 14:25:47 +02:00
Mithun Ayachit
703cdbd598 fix image format for POD
Some POD parsers recognize only lowercase format names.

For e.g., pod2markdown fails to generate a markdown file with the status image if the format is 'HTML'
2016-04-05 06:31:17 -05:00
lislis
217618ea71 remove build polling logic from home route 2016-04-05 12:29:32 +02:00
lislis
919857dfad update styles for pro pages 2016-04-05 12:23:58 +02:00
lislis
c74fa87016 remove recent builds 2016-04-05 12:03:58 +02:00
lislis
1cfb9d37be fix broadcast display 2016-04-05 11:57:25 +02:00
Piotr Sarnacki
cbd0c46e37 Ensure that permission functions work without a user 2016-03-22 12:43:41 +01:00
lislis
e66efc1cbc check for currentUser in permissions 2016-03-22 12:42:20 +01:00
Lisa P
71c55779a1 import util, coment out dashboard acceptance 2016-03-22 12:41:52 +01:00
Lisa P
fa62539a40 add more tests 2016-03-22 12:41:34 +01:00
Lisa P
26ca2875ae make it a util 2016-03-22 12:41:28 +01:00
Lisa P
65cf81169b add permissions mixin to dashboard row 2016-03-22 12:41:14 +01:00
Lisa P
2220334265 put permissions into a mixin 2016-03-22 12:37:05 +01:00
Konstantin Haase
3618488151 Update team.js 2016-03-22 11:03:31 +01:00
Piotr Sarnacki
ae8092ddc0 Make JSHint happy 2016-03-21 14:02:18 +01:00
lislis
d9c7ada46d fix typo in component 2016-03-21 12:34:37 +01:00
Lisa
e1500d76a1 Merge pull request #479 from travis-ci/MdA_typo_fix
fix typo "annually"
2016-03-16 11:40:42 +01:00
María de Antón
a940e176e7 fix typo "annually"
Thanks to Lachlan who reported the typo
2016-03-16 09:58:56 +01:00
Lisa
381bdc98b5 Merge pull request #477 from travis-ci/ja-fixing-logos
Fixed the full color logo downloads and links
2016-03-14 18:15:04 +01:00
Lisa
2c1c1a000e Merge pull request #476 from travis-ci/lp-decrease
decrease border
2016-03-14 17:47:19 +01:00
Justine Arreche
935092c8d7 Fixed the full color logo downloads and links 2016-03-14 12:44:18 -04:00
Lisa P
fdd07e83b4 try border 2016-03-14 17:24:19 +01:00
Lisa
f482c8be36 Merge pull request #475 from travis-ci/ja-adding-ana-team
Adding Ana to the team page as well as Mexico's flag
2016-03-14 17:04:16 +01:00
Justine Arreche
b859386fda Adding Ana to the team page as well as Mexico's flag 2016-03-14 10:35:07 -04:00
Lisa
07d241bdc2 Merge pull request #474 from travis-ci/lp-fix-env-var
some UI fixes after the update
2016-03-14 13:22:53 +01:00
Lisa P
e35e01747a fix user avatar/ status icon spacing 2016-03-14 13:09:32 +01:00
Lisa P
8c374cde93 fix env var display 2016-03-14 12:38:31 +01:00
Piotr Sarnacki
8fb479c3e0 Turn off API V3 2016-03-09 17:02:38 +01:00
Lisa
c65a88a23a Merge pull request #471 from travis-ci/lp-db-rows
Dashboard styles and cleanup
2016-03-09 11:53:59 +01:00
Lisa P
521fb30b42 fix caches 2016-03-09 11:30:45 +01:00
Lisa P
38398588bb adjust flag icon and notice 2016-03-09 11:19:55 +01:00
Lisa P
79b456e511 dashboard row styles
start row layouting

work on dropup

rearrange markup, make tofu toggle

bäm

use placeholder instead of variable, doh

add border

replace all the icons

adjust icons sizes

use icon classes instead of svg

more icons adjustments

more icon tweaks on caches

update coloring mixins

fix stateMap, update db coloring mixin

cleanup owner page

even more icon fun

popup tweaks

tweak api icon

change to new broadcast icon

change icon path

responsive tweaks

dashboard filter

hack around Safari's not quite standard flexbox behaviour

update row labels and icon spacing

rearrange links in sidebar

make last builds a component, tweak svg stroke-width

more icon tweaks

fiddle around with svg view props

rearrange links in branch-row

tweak request icon

add integration test

more tweaks
2016-03-09 11:05:51 +01:00
Piotr Sarnacki
c6ec02429d Log user out only if necessary on failed user data request 2016-03-08 13:50:49 +01:00
Piotr Sarnacki
fa7c275eaa Clear timers in update-times service
It's mostly relevant in tests, because service is destroyed when test
end and then we don't want to run any timers.
2016-03-08 13:50:49 +01:00
Piotr Sarnacki
bfb1b69374 Merge pull request #473 from travis-ci/acceptance-tests
Acceptance tests
2016-03-07 14:35:19 +01:00
Piotr Sarnacki
5dc64c4937 Fix findRecord to work without passing a snapshot
We use adapter.findRecord to fetch repo by slug. Using it this way was
broken with one of the ember-data releases. This commit brings back the
old behaviour.
2016-03-07 13:32:49 +01:00
Piotr Sarnacki
ab0a2af471 Fix various small issues with test suite 2016-03-07 13:28:51 +01:00
Piotr Sarnacki
7292d6f53e Update ember-cli-mirage to newest beta 2016-03-07 13:28:46 +01:00
Lisa P
de26ed2091 fix error handling for log 2016-03-07 13:27:48 +01:00
Lisa P
0dc7e0e045 Add job page acceptance test 2016-03-07 13:27:47 +01:00
Piotr Sarnacki
725d3b00da Add ember-cli-mirage addon 2016-03-07 13:27:44 +01:00
Lisa
09637d5e07 Merge pull request #470 from travis-ci/lp-ui-fixes
UI fixes
2016-03-03 18:47:01 +01:00
Lisa
7ad66ac83e Merge pull request #468 from mkobit/fix/spelling-fix
Fix spelling errors for 'repository'
2016-03-03 18:16:55 +01:00
Lisa P
c31d87871b fix sync button label 2016-03-03 17:02:28 +01:00
Lisa P
adb8753b60 fix uppercase error for avatars 2016-03-03 16:41:14 +01:00
Piotr Sarnacki
a3ce77831d Make jshint happy 2016-03-03 11:58:17 +01:00
Piotr Sarnacki
57dec8f2fc Don't fetch /jobs when not in pro
We pass runningJobsCount to repos-list-tabs component, which essentially
is a binding and a binding will call the property that we're passing,
which in turn will fetch running and queued jobs. In order to avoid
this, I added guards in computed properties.
2016-03-03 11:25:01 +01:00
Mike Kobit
df325866f1 Fix spelling errors for 'repository' 2016-03-02 09:26:58 -06:00
Piotr Sarnacki
20b72e5f10 Merge pull request #467 from travis-ci/ps-pendo.io
Add pendo.io integration
2016-03-02 15:15:51 +01:00
Piotr Sarnacki
51f91c3748 Add pendo.io integration 2016-03-01 12:22:17 +01:00
Piotr Sarnacki
0f99defb25 Merge pull request #466 from fauxton/typo_fix
Fix mixin typo
2016-02-25 17:39:46 +01:00
Curtis Ekstrom
8211dd716a Fix mixin typo 2016-02-25 14:51:31 +01:00
Piotr Sarnacki
55005b1b13 Scroll page in beforeModel hook in scroll-mixin
The `activate` hook is not always called when the route is used,
specifically it will not be called when the model changes, but the
change happened within the same route (for example when switching from
/travis-ci/travis-web to /travis-ci/travis-core). `beforeModel` is
guaranteed to be called every time the model is changed, both when the
route is entered for the first time and on any subsequent calls.
2016-02-23 13:05:36 +01:00
Lisa P
4fc13503d5 Merge pull request #463 from travis-ci/lp-le-dash
Updating some UI elements
2016-02-22 11:35:49 +00:00
Lisa P
dad5950142 start fresh markup for prgs filter 2016-02-19 18:40:18 +01:00
Lisa P
101a0ec71f sync button on dashbaord 2016-02-19 18:40:16 +01:00
Lisa P
192ebce0c3 refactor all things dashbaord 2016-02-17 17:04:15 +01:00
Lisa P
77dcbacd5e Merge pull request #462 from jimhester/R-matrix
Add R language key for matrix column
2016-02-17 15:57:59 +00:00
Lisa P
3a211b8a73 Merge pull request #461 from fauxton/ember-cli-2.3
Upgrade to Ember-CLI 2.3.0
2016-02-17 15:53:39 +00:00
Lisa P
b0d1ac8463 Merge pull request #460 from fauxton/remove_binding_deprecations
Remove legacy binding deprecation warnings
2016-02-17 15:45:32 +00:00
Lisa P
a09ec1c264 Merge pull request #459 from travis-ci/lp-update-footer
update footer
2016-02-17 15:36:04 +00:00
Jim Hester
546a678712 Add R language key for matrix column 2016-02-17 10:22:53 -05:00
Lisa P
645daffd10 update footer
introduce grey as body color

special case footer on landing-pro
2016-02-17 15:20:00 +01:00
Curtis Ekstrom
e436dbaeac Upgrade package to remove deprecation warning 2016-02-17 06:18:54 +01:00
Curtis Ekstrom
0a5b7465d8 Remove legacy binding deprecation warnings
This removes the warnings and should clean up the test output (especially in CI) quite a bit.
2016-02-16 23:40:17 +01:00
Curtis Ekstrom
90dc71694e Upgrade to Ember-CLI 2.3.0
Note: There is a [known issue](https://github.com/mixonic/ember-cli-deprecation-workflow/issues/30) with a deprecation warning coming from
...wait for it... ember-cli-deprecation-workflow.

Otherwise, this simply bumps the necessary dependencies (suggested by
the new generators) and makes the project conform to the minimal changes
in import syntax.
2016-02-16 23:02:01 +01:00
Lisa P
9f636b986c Merge pull request #458 from fauxton/fix_sidebar_links
Remove click handler overriding default link behavior
2016-02-16 14:36:36 +00:00
Curtis Ekstrom
2ae61562ea Ensure scroll position reset
This adds a new mixin that allows us to opt in to scroll reset
behavior.
2016-02-16 14:10:12 +01:00
Curtis Ekstrom
c118153f2f Remove click handler overriding default link behavior
An [issue](https://github.com/travis-ci/travis-ci/issues/5181) was reported in
which the repository sidebar links were not functioning properly. I've
tracked it down to the fact that a click handler was registered and
automatically performing a redirect to the repo route.

This breaks CMD+Click behavior (as the click handler was still
called and navigating when the user did not expect it, as well as
navigated to a link that the user did not intend to visit.

This commit simply removes that click handler. I checked the previous
coffee version of the file to gain more context on why it was initially
added, but unfortunately, it was simply added when the original
component was created, so I'm not sure what its use was.
2016-02-15 23:40:09 +01:00
Lisa P
08bc13aedd fix layout issue on repos for not signed in users 2016-02-15 16:45:40 +01:00
Lisa P
f8ce0b494f Merge pull request #456 from travis-ci/ja-rexported-logos
Added in rexported logo assets and corrected /logos for file downloads
2016-02-12 15:54:51 +01:00
Justine
af4b85ab24 Merge pull request #457 from travis-ci/ha-doc-env-var-escaping
Add note for escaping bash special characters
2016-02-11 18:08:16 -05:00
Hiro Asari
d55147ee04 Add note for escaping bash special characters 2016-02-11 12:33:26 -10:00
Justine Arreche
be6bfda455 Added in rexported logo assets and corrected /logos for file downloads 2016-02-11 12:15:07 -05:00
Lisa P
ae1719b5f4 Merge pull request #452 from travis-ci/lp-cleanup
mulitiple smaller things
2016-02-11 16:19:50 +01:00
Lisa P
a343815476 revamp settings button to more options 2016-02-11 15:12:04 +01:00
Lisa P
7a6bb1cdd9 update status image popup 2016-02-11 14:44:36 +01:00
Lisa P
eda72b785c remove unused styles 2016-02-11 14:43:00 +01:00
Lisa P
92eec06b6e broadcast fix for safari 2016-02-11 14:38:59 +01:00
Piotr Sarnacki
707c77aeee Strengthen the dependencies on canCancel in build
For some reason it sometimes is not refreshed correctly without these
additional dependencies.
2016-02-11 13:54:07 +01:00
Piotr Sarnacki
20e8a47576 Fix logs displaying when a restart happens
When a user restarts a job, we should not try fetching the log again. In
order to do this I added a guard in job-log component, which checks if
attributes changed in didReceiveAttrs callback. If the old job value is
the same as the new value, we don't need to do anything.
2016-02-11 13:43:59 +01:00
Piotr Sarnacki
238969bc51 Merge pull request #455 from alicetragedy/lg-update-team
add twitter handle for laura in team page
2016-02-09 14:43:59 +01:00
alicetragedy
a27131015f add twitter handle for laura in team page 2016-02-09 10:53:21 +01:00
carlad
c65841e7ce Merge pull request #454 from travis-ci/ja-adding-laura
Added in Laura's picture, gif, information and countries..
2016-02-08 22:03:56 +01:00
Justine Arreche
24aa541616 Added in Laura's picture, gif, information and countries.. oh and I guess I also wanted to sneaky change my picture too 2016-02-08 15:25:53 -05:00
Piotr Sarnacki
1091385aab Merge pull request #447 from fauxton/remove_autoprefixer_deprecations
Remove autoprexifer deprecations
2016-02-08 11:43:37 +01:00
Piotr Sarnacki
a6e850ecea Merge pull request #448 from fauxton/remove_router_deprecations
Remove resource router deprecations
2016-02-08 11:43:31 +01:00
Piotr Sarnacki
9c9f161c26 Merge pull request #450 from fauxton/remove_append_deprecations
Remove append() test deprecations
2016-02-08 11:43:17 +01:00
Lisa P
c07709139c fix people pics on front page 2016-02-04 13:00:47 +01:00
Lisa P
4347c1efe4 Merge pull request #449 from travis-ci/enterprise-ui-fixes
Enterprise ui fixes
2016-02-04 12:29:57 +01:00
Curtis Ekstrom
9d429966d0 Remove append() test deprecations
Replacing with `render` to appease the test suite gods.
2016-02-04 00:06:47 +01:00
Lisa P
243bd4aed5 update according to comments 2016-02-02 15:22:03 +01:00
Lisa P
38be0fc90c enterprisify infrastructure notices 2016-02-02 12:32:04 +01:00
Lisa P
534714e7e9 hide syncing info on enterprise 2016-02-02 12:23:50 +01:00
Lisa P
21cbc96e77 bring back profile graphic 2016-02-02 12:23:49 +01:00
Lisa P
90408dfb47 hide some UI elements for enterprise 2016-02-02 12:23:49 +01:00
Piotr Sarnacki
1d0fb6468e Fix job times updating on build view 2016-02-02 11:45:59 +01:00
Piotr Sarnacki
8e610a6191 Show branches content even if there's no defaultBranch 2016-02-02 11:08:48 +01:00
Curtis Ekstrom
768963efc6 Remove resource router deprecations
The use of `resource` within the router is deprecated as of 2.0.0.
See notice [here](https://github.com/emberjs/ember.js/pull/11517).

This uses ember-watson to do the manual conversion, with small
aesthetic tweaks.
2016-02-01 16:29:12 +01:00
Curtis Ekstrom
1b00bc72a1 Remove autoprexifer deprecations
Upgading ember-cli-autoprefixer to 0.5.0 removes the deprecation
messages from the build output (these were targeted for removal
in 0.4.0).

There are no noticable side effects, but this version does package
the most recent version of postcss/autoprefixer. The release notes
for that version can be found
[here](https://github.com/postcss/autoprefixer/releases/tag/6.0.0).
2016-02-01 16:11:42 +01:00
Piotr Sarnacki
4443dc9ddd Merge pull request #435 from jasonkarns/patch-1
Leverage <time> element
2016-02-01 16:00:36 +01:00
Jason Karns
788bcfa0d4 more time markup 2016-02-01 09:44:04 -05:00
Jason Karns
b481946000 Leverage <time> element
Sample of using the `time` element instead of `abbr` for displaying timestamps.

The `time` element can also represent durations. So the sample used here is suboptimal. Rather than the duration time lising the `lastBuildStartedAt` time in the `datetime` attribute, it ought to be a [valid `duration` value](https://www.w3.org/html/wg/drafts/html/master/infrastructure.html#valid-duration-string). However, I didn't see any existing helpers for formatting according to a machine-readable duration value.
2016-02-01 09:38:17 -05:00
Piotr Sarnacki
3fef8fdd0e Merge pull request #446 from travis-ci/lp-remove-codeclimate
remove code climate
2016-02-01 13:20:13 +01:00
Lisa P
1c4f748b2e fix tests, refactor repo-actions component 2016-02-01 13:09:16 +01:00
Lisa P
cd7ab9b719 remove code climate
remove code climate popup function
2016-02-01 13:09:15 +01:00
Piotr Sarnacki
ac4f5ed193 Merge pull request #445 from travis-ci/update-finished-at-for-finished-builds
Update time also for finished builds, but only every minute
2016-02-01 11:58:44 +01:00
Piotr Sarnacki
84e207641e Merge pull request #443 from fauxton/remove_component_test_deprecations
Remove component test deprecations by specifying test type
2016-02-01 10:38:01 +01:00
Piotr Sarnacki
620632500b Merge pull request #444 from fauxton/remove_initializer_deprecations
Remove initializer deprecation warnings
2016-02-01 10:37:30 +01:00
Curtis Ekstrom
92896aa8e1 Remove initializer deprecation warnings
The previous initializer API was deprecated in Ember 2.1 (See
http://emberjs.com/deprecations/v2.x/), so this updates the initializer
signatures to accomodate that change.
Also, remove the registered deprecation from the workflow.
2016-01-31 12:30:27 +01:00
Curtis Ekstrom
58955469c6 Remove component test deprecations by specifying test type 2016-01-31 12:04:44 +01:00
Piotr Sarnacki
4b9d9fda1e Remove unneeded class 2016-01-29 16:47:40 +01:00
Piotr Sarnacki
6deae83a1b Only hide #log element, so it's always in the DOM
When a job is not started, we will show a message that the log can't be
shown. If a pusher message with a state change comes after the first log
pusher message, travis-web-log will error out, because in such a
situation a DOM element wouldn't be available. To make it always work,
this commit changes the behaviour to just hide #log element with CSS
instead of using {{#if}}.
2016-01-29 16:32:51 +01:00
Piotr Sarnacki
7764479c14 Schedule inserting elements afterRender
It will ensure that log element is already loaded.
2016-01-29 14:31:16 +01:00
Piotr Sarnacki
24465e634f Use el.innerHTML = ''; instead of $(el).empty()
innerHTML is faster than empty(), especially on some versions of
firefox. This change was already commited before, but it was somehow
lost while converting project to JS.
2016-01-29 14:31:16 +01:00
Justine
b1aead7577 Merge pull request #442 from travis-ci/lp-fadeout
fade out long commit messages
2016-01-28 09:27:27 -05:00
Lisa P
41884ff9d2 fade out long commit messages 2016-01-27 16:41:20 +01:00
Piotr Sarnacki
6639a29411 Merge pull request #437 from travis-ci/lp-avatar
make a user-avatar component
2016-01-27 13:13:19 +01:00
Lisa P
22c938489e make gravatar depend on email 2016-01-27 13:01:18 +01:00
Piotr Sarnacki
c0df9d03e1 Revert "Update travis-web-log"
I need to work more on the problem that this commit tried to resolve

This reverts commit 84660db9d2.
2016-01-27 12:42:50 +01:00
Piotr Sarnacki
84660db9d2 Update travis-web-log 2016-01-27 12:38:30 +01:00
Piotr Sarnacki
9a9d3805d8 Bring back noop function which was accidentally destroyed 2016-01-27 12:32:53 +01:00
carlad
f6d6e9150a Merge pull request #441 from travis-ci/cd-update-precise-text
remove "Legacy" from "Precise builds" in log-content message
2016-01-27 10:09:03 +01:00
Lisa P
5d74d57ac6 add avatarUrl propertuy to user model 2016-01-26 18:40:07 +01:00
carlad
4f394ad72e remove Legacy from Precise builds text 2016-01-26 18:29:31 +01:00
Lisa P
d82ff49359 change component implementation 2016-01-26 14:50:58 +01:00
Lisa P
9cff29ce80 fix href on caches 2016-01-26 12:25:43 +01:00
Lisa P
0570a86035 add empty href to caches-item otherwise iOS does not fire tab event 2016-01-25 18:29:32 +01:00
Piotr Sarnacki
e919906f99 Update time also for finished builds, but only every minute 2016-01-25 17:55:48 +01:00
Lisa P
2882c8ca96 add empty href otherwise iOS does not fire a tap event correctly 2016-01-25 15:25:33 +01:00
Piotr Sarnacki
069f7ddbeb Fix displaying no-builds and not-active errors
This commit unifies the behaviour of displaying no-builds and not-active
errors for repo and fixes the error when user can't access repo settings
when the project is not active.
2016-01-21 16:35:36 +01:00
Lisa P
add716945f Merge pull request #436 from jasonkarns/patch-2
Fix grammatical error for finished job duration
2016-01-21 14:05:50 +01:00
Piotr Sarnacki
5c0697ed85 Always authenticate ajax calls
Our mechanism for blacklisting IPs, which was developed as a protection
against a DDoS attach, sometimes classifies IPs as offenders
incorrectly. In order to temporary improve the situation of 403
responses from API we're now going to authenticate all of the ajax
calls, because authenticated calls are not blacklisted that easily.
2016-01-21 14:00:41 +01:00
Piotr Sarnacki
7cfa83deb8 Merge pull request #439 from travis-ci/lp-ie-restart
don't send data body if it is empty
2016-01-21 13:56:30 +01:00
Lisa P
35961e3c63 Merge pull request #438 from travis-ci/lp-fix-title-on-owner
fix title tag when owner had no name set
2016-01-21 13:47:43 +01:00
Lisa P
3e7a8b694e fix title tag when owner had no name set 2016-01-21 13:39:02 +01:00
Lisa P
1fc82577b1 dont send data body if it is empty 2016-01-21 13:04:05 +01:00
Lisa P
05b85eb37f make a user-avatar component
delete some, add some, fix some tests
2016-01-21 12:08:28 +01:00
Piotr Sarnacki
6efb2ac449 No need to load builds into repo.builds
Builds on repo model already incorporate all of the builds that belong
to a given repo and are loaded into a store, so no need to load them to
expandable array.
2016-01-18 13:18:19 +01:00
Piotr Sarnacki
2d0aee4e68 Fix status images popup
After recent refactorings status images popup started to fetch branches
info whenever a repo page was opened, resulting in additional HTTP
requests. Furthermore, because of a way we load branches, it could
result in builds view displaying very old builds, because in API V2 we
essentially download last build for each branch for branches request.

This commit fixes the situation in 2 ways:

1. We wait with downloading branhes till the popup is open
2. We use a V3 requests to download branches and we don't put that data
into the store
2016-01-18 13:14:28 +01:00
Piotr Sarnacki
b0df09fb22 Fix displaying no-builds message with an index view 2016-01-15 15:43:29 +01:00
Piotr Sarnacki
4bbf114e82 Check also for value in attrs for job-log 2016-01-15 15:15:59 +01:00
Piotr Sarnacki
e1a2f42030 Properly set pusher path in config 2016-01-15 12:36:45 +01:00
Piotr Sarnacki
5ddbde82f1 Upgrade Ember.js to 2.2.1 2016-01-14 23:17:21 +01:00
Jason Karns
a7e2099829 Fix grammatical error for finished job duration
While a job is running, on the job status view, the duration is labeled: "Running for x sec". When the job finishes, 'Running' is swapped for 'Total time'. But "Total time for x sec" doesn't make any sense. the " for" should be part of the conditional with "Running"
2016-01-14 14:03:41 -05:00
Piotr Sarnacki
c70ed06848 Fix sorting on builds list 2016-01-14 15:40:06 +01:00
Piotr Sarnacki
557797ab19 Fix show more button for builds
While doing search and replace I accidentally replaced too much
occurences of 'builds'
2016-01-14 14:10:20 +01:00
Piotr Sarnacki
0a872e25a7 Fix showing running jobs
When I changed tabs-list-view to be a component I missed the fact that
config is not registered for components, which resulted in not showing
the running jobs tab at all. This commit fixes the situation.
2016-01-14 14:04:29 +01:00
Piotr Sarnacki
8eaee33d6d Merge pull request #433 from travis-ci/update-ember
Update Ember.js to 2.2.0 and Ember Data to 2.3.0
2016-01-14 13:22:32 +01:00
Piotr Sarnacki
660752ec78 Fix build header for job with PR data 2016-01-14 13:21:57 +01:00
Piotr Sarnacki
93deb7f4e2 Fix tests 2016-01-14 13:14:45 +01:00
Piotr Sarnacki
f9dde74f59 Add deprecations from Ember.js 2.x to deprecation workflow 2016-01-14 12:16:32 +01:00
Piotr Sarnacki
0c15a09d54 Update Ember Data to 2.3.0 2016-01-14 11:54:47 +01:00
Piotr Sarnacki
ed71aa133e Update Ember.js to 2.2.0 2016-01-14 11:54:26 +01:00
Piotr Sarnacki
efaae492c4 Run GA instructions only if gaCode is set 2016-01-14 11:38:46 +01:00
Piotr Sarnacki
c96a4602cd Merge pull request #432 from travis-ci/ps-remove-deprecations
Remove deprecations in preparation for 2.x update
2016-01-14 11:37:41 +01:00
Piotr Sarnacki
99b7ce4a9d Add missing semicolon 2016-01-14 11:28:25 +01:00
Lisa P
c694ab24f6 remove broadcast animation because 💥 CPU 2016-01-13 18:19:56 +01:00
Lisa P
76749e2250 fix signin loop 2016-01-13 15:29:44 +01:00
Piotr Sarnacki
9a7508e25d Merge pull request #434 from travis-ci/lp-signin-route
add explicit signin route
2016-01-13 15:10:14 +01:00
Lisa P
5163e5129b pin jquery version 2016-01-13 14:49:04 +01:00
Lisa P
a63188ae13 add explicit signin route 2016-01-13 14:28:22 +01:00
Piotr Sarnacki
34ca0cc386 Use transitionToRoute instead of transitionTo in controllers 2016-01-13 12:00:35 +01:00
Piotr Sarnacki
fb1b820837 [deprecations] Remove all of the views from the app 2016-01-13 11:26:30 +01:00
Piotr Sarnacki
ee5f842d51 Fix adding ssh key 2016-01-13 11:25:45 +01:00
Piotr Sarnacki
271b8f89ea Fix show more button and simplify builds controller 2016-01-13 11:25:41 +01:00
Piotr Sarnacki
13d2eba016 [deprecations] Remove the need to use beforeObserver in job-log component 2016-01-12 18:27:24 +01:00
Piotr Sarnacki
21f25cd2bf [deprecations] Remove all of the views from the app 2016-01-12 16:55:22 +01:00
Piotr Sarnacki
c3ef9ac5d9 [deprecations] Remove all of the views we use just for layouts 2016-01-12 16:55:22 +01:00
Piotr Sarnacki
becde631d5 [deprecations] Use ember-data-filter plugin
At some point we may try to refactor places where we use store.filter(),
but at the moment it would result with an overly complicated code, so
I'd prefer to use a plugin.
2016-01-12 16:55:22 +01:00
Piotr Sarnacki
1c33475ff6 [deprecations] Don't use snapshot.get() 2016-01-12 16:55:22 +01:00
Piotr Sarnacki
dcac5d4150 Merge pull request #429 from travis-ci/lp-deprecations
remove deprecations
2016-01-12 16:54:52 +01:00
Lisa P
ea79bb1625 Merge pull request #430 from travis-ci/lp-branch-tiles
show build number on hover in branch tiles #yolo
2016-01-12 15:20:34 +01:00
Lisa P
bd7e4a001d fix wobbling building icon 2016-01-12 13:25:57 +01:00
Lisa P
e3b77b4b5a fix yellows across the place 2016-01-12 13:10:15 +01:00
Lisa P
6eed891a1a show build number on hover in branch tiles 2016-01-12 13:10:15 +01:00
Piotr Sarnacki
bbf0b7459f Allow to set an alternative endpoint for auth 2016-01-11 14:26:26 +01:00
Piotr Sarnacki
cebaa0e8d1 Merge pull request #431 from jacques/jacques/fix-readme-team-file
Fix file location for app/routes/team.{coffee,js} in README.md
2016-01-11 12:21:57 +01:00
Jacques Marneweck
982d13e897 Fix file location for app/routes/team.{coffee,js} in README.md 2016-01-11 09:37:54 +02:00
Lisa P
b8f8071f98 add image descriptions 2016-01-07 14:33:34 +01:00
Lisa P
253a56f47d not use view in accounts 2016-01-07 14:22:39 +01:00
Piotr Sarnacki
f9df4b1896 [deprecations] Don't use before observer 2016-01-07 13:15:59 +01:00
Piotr Sarnacki
85b2837c52 [deprecations] Disable fetching records in the background by Ember Data 2016-01-07 11:28:52 +01:00
Piotr Sarnacki
39cf0b3044 [deprecations] Don't use ArrayController 2016-01-07 11:22:40 +01:00
Piotr Sarnacki
4b71704b1c [deprecations] Don't use second argument in a property
This makes Ember.js think that we're trying to use the property as
setter and it's deprecated
2016-01-07 11:18:05 +01:00
Piotr Sarnacki
e7ca2c8bfe [deprecations] Use Store#unloadRecord instaed of Store#dematerializeRecord 2016-01-07 11:18:05 +01:00
Piotr Sarnacki
a920ae9cd7 [deprecations] Use modelName instead of typeKey 2016-01-07 11:18:05 +01:00
Piotr Sarnacki
4e3a755908 [deprecations] Use Adapter#findRecord instead of Adapter#find 2016-01-07 11:18:05 +01:00
Piotr Sarnacki
a6087d4fcd [deprecations] Use Component#_state instead of Component#state 2016-01-07 11:18:00 +01:00
Piotr Sarnacki
131a09c9c5 [deprecations] Use store.query instead of store.find where appropriate 2016-01-07 10:41:08 +01:00
Piotr Sarnacki
f5823669b2 [deprecations] Use regular computed property instead of arrayComputed 2016-01-07 10:40:17 +01:00
Piotr Sarnacki
03332a8654 [deprecations] Don't run Ember.set directly in didInsertElement 2016-01-07 10:40:14 +01:00
Piotr Sarnacki
16da227dd9 [deprecations] Use LinkComponent instead of LinkView 2016-01-07 10:35:55 +01:00
Piotr Sarnacki
bde3b7375a Fix displaying flashes coming from the server 2016-01-07 10:22:18 +01:00
Piotr Sarnacki
7649c180dd Fix cancel and restart buttons
Callback functions for restart and cancel where improperly updated while
switching from coffeescript to javascript.
2016-01-07 10:19:29 +01:00
Lisa P
561e671e0d be more explicit about github icon size 2016-01-06 16:26:49 +01:00
Justine
0606aff5b8 Merge pull request #428 from travis-ci/rkh-switzerland
moved to switzerland
2016-01-06 10:11:48 -05:00
Konstantin Haase
e6520ff7cc rkh moved to switzerland 2016-01-06 14:30:29 +01:00
Piotr Sarnacki
959da82d91 Add config/deprecation-workflow.js
This config file is used by ember-cli-deprecation-workflow addon, which
allows to tackle deprecations one at a time by setting the strategy for
each deprecation.
2016-01-06 12:28:56 +01:00
Piotr Sarnacki
0b8c032c21 Make JSHint happy 2016-01-06 12:14:02 +01:00
Piotr Sarnacki
ac7c92d0c4 Bring back DurationCalculations mixin to Build 2016-01-06 12:09:03 +01:00
Piotr Sarnacki
f349321024 Move SSL instructions to README 2016-01-06 12:02:09 +01:00
Piotr Sarnacki
040932d676 Remove ember-cli-coffeescript 2016-01-06 11:34:16 +01:00
Piotr Sarnacki
b57adacf02 Fix displaying synced at time on the profile page 2016-01-06 11:32:17 +01:00
Piotr Sarnacki
6ee82c0cf8 Merge pull request #426 from travis-ci/lp-whitelist-info
add link to docs on requests if branch is gh-pages
2016-01-06 11:26:09 +01:00
Lisa P
5bf4e4ffe4 make isGHPages a proper property 2016-01-05 15:01:38 +01:00
Piotr Sarnacki
f4aa705b51 Merge pull request #427 from travis-ci/fix-displaying-last-synced-at
Fix displaying synced at time on the profile page
2016-01-05 14:57:37 +01:00
Piotr Sarnacki
341296aaaa Merge pull request #418 from travis-ci/lp-mobile-log
Mobile log
2016-01-05 14:55:52 +01:00
Piotr Sarnacki
01bcfb8a8c Merge pull request #424 from travis-ci/lp-accessible-jobslist
add aria-labels to jobs-item
2016-01-05 14:51:21 +01:00
Piotr Sarnacki
493bf72605 Merge pull request #425 from travis-ci/lp-bring-back-branch
bring back branch name
2016-01-05 14:50:28 +01:00
Lisa P
1233eba3e8 fix log 2016-01-05 14:44:27 +01:00
Lisa P
8d2ca774d0 fix template logic if job has not yet started 2016-01-05 14:20:23 +01:00
Lisa P
f445690fb5 refactor a lot of buttons so toggle log looks more consistent 2016-01-05 14:20:23 +01:00
Lisa P
10b0c62fc2 make log toggle on mobile 2016-01-05 14:15:25 +01:00
Lisa P
8e2b3a86c6 feature flag Build 2016-01-05 13:57:14 +01:00
Lisa P
5a0618b22e bring back branch name 2016-01-05 13:35:29 +01:00
Lisa P
4edd1feaad remove coffee file 2016-01-05 13:25:48 +01:00
Lisa P
f5211f1fdc add aria-labels to jobs-item 2016-01-05 12:56:26 +01:00
Lisa P
dbd124852d remove coffee file 2016-01-05 12:44:08 +01:00
Lisa P
7aa77b4f6f add link to docs on requests if branch is gh-pages 2016-01-05 12:43:09 +01:00
Piotr Sarnacki
00d448c231 Fix displaying synced at time on the profile page 2016-01-05 12:31:12 +01:00
Piotr Sarnacki
0813d8cd45 Merge pull request #422 from travis-ci/ps-convert-to-js
Convert project to JavaScript
2016-01-05 09:36:36 +01:00
Piotr Sarnacki
d8160614bf Fix tests 2016-01-04 13:19:48 +01:00
Piotr Sarnacki
737685a7c0 Fix ajax callbacks after javascript conversion 2016-01-04 13:15:15 +01:00
Piotr Sarnacki
ece4141cc5 Remove annotations relationship on job 2016-01-04 13:15:15 +01:00
Piotr Sarnacki
e60b0a0224 Fix jshint errors after conversion to JS 2016-01-04 13:15:15 +01:00
Piotr Sarnacki
fafaf65043 Convert project to JavaScript 2016-01-04 13:15:14 +01:00
Piotr Sarnacki
09e4f52dac Merge branch 'thriqon-bug-author-committer' 2016-01-04 12:19:32 +01:00
Jonas Weber
e27a19101d Drop unneeded imports for gravatarImage 2016-01-04 12:19:14 +01:00
Jonas Weber
ab54733723 Show author name and author avatar on builds list 2016-01-04 12:18:33 +01:00
Jonas Weber
9e94643dc4 Calculate actual avatar URL in model
repeated logic for Gravatar fallback
2016-01-04 12:18:01 +01:00
Piotr Sarnacki
4e720519fe Revert "Merge branch 'thriqon-bug-author-committer'"
This reverts commit ac576077ab, reversing
changes made to f9263fc8f3.
2016-01-04 12:14:44 +01:00
Piotr Sarnacki
e5763ee2d6 Revert "Fix tests"
This reverts commit ca3a24e686.
2016-01-04 12:14:40 +01:00
Piotr Sarnacki
ca3a24e686 Fix tests 2016-01-04 12:04:17 +01:00
Piotr Sarnacki
ac576077ab Merge branch 'thriqon-bug-author-committer' 2016-01-04 11:54:47 +01:00
Jonas Weber
b68ae942a6 Drop unneeded imports for gravatarImage 2016-01-04 11:54:18 +01:00
Jonas Weber
83bb882475 Show author name and author avatar on builds list 2016-01-04 11:53:20 +01:00
Jonas Weber
8abc24f04b Calculate actual avatar URL in model
repeated logic for Gravatar fallback
2016-01-04 11:50:10 +01:00
Piotr Sarnacki
573ebfd406 Fix status image popup
While fixing deprecations a `propertyBinding="foo"` calls were changed
into `property="foo"` calls, which should be `property=foo`. Otherwise
`foo` is treated as a string.
2016-01-04 11:41:50 +01:00
Piotr Sarnacki
ae704df6bf Use el.innerHTML = ''; instead of $(el).empty()
It turns out that jQuery's empty method can be really slow in Firefox,
which can freeze the browser when cleaning the log.
2016-01-04 11:41:50 +01:00
Piotr Sarnacki
f6b95a9a9a Convert log-content component to js 2016-01-04 11:41:50 +01:00
Piotr Sarnacki
7f74787b91 Properly normalize array repsonse for V2 jobs 2016-01-04 11:41:50 +01:00
Piotr Sarnacki
f01b95f886 Convert job serializer to js 2016-01-04 11:41:50 +01:00
Lisa P
8cf9be6adc refactor some of the icon styles an usages 2016-01-04 11:41:50 +01:00
Lisa P
a751145fef use base64 backgroung svg 2016-01-04 11:41:50 +01:00
Piotr Sarnacki
f9263fc8f3 Fix status image popup
While fixing deprecations a `propertyBinding="foo"` calls were changed
into `property="foo"` calls, which should be `property=foo`. Otherwise
`foo` is treated as a string.
2015-12-30 23:26:25 +01:00
Piotr Sarnacki
21285bbe8b Use el.innerHTML = ''; instead of $(el).empty()
It turns out that jQuery's empty method can be really slow in Firefox,
which can freeze the browser when cleaning the log.
2015-12-30 10:36:18 +01:00
Piotr Sarnacki
6e73923fbb Convert log-content component to js 2015-12-30 10:36:08 +01:00
952 changed files with 17580 additions and 21452 deletions

View File

@ -1,10 +1,19 @@
{
"predef": [
"server",
"document",
"window",
"-Promise",
"jQuery",
"Visibility"
"Visibility",
"$",
"Travis",
"_cio",
"_gaq",
"Log",
"moment",
"Pusher",
"md5"
],
"browser": true,
"boss": true,

View File

@ -18,14 +18,8 @@ matrix:
addons:
sauce_connect: true
apt:
sources:
- google-chrome
packages:
- google-chrome-stable
sudo: required
dist: trusty
sudo: false
cache:
branch: md5deep
@ -35,17 +29,16 @@ cache:
before_install:
- "npm config set spin false"
- "npm install -g npm@^2"
- "export DISPLAY=:99.0"
- "sh -e /etc/init.d/xvfb start"
- mkdir travis-phantomjs
- wget https://s3.amazonaws.com/travis-phantomjs/phantomjs-2.0.0-ubuntu-12.04.tar.bz2 -O $PWD/travis-phantomjs/phantomjs-2.0.0-ubuntu-12.04.tar.bz2
- tar -xvf $PWD/travis-phantomjs/phantomjs-2.0.0-ubuntu-12.04.tar.bz2 -C $PWD/travis-phantomjs
- export PATH=$PWD/travis-phantomjs:$PATH
install:
- npm install -g bower
- npm install
- bower install
before_script:
- ruby ci/prepare_testem.rb
script:
- ember try $EMBER_VERSION

View File

@ -65,3 +65,6 @@ DEPENDENCIES
sinatra
sinatra-contrib
travis-web!
BUNDLED WITH
1.10.1

View File

@ -18,6 +18,37 @@ And open http://localhost:4200 in the browser.
Alternatively you can run `ember build --watch` and start the server with `waiter/script/server`
### Running the app in private repos mode
At the moment Travis CI is available as two separate sites - https://travis-ci.org for Open Source
projects and https://travis-ci.com for private projects. travis-web will connect
to the Open Source version by default. In order to connect it to the API for private projects
you need to run:
```
TRAVIS_PRO=true ember serve --ssl --ssl-key=ssl/server.key --ssl-cert=ssl/server.crt
```
One caveat here is that the command will start server with SSL, so the page will
be accessible at https://localhost:4200 (note `https` part).
### Running on SSL in general
Sometimes there is a need to test the app with an SSL connection. This is required
to make Pusher work when running Travis CI Pro, but it may also be needed in other
situations.
There's already an SSL certificate in the `ssl` directory, which is set for `localhost`
host. If you want to use it, you can start the server with:
```
ember serve --ssl --ssl-key=ssl/server.key --ssl-cert=ssl/server.crt
```
In case you want your own certificate, you can follow the instructions posted
here: https://gist.github.com/trcarden/3295935 and then point the server to your
certificate with `--ssl-key` and `--ssl-cert`.
### Running tests
To run a test suite execute:
@ -31,7 +62,7 @@ You can also start an interactive test runner for easier development:
### Updating the team page
The team information can be found in `app/routes/team.coffee`.
The team information can be found in `app/routes/team.js`.
To add another member just add the info in the same style as the previous ones. Like so
{
@ -43,5 +74,5 @@ To add another member just add the info in the same style as the previous ones.
image: 'mrt'
}
The order of value pairs does not matter, the quotationmarks do. Name and title will be displayed as they are. The handle will be used to generate a link to Twitter and displayed with a '@' in front of it. Nationality and country determine the flags. Please use the name of the country and not the adjective (like 'germany' and NOT 'german'). Image is the identifier to find the right image and animated gif. 'mrt' in the example will result in `team-mrt.png` and `mrt-animated.gif`.
Add the images themselves to `public/images/team/` and additional flags to `public/images/pro-landing/`. Mind the naming conventions already in place.
The order of value pairs does not matter, the quotationmarks do. Name and title will be displayed as they are. The handle will be used to generate a link to Twitter and displayed with a '@' in front of it. Nationality and country determine the flags. Please use the name of the country and not the adjective (like 'germany' and NOT 'german'). Image is the identifier to find the right image and animated gif. 'mrt' in the example will result in `team-mrt.png` and `mrt-animated.gif`.
Add the images themselves to `public/images/team/` and additional flags to `public/images/pro-landing/`. Mind the naming conventions already in place.

View File

@ -1,9 +0,0 @@
Sometimes there is a need to test the app with an SSL connection, for example for
testing pusher on Travis CI Pro.
In order to run the app with SSL enabled you need to:
* generate self signed certificate as described here: https://gist.github.com/trcarden/3295935
* one difference is that you need to use localhost.ssl, because travis-api
doesn't whitelist localhost.ssl at the moment
* run Ember app with ssl options: `TRAVIS_PRO=true ember serve --ssl --ssl-key=ssl/server.key --ssl-cert=ssl/server.crt`

View File

@ -1,30 +0,0 @@
`import DS from 'ember-data'`
`import config from 'travis/config/environment'`
Adapter = DS.ActiveModelAdapter.extend
auth: Ember.inject.service()
host: config.apiEndpoint
coalesceFindRequests: true
ajaxOptions: (url, type, options) ->
hash = @_super(url, type, options)
hash.headers ||= {}
hash.headers['accept'] = 'application/json; version=2'
if token = @get('auth').token()
hash.headers['Authorization'] ||= "token #{token}"
hash
findMany: (store, type, ids) ->
@ajax(@buildURL(type.modelName), 'GET', data: { ids: ids })
handleResponse: (status, headers, payload) ->
if status > 299
console.log "[ERROR] API responded with an error (#{status}): #{JSON.stringify(payload)}"
return @_super.apply(this, arguments)
`export default Adapter`

View File

@ -0,0 +1,57 @@
import config from 'travis/config/environment';
import Ember from 'ember';
import ActiveModelAdapter from 'active-model-adapter';
export default ActiveModelAdapter.extend({
auth: Ember.inject.service(),
host: config.apiEndpoint,
coalesceFindRequests: true,
// Before Ember Data 2.0 the default behaviour of running `findAll` was to get
// new records only when there're no records in the store. This will change
// to a different strategy in 2.0: when you run `findAll` it will not get any
// new data initially, but it will try loading new data in the background.
//
// I'm disabling the new behaviour for now.
shouldBackgroundReloadRecord() {
return false;
},
ajaxOptions(url, type, options) {
var base, hash, token;
hash = this._super(...arguments);
hash.headers = hash.headers || {};
hash.headers['accept'] = 'application/json; version=2';
if (token = this.get('auth').token()) {
if(!hash.headers['Authorization']) {
hash.headers['Authorization'] = "token " + token;
}
}
return hash;
},
findMany(store, type, ids) {
return this.ajax(this.buildURL(type.modelName), 'GET', {
data: {
ids: ids
}
});
},
handleResponse(status, headers, payload) {
if (status > 299) {
console.log("[ERROR] API responded with an error (" + status + "): " + (JSON.stringify(payload)));
}
return this._super(...arguments);
},
// this can be removed once this PR is merged and live:
// https://github.com/emberjs/data/pull/4204
findRecord(store, type, id, snapshot) {
return this.ajax(this.buildURL(type.modelName, id, snapshot, 'findRecord'), 'GET');
}
});

View File

@ -1,26 +0,0 @@
`import Ember from 'ember'`
`import ApplicationAdapter from 'travis/adapters/application'`
Adapter = ApplicationAdapter.extend
namespace: 'settings'
buildURL: (type, id, record) ->
url = @_super.apply this, arguments
if record && (repoId = Ember.get(record, 'repo.id'))
delimiter = if url.indexOf('?') != -1 then '&' else '?'
url = "#{url}#{delimiter}repository_id=#{repoId}"
url
updateRecord: (store, type, record) ->
data = {};
serializer = store.serializerFor(type.typeKey);
serializer.serializeIntoHash(data, type, record);
id = Ember.get(record, 'id');
this.ajax(this.buildURL(type.typeKey, id, record), "PATCH", { data: data })
`export default Adapter`

27
app/adapters/env-var.js Normal file
View File

@ -0,0 +1,27 @@
import Ember from 'ember';
import ApplicationAdapter from 'travis/adapters/application';
export default ApplicationAdapter.extend({
namespace: 'settings',
buildURL(type, id, record) {
var delimiter, repoId, url;
url = this._super.apply(this, arguments);
if (record && record.belongsTo('repo') && (repoId = record.belongsTo('repo').id)) {
delimiter = url.indexOf('?') !== -1 ? '&' : '?';
url = "" + url + delimiter + "repository_id=" + repoId;
}
return url;
},
updateRecord(store, type, record) {
var data, serializer;
data = {};
serializer = store.serializerFor(type.modelName);
serializer.serializeIntoHash(data, type, record);
var id = record.id;
return this.ajax(this.buildURL(type.modelName, id, record), "PATCH", {
data: data
});
}
});

View File

@ -1,24 +0,0 @@
`import Ember from 'ember'`
`import ApplicationAdapter from 'travis/adapters/application'`
Adapter = ApplicationAdapter.extend
namespace: 'settings'
find: (store, type, id, record) ->
@ajax(this.urlPrefix() + '/ssh_key/' + id, 'GET')
deleteRecord: (store, type, record) ->
id = Ember.get(record, 'id')
@ajax(this.urlPrefix() + '/ssh_key/' + id, "DELETE");
createRecord: (store, type, record) ->
data = {};
serializer = store.serializerFor(type.typeKey);
serializer.serializeIntoHash(data, type, record, { includeId: true });
id = Ember.get(record, 'id')
this.ajax(this.urlPrefix() + '/ssh_key/' + id, "PATCH", { data: data })
`export default Adapter`

29
app/adapters/ssh-key.js Normal file
View File

@ -0,0 +1,29 @@
import Ember from 'ember';
import ApplicationAdapter from 'travis/adapters/application';
export default ApplicationAdapter.extend({
namespace: 'settings',
findRecord(store, type, id, record) {
return this.ajax(this.urlPrefix() + '/ssh_key/' + id, 'GET');
},
deleteRecord(store, type, record) {
var id = record.id;
return this.ajax(this.urlPrefix() + '/ssh_key/' + id, "DELETE");
},
createRecord(store, type, record) {
var data, serializer;
data = {};
serializer = store.serializerFor(type.modelName);
serializer.serializeIntoHash(data, type, record, {
includeId: true
});
var id = record.id;
return this.ajax(this.urlPrefix() + '/ssh_key/' + id, "PATCH", {
data: data
});
}
});

View File

@ -1,8 +1,8 @@
import Ember from 'ember';
import DS from 'ember-data';
import config from 'travis/config/environment';
import RESTAdapter from 'ember-data/adapters/rest';
export default DS.RESTAdapter.extend({
export default RESTAdapter.extend({
auth: Ember.inject.service(),
host: config.apiEndpoint,
@ -54,5 +54,11 @@ export default DS.RESTAdapter.extend({
pathForType: function(modelName, id) {
var underscored = Ember.String.underscore(modelName);
return id ? underscored : Ember.String.pluralize(underscored);
},
// this can be removed once this PR is merged and live:
// https://github.com/emberjs/data/pull/4204
findRecord(store, type, id, snapshot) {
return this.ajax(this.buildURL(type.modelName, id, snapshot, 'findRecord'), 'GET');
}
});

View File

@ -1,111 +0,0 @@
`import Ember from 'ember'`
`import Resolver from 'ember/resolver'`
`import loadInitializers from 'ember/load-initializers'`
`import config from './config/environment'`
Ember.MODEL_FACTORY_INJECTIONS = true
Ember.LinkView.reopen(
attributeBindings: ['alt']
);
App = Ember.Application.extend(Ember.Evented,
LOG_TRANSITIONS: true
LOG_TRANSITIONS_INTERNAL: true
LOG_ACTIVE_GENERATION: true
LOG_MODULE_RESOLVER: true
LOG_VIEW_LOOKUPS: true
#LOG_RESOLVER: true
modulePrefix: config.modulePrefix
podModulePrefix: config.podModulePrefix
Resolver: Resolver
lookup: ->
@__container__.lookup.apply @__container__, arguments
flash: (options) ->
Travis.lookup('controller:flash').loadFlashes([options])
toggleSidebar: ->
$('body').toggleClass('maximized')
# TODO gotta force redraws here :/
element = $('<span></span>')
$('#top .profile').append(element)
Em.run.later (-> element.remove()), 10
element = $('<span></span>')
$('#repo').append(element)
Em.run.later (-> element.remove()), 10
ready: ->
location.href = location.href.replace('#!/', '') if location.hash.slice(0, 2) == '#!'
@on 'user:signed_in', (user) ->
Travis.onUserUpdate(user)
@on 'user:refreshed', (user) ->
Travis.onUserUpdate(user)
@on 'user:synced', (user) ->
Travis.onUserUpdate(user)
@on 'user:signed_out', () ->
if config.userlike
Travis.removeUserlike()
currentDate: ->
new Date()
onUserUpdate: (user) ->
if config.pro
@identifyCustomer(user)
if config.userlike
@setupUserlike(user)
@subscribePusher(user)
subscribePusher: (user) ->
return unless user.channels
channels = user.channels
if config.pro
channels = channels.map (channel) ->
if channel.match /^private-/
channel
else
"private-#{channel}"
Travis.pusher.subscribeAll(channels)
setupUserlike: (user) ->
btn = document.getElementById('userlikeCustomTab')
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) ->
if _cio && _cio.identify
_cio.identify
id: user.id
email: user.email
name: user.name
created_at: (Date.parse(user.created_at) / 1000) || null
login: user.login
)
loadInitializers(App, config.modulePrefix)
`export default App`

130
app/app.js Normal file
View File

@ -0,0 +1,130 @@
import Ember from 'ember';
import Resolver from './resolver';
import loadInitializers from 'ember-load-initializers';
import config from './config/environment';
Ember.MODEL_FACTORY_INJECTIONS = true;
Ember.LinkComponent.reopen({
attributeBindings: ['alt']
});
var App = Ember.Application.extend(Ember.Evented, {
LOG_TRANSITIONS: true,
LOG_TRANSITIONS_INTERNAL: true,
LOG_ACTIVE_GENERATION: true,
LOG_MODULE_RESOLVER: true,
LOG_VIEW_LOOKUPS: true,
modulePrefix: config.modulePrefix,
podModulePrefix: config.podModulePrefix,
Resolver: Resolver,
flash(options) {
return Ember.getOwner(Travis).lookup('controller:flash').loadFlashes([options]);
},
toggleSidebar() {
var element;
$('body').toggleClass('maximized');
element = $('<span></span>');
$('#top .profile').append(element);
Ember.run.later((function() {
return element.remove();
}), 10);
element = $('<span></span>');
$('#repo').append(element);
return Ember.run.later((function() {
return element.remove();
}), 10);
},
ready() {
if (location.hash.slice(0, 2) === '#!') {
location.href = location.href.replace('#!/', '');
}
this.on('user:signed_in', function(user) {
return Travis.onUserUpdate(user);
});
this.on('user:refreshed', function(user) {
return Travis.onUserUpdate(user);
});
this.on('user:synced', function(user) {
return Travis.onUserUpdate(user);
});
return this.on('user:signed_out', function() {
if (config.userlike) {
return Travis.removeUserlike();
}
});
},
currentDate() {
return new Date();
},
onUserUpdate(user) {
if (config.pro) {
this.identifyCustomer(user);
}
if (config.userlike) {
this.setupUserlike(user);
}
return this.subscribePusher(user);
},
subscribePusher(user) {
var channels;
if (!user.channels) {
return;
}
channels = user.channels;
if (config.pro) {
channels = channels.map(function(channel) {
if (channel.match(/^private-/)) {
return channel;
} else {
return "private-" + channel;
}
});
}
return Travis.pusher.subscribeAll(channels);
},
setupUserlike(user) {
var btn, s, userlikeData;
btn = document.getElementById('userlikeCustomTab');
btn.classList.add("logged-in");
userlikeData = window.userlikeData = {};
userlikeData.user = {};
userlikeData.user.name = user.login;
userlikeData.user.email = user.email;
if (!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';
return document.body.appendChild(s);
}
},
removeUserlike() {
var btn;
btn = document.getElementById('userlikeCustomTab');
return btn.classList.remove("logged-in");
},
identifyCustomer(user) {
if (_cio && _cio.identify) {
return _cio.identify({
id: user.id,
email: user.email,
name: user.name,
created_at: (Date.parse(user.created_at) / 1000) || null,
login: user.login
});
}
}
});
loadInitializers(App, config.modulePrefix);
export default App;

View File

@ -1,46 +0,0 @@
`import Ember from 'ember'`
AddEnvVarComponent = Ember.Component.extend
classNames: ['form--envvar']
classNameBindings: ['nameIsBlank:form-error']
store: Ember.inject.service()
isValid: () ->
if Ember.isBlank(@get('name'))
this.set('nameIsBlank', true)
false
else
true
reset: ->
@setProperties(name: null, value: null, public: null)
actions:
save: ->
return if @get('isSaving')
@set('isSaving', true)
if @isValid()
env_var = @get('store').createRecord('env_var',
name: @get('name')
value: @get('value')
public: @get('public')
repo: @get('repo')
)
self = this
env_var.save().then =>
@set('isSaving', false)
@reset()
, =>
@set('isSaving', false)
else
@set('isSaving', false)
nameChanged: ->
this.set('nameIsBlank', false)
`export default AddEnvVarComponent`

View File

@ -0,0 +1,55 @@
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['form--envvar'],
classNameBindings: ['nameIsBlank:form-error'],
store: Ember.inject.service(),
isValid() {
if (Ember.isBlank(this.get('name'))) {
this.set('nameIsBlank', true);
return false;
} else {
return true;
}
},
reset() {
return this.setProperties({
name: null,
value: null,
"public": null
});
},
actions: {
save() {
var env_var, self;
if (this.get('isSaving')) {
return;
}
this.set('isSaving', true);
if (this.isValid()) {
env_var = this.get('store').createRecord('env_var', {
name: this.get('name'),
value: this.get('value'),
"public": this.get('public'),
repo: this.get('repo')
});
self = this;
return env_var.save().then(() => {
this.set('isSaving', false);
return this.reset();
}, () => {
return this.set('isSaving', false);
});
} else {
return this.set('isSaving', false);
}
},
nameChanged() {
return this.set('nameIsBlank', false);
}
}
});

View File

@ -1,73 +0,0 @@
# `import Ember from 'ember'`
AddSshKeyComponent = Ember.Component.extend
classNames: ['form--sshkey']
classNameBindings: ['valueError:form-error']
store: Ember.inject.service()
isSaving: false
didInsertElement: () ->
id = @get('repo.id')
model = @get('store').recordForId('ssh_key', id)
# TODO: this can be removed in favor of simply unloading record
# once https://github.com/emberjs/data/pull/2867
# and https://github.com/emberjs/data/pull/2870 are merged
if model
@get('store').dematerializeRecord(model._internalModel)
typeMap = @get('store').typeMapFor(model.constructor)
idToRecord = typeMap.idToRecord
delete idToRecord[id]
model = @get('store').createRecord('ssh_key', id: id)
@set('model', model)
isValid: () ->
if Ember.isBlank(@get('value'))
this.set('valueError', 'Value can\'t be blank.')
false
else
true
reset: ->
@setProperties(description: null, value: null)
valueChanged: (->
this.set('valueError', false)
).observes('value')
addErrorsFromResponse: (errArr) ->
error = errArr[0].detail
if error.code == 'not_a_private_key'
this.set('valueError', 'This key is not a private key.')
else if error.code == 'key_with_a_passphrase'
this.set('valueError', 'The key can\'t have a passphrase.')
actions:
save: ->
this.set('valueError', false)
return if @get('isSaving')
@set('isSaving', true)
if @isValid()
ssh_key = @get('model').setProperties(
description: @get('description')
value: @get('value')
)
ssh_key.save().then =>
@set('isSaving', false)
@reset()
@sendAction('sshKeyAdded', ssh_key)
, (error) =>
@set('isSaving', false)
if error.errors
@addErrorsFromResponse(error.errors)
else
@set('isSaving', false)
`export default AddSshKeyComponent`

View File

@ -0,0 +1,85 @@
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['form--sshkey'],
classNameBindings: ['valueError:form-error'],
store: Ember.inject.service(),
isSaving: false,
didInsertElement() {
var id = this.get('repo.id');
var model = this.get('store').recordForId('ssh_key', id);
if (model) {
this.get('store').unloadRecord(model);
var typeMap = this.get('store').typeMapFor(model.constructor);
var idToRecord = typeMap.idToRecord;
delete idToRecord[id];
}
model = this.get('store').createRecord('ssh_key', { id: id });
return this.set('model', model);
},
isValid() {
if (Ember.isBlank(this.get('value'))) {
this.set('valueError', 'Value can\'t be blank.');
return false;
} else {
return true;
}
},
reset() {
return this.setProperties({
description: null,
value: null
});
},
valueChanged: function() {
return this.set('valueError', false);
}.observes('value'),
addErrorsFromResponse(errArr) {
var error = errArr[0].detail;
if (error.code === 'not_a_private_key') {
return this.set('valueError', 'This key is not a private key.');
} else if (error.code === 'key_with_a_passphrase') {
return this.set('valueError', 'The key can\'t have a passphrase.');
}
},
actions: {
save() {
var ssh_key;
this.set('valueError', false);
if (this.get('isSaving')) {
return;
}
this.set('isSaving', true);
if (this.isValid()) {
ssh_key = this.get('model');
ssh_key.setProperties({
description: this.get('description'),
value: this.get('value')
});
return ssh_key.save().then(() => {
this.set('isSaving', false);
this.reset();
return this.sendAction('sshKeyAdded', ssh_key);
}, (error) => {
this.set('isSaving', false);
if (error.errors) {
return this.addErrorsFromResponse(error.errors);
}
});
} else {
return this.set('isSaving', false);
}
}
}
});

View File

@ -1,91 +0,0 @@
`import Ember from 'ember'`
`import { gravatarImage } from 'travis/utils/urls'`
`import { githubCommit as githubCommitUrl } from 'travis/utils/urls'`
`import TravisRoute from 'travis/routes/basic'`
`import config from 'travis/config/environment'`
BranchRowComponent = Ember.Component.extend
routing: Ember.inject.service('-routing')
tagName: 'li'
classNameBindings: ['build.last_build.state']
classNames: ['branch-row', 'row-li']
isLoading: false
isTriggering: false
hasTriggered: false
urlGithubCommit: (->
githubCommitUrl(@get('build.repository.slug'), @get('build.last_build.commit.sha'))
).property('build.last_build')
getLast5Builds: (->
lastBuilds = Ember.ArrayProxy.create(
content: [{}, {}, {}, {}, {}]
isLoading: true,
count: 0
)
if !@get('build.last_build')
lastBuilds.set('isLoading', false)
else
apiEndpoint = config.apiEndpoint
repoId = @get('build.repository.id')
branchName = @get('build.name')
options = {}
if @get('auth.signedIn')
options.headers = { Authorization: "token #{@auth.token()}" }
$.ajax("#{apiEndpoint}/v3/repo/#{repoId}/builds?branch.name=#{branchName}&limit=5&build.event_type=push,api", options).then (response) ->
array = response.builds.map( (build) ->
Ember.Object.create(build)
)
if array.length < 5
for i in [1..5 - array.length] by 1
array.push({})
lastBuilds.set('count', response['@pagination'].count)
lastBuilds.set('content', array)
lastBuilds.set('isLoading', false)
lastBuilds
).property()
canTrigger: (->
if !@get('auth.signedIn')
false
else
permissions = @get('auth.currentUser.permissions')
if permissions.contains parseInt(@get('build.repository.id'))
true
else
false
).property()
triggerBuild: (->
apiEndpoint = config.apiEndpoint
repoId = @get('build.repository.id')
options = {
type: 'POST',
body: {
request: {
branch: @get('build.name')
}
}
}
if @get('auth.signedIn')
options.headers = { Authorization: "token #{@auth.token()}" }
$.ajax("#{apiEndpoint}/v3/repo/#{repoId}/requests", options).then (response) =>
@set('isTriggering', false)
@set('hasTriggered', true)
)
actions:
tiggerBuild: (branch) ->
@set('isTriggering', true)
@triggerBuild()
viewAllBuilds: (branch) ->
@get('routing').transitionTo('builds')
`export default BranchRowComponent`

View File

@ -0,0 +1,103 @@
import Ember from 'ember';
import { githubCommit as githubCommitUrl } from 'travis/utils/urls';
import TravisRoute from 'travis/routes/basic';
import config from 'travis/config/environment';
export default Ember.Component.extend({
routing: Ember.inject.service('-routing'),
tagName: 'li',
classNameBindings: ['build.last_build.state'],
classNames: ['branch-row', 'row-li'],
isLoading: false,
isTriggering: false,
hasTriggered: false,
urlGithubCommit: function() {
return githubCommitUrl(this.get('build.repository.slug'), this.get('build.last_build.commit.sha'));
}.property('build.last_build'),
getLast5Builds: function() {
var apiEndpoint, branchName, lastBuilds, options, repoId;
lastBuilds = Ember.ArrayProxy.create({
content: [{}, {}, {}, {}, {}],
isLoading: true,
count: 0
});
if (!this.get('build.last_build')) {
lastBuilds.set('isLoading', false);
} else {
apiEndpoint = config.apiEndpoint;
repoId = this.get('build.repository.id');
branchName = this.get('build.name');
options = {};
if (this.get('auth.signedIn')) {
options.headers = {
Authorization: "token " + (this.auth.token())
};
}
$.ajax(apiEndpoint + "/v3/repo/" + repoId + "/builds?branch.name=" + branchName + "&limit=5&build.event_type=push,api", options).then(function(response) {
var array, i, j, ref;
array = response.builds.map(function(build) {
return Ember.Object.create(build);
});
if (array.length < 5) {
for (i = j = 1, ref = 5 - array.length; j <= ref; i = j += 1) {
array.push({});
}
}
lastBuilds.set('count', response['@pagination'].count);
lastBuilds.set('content', array);
return lastBuilds.set('isLoading', false);
});
}
return lastBuilds;
}.property(),
canTrigger: function() {
var permissions;
if (!this.get('auth.signedIn')) {
return false;
} else {
permissions = this.get('auth.currentUser.permissions');
if (permissions.contains(parseInt(this.get('build.repository.id')))) {
return true;
} else {
return false;
}
}
}.property(),
triggerBuild: function() {
var apiEndpoint, options, repoId;
apiEndpoint = config.apiEndpoint;
repoId = this.get('build.repository.id');
options = {
type: 'POST',
body: {
request: {
branch: this.get('build.name')
}
}
};
if (this.get('auth.signedIn')) {
options.headers = {
Authorization: "token " + (this.auth.token())
};
}
return $.ajax(apiEndpoint + "/v3/repo/" + repoId + "/requests", options).then(() => {
this.set('isTriggering', false);
return this.set('hasTriggered', true);
});
},
actions: {
tiggerBuild(branch) {
this.set('isTriggering', true);
return this.triggerBuild();
},
viewAllBuilds(branch) {
return this.get('routing').transitionTo('builds');
}
}
});

View File

@ -1,24 +0,0 @@
`import Ember from 'ember'`
BroadcastTowerComponent = Ember.Component.extend
classNames: ['broadcast']
isOpen: false
timeoutId: ''
actions:
toggleBroadcasts:() ->
@toggleProperty('isOpen')
@sendAction('toggleBroadcasts')
if @get('isOpen') == true
@set('timeoutId', setTimeout =>
@toggleProperty('isOpen')
@sendAction('toggleBroadcasts')
, 10000
)
else
clearTimeout(@get('timeoutId'))
`export default BroadcastTowerComponent`

View File

@ -0,0 +1,21 @@
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['broadcast'],
isOpen: false,
timeoutId: '',
actions: {
toggleBroadcasts() {
this.toggleProperty('isOpen');
this.sendAction('toggleBroadcasts');
if (this.get('isOpen') === true) {
return this.set('timeoutId', setTimeout(() => {
this.toggleProperty('isOpen');
return this.sendAction('toggleBroadcasts');
}, 10000));
} else {
return clearTimeout(this.get('timeoutId'));
}
}
}
});

View File

@ -1,41 +0,0 @@
`import Ember from 'ember'`
`import { gravatarImage } from 'travis/utils/urls'`
`import GithubUrlPropertievs from 'travis/mixins/github-url-properties'`
`import { durationFrom, safe } from 'travis/utils/helpers'`
`import { githubCommit } from 'travis/utils/urls'`
BuildHeaderComponent = Ember.Component.extend
tagName: 'section'
classNames: ['build-header']
classNameBindings: ['item.state']
committerAvatarUrl: (->
if url = @get('commit.committerAvatarUrl')
url
else
email = @get('commit.committerEmail')
gravatarImage(email, 40)
).property('commit.committerEmail', 'commit.committerAvatarUrl')
authorAvatarUrl: (->
if url = @get('commit.authorAvatarUrl')
url
else
email = @get('commit.authorEmail')
gravatarImage(email, 40)
).property('commit.authorEmail', 'commit.authorAvatarUrl')
isJob: (->
if @get('item.build') then true else false
).property('item')
urlGithubCommit: (->
githubCommit(@get('repo.slug'), @get('commit.sha'))
).property('item')
elapsedTime: (->
durationFrom(@get('item.startedAt'), @get('item.finishedAt'))
).property('item.startedAt', 'item.finishedAt', 'item.duration')
`export default BuildHeaderComponent`

View File

@ -0,0 +1,27 @@
import Ember from 'ember';
import { gravatarImage } from 'travis/utils/urls';
import GithubUrlProperties from 'travis/mixins/github-url-properties';
import { durationFrom, safe } from 'travis/utils/helpers';
import { githubCommit } from 'travis/utils/urls';
export default Ember.Component.extend({
tagName: 'section',
classNames: ['build-header'],
classNameBindings: ['item.state'],
isJob: function() {
if (this.get('item.build')) {
return true;
} else {
return false;
}
}.property('item'),
urlGithubCommit: function() {
return githubCommit(this.get('repo.slug'), this.get('commit.sha'));
}.property('item'),
elapsedTime: function() {
return durationFrom(this.get('item.startedAt'), this.get('item.finishedAt'));
}.property('item.startedAt', 'item.finishedAt', 'item.duration')
});

View File

@ -1,9 +0,0 @@
`import Ember from 'ember'`
`import RepoActionsItemComponentMixin from 'travis/utils/repo-actions-item-component-mixin'`
BuildRepoActionsComponent = Ember.Component.extend(RepoActionsItemComponentMixin,
item: Ember.computed.alias('build')
type: 'build'
)
`export default BuildRepoActionsComponent`

View File

@ -0,0 +1,7 @@
import Ember from 'ember';
import RepoActionsItemComponentMixin from 'travis/utils/repo-actions-item-component-mixin';
export default Ember.Component.extend(RepoActionsItemComponentMixin, {
item: Ember.computed.alias('build'),
type: 'build'
});

View File

@ -1,14 +0,0 @@
`import Ember from 'ember'`
BuildTileComponent = Ember.Component.extend
tagName: 'li'
classNameBindings: ['build.state']
attributeBindings: ['title'],
title: (->
num = @get('build.number')
"##{num}"
).property('build')
`export default BuildTileComponent`

View File

@ -0,0 +1,14 @@
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'li',
classNameBindings: ['build.state'],
attributeBindings: ['title'],
title: function() {
var num, state;
num = this.get('build.number');
state = this.get('build.state');
return "Build #" + num + " " + state;
}.property('build')
});

View File

@ -0,0 +1,12 @@
import Ember from 'ember';
import { colorForState } from 'travis/utils/helpers';
import Polling from 'travis/mixins/polling';
export default Ember.Component.extend({
classNameBindings: ['color'],
pollModels: 'build',
color: function() {
return colorForState(this.get('build.state'));
}.property('build.state')
});

View File

@ -1,22 +0,0 @@
`import Ember from 'ember'`
`import { gravatarImage } from 'travis/utils/urls'`
`import { githubCommit as githubCommitUrl } from 'travis/utils/urls'`
BuildsItemComponent = Ember.Component.extend
tagName: 'li'
classNameBindings: ['build.state']
classNames: ['row-li', 'pr-row']
authorAvatarUrl: (->
if url = @get('build.commit.authorAvatarUrl')
url
else
email = @get('build.commit.authorEmail')
gravatarImage(email, 40)
).property('build.commit.authorEmail', 'build.commit.authorAvatarUrl')
urlGithubCommit: (->
githubCommitUrl(@get('build.repo.slug'), @get('build.commit.sha'))
).property('build.commit.sha')
`export default BuildsItemComponent`

View File

@ -0,0 +1,12 @@
import Ember from 'ember';
import { githubCommit as githubCommitUrl } from 'travis/utils/urls';
export default Ember.Component.extend({
tagName: 'li',
classNameBindings: ['build.state'],
classNames: ['row-li', 'pr-row'],
urlGithubCommit: function() {
return githubCommitUrl(this.get('build.repo.slug'), this.get('build.commit.sha'));
}.property('build.commit.sha')
});

View File

@ -0,0 +1,30 @@
import Ember from 'ember';
import Polling from 'travis/mixins/polling';
export default Ember.Component.extend({
store: Ember.inject.service('store'),
pollHook: function(store) {
var contentType, repositoryId;
contentType = this.get('contentType');
repositoryId = this.get('repo.id');
store = this.get('store');
if (contentType === 'builds') {
return store.query('build', {
event_type: 'push',
repository_id: repositoryId
});
} else if (contentType === 'pull_requests') {
return store.filter('build', {
event_type: 'pull_request',
repository_id: repositoryId
});
} else {
return store.query('build', {
repository_id: repositoryId,
branches: true
});
}
}
});

View File

@ -1,27 +0,0 @@
`import Ember from 'ember'`
CachesItemComponent = Ember.Component.extend
ajax: Ember.inject.service()
tagName: 'li'
classNames: ['cache-item']
classNameBindings: ['cache.type']
isDeleting: false
actions:
delete: ->
return if @get('isDeleting')
if confirm('Are you sure?')
@set('isDeleting', true)
data = { branch: @get('cache.branch') }
deletingDone = => @set('isDeleting', false)
repo = @get('repo')
@get('ajax').ajax("/repos/#{repo.get('id')}/caches", "DELETE", data: data).then(deletingDone, deletingDone).then =>
@get('caches').removeObject(@get('cache'))
`export default CachesItemComponent`

View File

@ -0,0 +1,33 @@
import Ember from 'ember';
export default Ember.Component.extend({
ajax: Ember.inject.service(),
tagName: 'li',
classNames: ['cache-item'],
classNameBindings: ['cache.type'],
isDeleting: false,
actions: {
"delete": function() {
var data, deletingDone, repo;
if (this.get('isDeleting')) {
return;
}
if (confirm('Are you sure?')) {
this.set('isDeleting', true);
data = {
branch: this.get('cache.branch')
};
deletingDone = () => {
return this.set('isDeleting', false);
};
repo = this.get('repo');
return this.get('ajax').ajax("/repos/" + (repo.get('id')) + "/caches", "DELETE", {
data: data
}).then(deletingDone, deletingDone).then(() => {
return this.get('caches').removeObject(this.get('cache'));
});
}
}
}
});

View File

@ -1,10 +0,0 @@
`import Ember from 'ember'`
Component = Ember.Component.extend(
actions:
close: ->
$('.popup').removeClass('display')
return false
)
`export default Component`

View File

@ -1,55 +0,0 @@
`import Ember from 'ember'`
`import { githubCommit as githubCommitUrl } from 'travis/utils/urls'`
`import config from 'travis/config/environment'`
DashboardRowComponent = Ember.Component.extend
tagName: 'li'
classNameBindings: ['repo.default_branch.last_build.state']
classNames: ['dashboard-row', 'row-li']
isLoading: false
isTriggering: false
hasTriggered: false
urlGithubCommit: (->
githubCommitUrl(@get('repo.slug'), @get('repo.default_branch.last_build.commit.sha'))
).property('repo')
# canTrigger: (->
# if !@get('auth.signedIn')
# false
# else
# permissions = @get('auth.currentUser.permissions')
# if permissions.contains parseInt(@get('build.repository.id'))
# true
# else
# false
# ).property()
# triggerBuild: (->
# apiEndpoint = config.apiEndpoint
# repoId = @get('build.repository.id')
# options = {
# type: 'POST',
# body: {
# request: {
# branch: @get('build.name')
# }
# }
# }
# if @get('auth.signedIn')
# options.headers = { Authorization: "token #{@auth.token()}" }
# $.ajax("#{apiEndpoint}/v3/repo/#{repoId}/requests", options).then (response) =>
# @set('isTriggering', false)
# @set('hasTriggered', true)
# )
actions:
tiggerBuild: (branch) ->
@set('isTriggering', true)
@triggerBuild()
# viewAllBuilds: (branch) ->
# @get('routing').transitionTo('builds')
`export default DashboardRowComponent`

View File

@ -0,0 +1,36 @@
import Ember from 'ember';
import { githubCommit as githubCommitUrl } from 'travis/utils/urls';
import config from 'travis/config/environment';
import { hasAdminPermission, hasPushPermission } from 'travis/utils/permission';
export default Ember.Component.extend({
tagName: 'li',
classNameBindings: ['repo.default_branch.last_build.state'],
classNames: ['rows', 'rows--dashboard'],
isLoading: false,
isTriggering: false,
hasTriggered: false,
dropupIsOpen: false,
urlGithubCommit: function() {
return githubCommitUrl(this.get('repo.slug'), this.get('repo.default_branch.last_build.commit.sha'));
}.property('repo'),
displayMenuTofu: function() {
return hasPushPermission(this.get('currentUser'), this.get('repo.id'));
},
displayActivateLink: function() {
return hasAdminPermission(this.get('currentUser'), this.get('repo.id'));
},
actions: {
tiggerBuild(branch) {
this.set('isTriggering', true);
return this.triggerBuild();
},
openDropup() {
this.toggleProperty('dropupIsOpen');
}
}
});

View File

@ -1,29 +0,0 @@
`import Ember from 'ember'`
EnvVarComponent = Ember.Component.extend
classNames: ['settings-envvar']
classNameBindings: ['envVar.public:is-public']
isDeleting: false
validates:
name: ['presence']
actionType: 'Save'
showValueField: Ember.computed.alias('public')
value: ( (key, value) ->
if @get('envVar.public')
@get('envVar.value')
else
'••••••••••••••••'
).property('envVar.value', 'envVar.public')
actions:
delete: ->
return if @get('isDeleting')
@set('isDeleting', true)
@get('envVar').destroyRecord()
`export default EnvVarComponent`

28
app/components/env-var.js Normal file
View File

@ -0,0 +1,28 @@
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['settings-envvar'],
classNameBindings: ['envVar.public:is-public'],
isDeleting: false,
validates: { name: ['presence'] },
actionType: 'Save',
showValueField: Ember.computed.alias('public'),
value: function(key) {
if (this.get('envVar.public')) {
return this.get('envVar.value');
} else {
return '••••••••••••••••';
}
}.property('envVar.value', 'envVar.public'),
actions: {
"delete": function() {
if (this.get('isDeleting')) {
return;
}
this.set('isDeleting', true);
return this.get('envVar').destroyRecord();
}
}
});

View File

@ -1,8 +0,0 @@
`import Ember from 'ember'`
EyeIconComponent = Ember.Component.extend
tagName: 'span'
classNames: ['icon-eye']
`export default EyeIconComponent`

View File

@ -0,0 +1,6 @@
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'span',
classNames: ['icon-eye']
});

View File

@ -1,15 +0,0 @@
`import Ember from 'ember'`
FlashDisplayComponent = Ember.Component.extend
flashes: Ember.inject.service()
classNames: ['flash']
tagName: 'ul'
messagesBinding: 'flashes.messages'
actions:
closeMessage: (msg) ->
@get('flashes').close(msg)
`export default FlashDisplayComponent`

View File

@ -0,0 +1,14 @@
import Ember from 'ember';
export default Ember.Component.extend({
flashes: Ember.inject.service(),
classNames: ['flash'],
tagName: 'ul',
messagesBinding: 'flashes.messages',
actions: {
closeMessage(msg) {
return this.get('flashes').close(msg);
}
}
});

View File

@ -1,15 +0,0 @@
`import Ember from 'ember'`
FlashItemComponent = Ember.Component.extend
tagName: 'li'
classNameBindings: ['type']
type: (->
@get('flash.type') || 'broadcast'
).property('flash.type')
actions:
close: ->
this.attrs.close(@get('flash'))
`export default FlashItemComponent`

View File

@ -0,0 +1,16 @@
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'li',
classNameBindings: ['type'],
type: function() {
return this.get('flash.type') || 'broadcast';
}.property('flash.type'),
actions: {
close() {
return this.attrs.close(this.get('flash'));
}
}
});

View File

@ -1,18 +0,0 @@
`import Ember from 'ember'`
HookSwitchComponent = Ember.Component.extend
tagName: 'a'
classNames: ['switch--icon']
classNameBindings: ['active']
activeBinding: "hook.active"
click: ->
@sendAction('onToggle')
hook = @get('hook')
hook.toggle().then( (->), =>
@toggleProperty('hook.active')
@sendAction('onToggleError', hook)
)
`export default HookSwitchComponent`

View File

@ -0,0 +1,17 @@
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'a',
classNames: ['switch--icon'],
classNameBindings: ['active'],
activeBinding: "hook.active",
click() {
var hook;
this.sendAction('onToggle');
hook = this.get('hook');
return hook.toggle().then((function() {}), () => {
this.toggleProperty('hook.active');
return this.sendAction('onToggleError', hook);
});
}
});

View File

@ -1,21 +0,0 @@
`import Ember from 'ember'`
`import config from 'travis/config/environment'`
HooksListItemComponent = Ember.Component.extend
tagName: 'li'
classNames: ['row']
classNameBindings: ['hook.active:active']
githubOrgsOauthAccessSettingsUrl: config.githubOrgsOauthAccessSettingsUrl
actions:
handleToggleError: ->
@set("showError", true)
close: ->
@send('resetErrors')
resetErrors: ->
@set("showError", false)
`export default HooksListItemComponent`

View File

@ -0,0 +1,23 @@
import Ember from 'ember';
import config from 'travis/config/environment';
export default Ember.Component.extend({
tagName: 'li',
classNames: ['row'],
classNameBindings: ['hook.active:active'],
githubOrgsOauthAccessSettingsUrl: config.githubOrgsOauthAccessSettingsUrl,
actions: {
handleToggleError() {
return this.set("showError", true);
},
close() {
return this.send('resetErrors');
},
resetErrors() {
return this.set("showError", false);
}
}
});

View File

@ -1,30 +0,0 @@
`import Ember from 'ember'`
JobLogComponent = Ember.Component.extend
logBinding: 'job.log'
didInsertElement: ->
@setupLog()
logDidChange: (->
@setupLog()
).observes('log')
logWillChange: (->
@teardownLog()
).observesBefore('log')
willDestroyElement: ->
@teardownLog()
teardownLog: ->
job = @get('job')
job.unsubscribe() if job
setupLog: ->
job = @get('job')
if job
job.get('log').fetch()
job.subscribe()
`export default JobLogComponent`

35
app/components/job-log.js Normal file
View File

@ -0,0 +1,35 @@
import Ember from 'ember';
export default Ember.Component.extend({
logBinding: 'job.log',
classNames: ['job-log'],
didReceiveAttrs: function(options) {
this._super(...arguments);
let oldJob = options.oldAttrs && options.oldAttrs.job && options.oldAttrs.job.value,
newJob = options.newAttrs && options.newAttrs.job && options.newAttrs.job.value;
if(newJob !== oldJob) {
if(newJob) {
this.setupLog(newJob);
}
if(oldJob) {
this.teardownLog(oldJob);
}
}
},
teardownLog(job) {
job.unsubscribe();
},
setupLog(job) {
this.set('error', false);
job.get('log').fetch().then(function() { }, () => {
this.set('error', true);
});
job.subscribe();
}
});

View File

@ -1,9 +0,0 @@
`import Ember from 'ember'`
`import RepoActionsItemComponentMixin from 'travis/utils/repo-actions-item-component-mixin'`
JobRepoActionsComponent = Ember.Component.extend(RepoActionsItemComponentMixin,
item: Ember.computed.alias('job')
type: 'job'
)
`export default JobRepoActionsComponent`

View File

@ -0,0 +1,7 @@
import Ember from 'ember';
import RepoActionsItemComponentMixin from 'travis/utils/repo-actions-item-component-mixin';
export default Ember.Component.extend(RepoActionsItemComponentMixin, {
item: Ember.computed.alias('job'),
type: 'job'
});

View File

@ -0,0 +1,18 @@
import Ember from 'ember';
import { colorForState } from 'travis/utils/helpers';
import { githubCommit } from 'travis/utils/urls';
import Polling from 'travis/mixins/polling';
export default Ember.Component.extend({
pollModels: 'job.build',
commitBinding: 'job.commit',
currentItemBinding: 'job',
color: function() {
return colorForState(this.get('job.state'));
}.property('job.state'),
urlGithubCommit: function() {
return githubCommit(this.get('repo.slug'), this.get('commit.sha'));
}.property('repo.slug', 'commit.sha')
});

View File

@ -1,32 +0,0 @@
`import Ember from 'ember'`
`import { colorForState } from 'travis/utils/helpers'`
`import { languageConfigKeys } from 'travis/utils/keys-map';`
JobsItemComponent = Ember.Component.extend
tagName: 'li'
classNameBindings: ['job.state']
classNames: ['jobs-item']
languages: (->
output = []
if config = @get('job.config')
for key, languageName of languageConfigKeys
if version = config[key]
output.push(languageName + ': ' + version)
gemfile = @get('job.config.gemfile')
if gemfile && @get('job.config.env')
output.push "Gemfile: #{gemfile}"
output.join(' ')
).property('job.config')
environment: (->
if env = @get('job.config.env')
env
else if gemfile = @get('job.config.gemfile')
"Gemfile: #{gemfile}"
).property('job.config.env', 'job.config.gemfile')
`export default JobsItemComponent`

View File

@ -0,0 +1,36 @@
import Ember from 'ember';
import { colorForState } from 'travis/utils/helpers';
import { languageConfigKeys } from 'travis/utils/keys-map';
export default Ember.Component.extend({
tagName: 'li',
classNameBindings: ['job.state'],
classNames: ['jobs-item'],
languages: function() {
var config, gemfile, key, languageName, output, version;
output = [];
if (config = this.get('job.config')) {
for (key in languageConfigKeys) {
languageName = languageConfigKeys[key];
if (version = config[key]) {
output.push(languageName + ': ' + version);
}
}
gemfile = this.get('job.config.gemfile');
if (gemfile && this.get('job.config.env')) {
output.push("Gemfile: " + gemfile);
}
}
return output.join(' ');
}.property('job.config'),
environment: function() {
var env, gemfile;
if (env = this.get('job.config.env')) {
return env;
} else if (gemfile = this.get('job.config.gemfile')) {
return "Gemfile: " + gemfile;
}
}.property('job.config.env', 'job.config.gemfile')
});

View File

@ -1,15 +0,0 @@
`import Ember from 'ember'`
JobsListComponent = Ember.Component.extend
tagName: 'section'
classNames: ['jobs']
jobTableId: Ember.computed(->
if @get('required')
'jobs'
else
'allowed_failure_jobs'
)
`export default JobsListComponent`

View File

@ -0,0 +1,13 @@
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'section',
classNames: ['jobs'],
jobTableId: Ember.computed(function() {
if (this.get('required')) {
return 'jobs';
} else {
return 'allowed_failure_jobs';
}
})
});

View File

@ -1,12 +0,0 @@
`import Ember from 'ember'`
`import { githubCommit as githubCommitUrl } from 'travis/utils/urls'`
`import TravisRoute from 'travis/routes/basic'`
`import config from 'travis/config/environment'`
LandingRowComponent = Ember.Component.extend
tagName: 'li'
classNameBindings: ['repo.lastBuildState']
classNames: ['landing-row', 'row-li']
`export default LandingRowComponent`

View File

@ -0,0 +1,8 @@
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'li',
classNameBindings: ['build.state']
});

View File

@ -1,40 +0,0 @@
`import Ember from 'ember'`
LimitConcurrentBuildsComponent = Ember.Component.extend
classNames: ['limit-concurrent-builds']
description: (->
description = "Limit concurrent jobs"
if @get('enabled')
description += " "
description
).property('enabled')
limitChanged: ->
repo = @get('repo')
limit = parseInt(@get('value'))
if limit
@set('isSaving', true)
savingFinished = =>
@set('isSaving', false)
repo.saveSettings(maximum_number_of_builds: limit).
then(savingFinished, savingFinished)
actions:
toggle: ->
unless @get('enabled')
return if @get('value') == 0
return if @get('isSaving')
@set('isSaving', true)
savingFinished = =>
@set('isSaving', false)
@get('repo').saveSettings(maximum_number_of_builds: 0).then(savingFinished, savingFinished)
@set('value', 0)
limitChanged: ->
Ember.run.debounce(this, 'limitChanged', 1000)
`export default LimitConcurrentBuildsComponent`

View File

@ -0,0 +1,55 @@
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['limit-concurrent-builds'],
description: function() {
var description;
description = "Limit concurrent jobs";
if (this.get('enabled')) {
description += " ";
}
return description;
}.property('enabled'),
limitChanged() {
var limit, repo, savingFinished;
repo = this.get('repo');
limit = parseInt(this.get('value'));
if (limit) {
this.set('isSaving', true);
savingFinished = () => {
return this.set('isSaving', false);
};
return repo.saveSettings({
maximum_number_of_builds: limit
}).then(savingFinished, savingFinished);
}
},
actions: {
toggle() {
var savingFinished;
if (!this.get('enabled')) {
if (this.get('value') === 0) {
return;
}
if (this.get('isSaving')) {
return;
}
this.set('isSaving', true);
savingFinished = () => {
return this.set('isSaving', false);
};
this.get('repo').saveSettings({
maximum_number_of_builds: 0
}).then(savingFinished, savingFinished);
return this.set('value', 0);
}
},
limitChanged() {
return Ember.run.debounce(this, 'limitChanged', 1000);
}
}
});

View File

@ -1,8 +0,0 @@
`import Ember from 'ember'`
LoadingIndicatorComponent = Ember.Component.extend
tagName: 'div'
classNameBindings: ['center:loading-container', 'inline:inline-block', 'height:icon-height']
center: false
`export default LoadingIndicatorComponent`

View File

@ -0,0 +1,7 @@
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'div',
classNameBindings: ['center:loading-container', 'inline:inline-block', 'height:icon-height'],
center: false
});

View File

@ -1,157 +0,0 @@
`import Ember from 'ember'`
`import LinesSelector from 'travis/utils/lines-selector'`
`import LogFolder from 'travis/utils/log-folder'`
`import config from 'travis/config/environment'`
`import { plainTextLog as plainTextLogUrl } from 'travis/utils/urls'`
Log.DEBUG = false
Log.LIMIT = 10000
Log.Scroll = (options) ->
options ||= {}
@beforeScroll = options.beforeScroll
this
Log.Scroll.prototype = $.extend new Log.Listener,
insert: (log, data, pos) ->
@tryScroll() if @numbers
true
tryScroll: ->
if element = $("#log p:visible.highlight:first")
if @beforeScroll
@beforeScroll()
$('#main').scrollTop(0)
$('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
LogContentComponent = Ember.Component.extend
popup: Ember.inject.service()
currentUserBinding: 'auth.currentUser'
didInsertElement: ->
console.log 'log view: did insert' if Log.DEBUG
@_super.apply this, arguments
@createEngine()
willDestroyElement: ->
console.log 'log view: will destroy' if Log.DEBUG
@teardownLog()
teardownLog: (log) ->
if log || log = @get('log')
parts = log.get('parts')
parts.removeArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop')
parts.destroy()
log.notifyPropertyChange('parts')
@lineSelector?.willDestroy()
if logElement = this.$('#log')
logElement.empty()
createEngine: (log) ->
if log || log = @get('log')
if logElement = this.$('#log')
logElement.empty()
log.onClear =>
@teardownLog()
@createEngine()
@scroll = new Log.Scroll beforeScroll: =>
@unfoldHighlight()
@limit = new Log.Limit Log.LIMIT, =>
@set('limited', true)
@engine = Log.create(listeners: [@scroll, @limit])
@engine.limit = @limit
@logFolder = new LogFolder(@$('#log'))
@lineSelector = new LinesSelector(@$('#log'), @scroll, @logFolder)
@observeParts(log)
didUpdateAttrs: (changes) ->
@_super.apply(this, arguments)
return unless changes.oldAttrs
if changes.newAttrs.job.value && changes.oldAttrs.job.value &&
changes.newAttrs.job.value != changes.oldAttrs.job.value
@teardownLog(changes.oldAttrs.job.value.get('log'))
@createEngine(changes.newAttrs.job.value.get('log'))
unfoldHighlight: ->
@lineSelector.unfoldLines()
observeParts: (log) ->
if log || log = @get('log')
parts = log.get('parts')
parts.addArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop')
parts = parts.slice(0)
@partsDidChange(parts, 0, null, parts.length)
partsDidChange: (parts, start, _, added) ->
console.log 'log view: parts did change' if Log.DEBUG
return unless @get('state') == 'inDOM'
for part, i in parts.slice(start, start + added)
# console.log "limit in log view: #{@get('limited')}"
break if @engine?.limit?.limited
@engine.set(part.number, part.content)
plainTextLogUrl: (->
if id = @get('log.job.id')
url = plainTextLogUrl(id)
if config.pro
url += "&access_token=#{@get('job.log.token')}"
url
).property('job.log.id', 'job.log.token')
hasPermission: (->
if permissions = @get('currentUser.permissions')
permissions.contains parseInt(@get('job.repo.id'))
).property('currentUser.permissions.length', 'job.repo.id')
canRemoveLog: (->
if job = @get('job')
job.get('canRemoveLog') && @get('hasPermission')
).property('job.canRemoveLog', 'hasPermission')
showToTop: (->
@get('log.hasContent') && @get('job.canRemoveLog')
).property('log.hasContent', 'job.canRemoveLog')
showTailing: Ember.computed.alias('showToTop')
actions:
toTop: () ->
Travis.tailing.stop()
$(window).scrollTop(0)
toggleTailing: ->
Travis.tailing.toggle()
@engine.autoCloseFold = !Travis.tailing.isActive()
event.preventDefault()
removeLogPopup: ->
if @get('canRemoveLog')
@get('popup').open('remove-log-popup')
return false
noop: -> # TODO required?
`export default LogContentComponent`

View File

@ -0,0 +1,238 @@
import Ember from 'ember';
import LinesSelector from 'travis/utils/lines-selector';
import LogFolder from 'travis/utils/log-folder';
import config from 'travis/config/environment';
import { plainTextLog as plainTextLogUrl } from 'travis/utils/urls';
Log.DEBUG = false;
Log.LIMIT = 10000;
Log.Scroll = function(options) {
options = options || {};
this.beforeScroll = options.beforeScroll;
return this;
};
Log.Scroll.prototype = $.extend(new Log.Listener(), {
insert: function(log, data, pos) {
if (this.numbers) {
this.tryScroll();
}
return true;
},
tryScroll: function() {
var element, ref;
if (element = $("#log p:visible.highlight:first")) {
if (this.beforeScroll) {
this.beforeScroll();
}
$('#main').scrollTop(0);
return $('html, body').scrollTop(((ref = element.offset()) != null ? ref.top : void 0) - (window.innerHeight / 3));
}
}
});
Log.Limit = function(max_lines, limitedLogCallback) {
this.max_lines = max_lines || 1000;
this.limitedLogCallback = limitedLogCallback || (function() {});
return this;
};
Log.Limit.prototype = Log.extend(new Log.Listener(), {
count: 0,
insert: function(log, node, pos) {
if (node.type === 'paragraph' && !node.hidden) {
this.count += 1;
if (this.limited) {
this.limitedLogCallback();
}
return this.count;
}
}
});
Object.defineProperty(Log.Limit.prototype, 'limited', {
get: function() {
return this.count >= this.max_lines;
}
});
export default Ember.Component.extend({
popup: Ember.inject.service(),
classNameBindings: ['logIsVisible:is-open'],
logIsVisible: false,
currentUserBinding: 'auth.currentUser',
didInsertElement() {
if (Log.DEBUG) {
console.log('log view: did insert');
}
this._super.apply(this, arguments);
Ember.run.scheduleOnce('afterRender', this, 'createEngine');
},
willDestroyElement() {
if (Log.DEBUG) {
console.log('log view: will destroy');
}
Ember.run.scheduleOnce('afterRender', this, 'teardownLog');
},
teardownLog(log) {
var parts, ref;
if (log || (log = this.get('log'))) {
parts = log.get('parts');
parts.removeArrayObserver(this, {
didChange: 'partsDidChange',
willChange: 'noop'
});
parts.destroy();
log.notifyPropertyChange('parts');
if ((ref = this.lineSelector) != null) {
ref.willDestroy();
}
this.clearLogElement();
}
},
clearLogElement() {
var logElement = this.$('#log');
if (logElement && logElement[0]) {
logElement[0].innerHTML = '';
}
},
createEngine(log) {
if (log || (log = this.get('log'))) {
this.clearLogElement();
log.onClear(() => {
this.teardownLog();
return this.createEngine();
});
this.scroll = new Log.Scroll({
beforeScroll: () => {
return this.unfoldHighlight();
}
});
this.limit = new Log.Limit(Log.LIMIT, () => {
return this.set('limited', true);
});
this.engine = Log.create({
listeners: [this.scroll, this.limit]
});
this.engine.limit = this.limit;
this.logFolder = new LogFolder(this.$('#log'));
this.lineSelector = new LinesSelector(this.$('#log'), this.scroll, this.logFolder);
this.observeParts(log);
}
},
didUpdateAttrs(changes) {
this._super.apply(this, arguments);
if (!changes.oldAttrs) {
return;
}
if (changes.newAttrs.job.value && changes.oldAttrs.job.value && changes.newAttrs.job.value !== changes.oldAttrs.job.value) {
this.teardownLog(changes.oldAttrs.job.value.get('log'));
return this.createEngine(changes.newAttrs.job.value.get('log'));
}
},
unfoldHighlight() {
return this.lineSelector.unfoldLines();
},
observeParts(log) {
var parts;
if (log || (log = this.get('log'))) {
parts = log.get('parts');
parts.addArrayObserver(this, {
didChange: 'partsDidChange',
willChange: 'noop'
});
parts = parts.slice(0);
this.partsDidChange(parts, 0, null, parts.length);
}
},
partsDidChange(parts, start, _, added) {
Ember.run.schedule('afterRender', this, function() {
var i, j, len, part, ref, ref1, ref2, results;
if (Log.DEBUG) {
console.log('log view: parts did change');
}
if (this.get('_state') !== 'inDOM') {
return;
}
ref = parts.slice(start, start + added);
results = [];
for (i = j = 0, len = ref.length; j < len; i = ++j) {
part = ref[i];
if ((ref1 = this.engine) != null ? (ref2 = ref1.limit) != null ? ref2.limited : void 0 : void 0) {
break;
}
results.push(this.engine.set(part.number, part.content));
}
return results;
});
},
plainTextLogUrl: function() {
var id, url;
if (id = this.get('log.job.id')) {
url = plainTextLogUrl(id);
if (config.pro) {
url += "&access_token=" + (this.get('job.log.token'));
}
return url;
}
}.property('job.log.id', 'job.log.token'),
hasPermission: function() {
var permissions;
if (permissions = this.get('currentUser.permissions')) {
return permissions.contains(parseInt(this.get('job.repo.id')));
}
}.property('currentUser.permissions.length', 'job.repo.id'),
canRemoveLog: function() {
var job;
if (job = this.get('job')) {
return job.get('canRemoveLog') && this.get('hasPermission');
}
}.property('job.canRemoveLog', 'hasPermission'),
showToTop: function() {
return this.get('log.hasContent') && this.get('job.canRemoveLog');
}.property('log.hasContent', 'job.canRemoveLog'),
showTailing: Ember.computed.alias('showToTop'),
actions: {
toTop() {
Travis.tailing.stop();
return $(window).scrollTop(0);
},
toggleTailing() {
Travis.tailing.toggle();
this.engine.autoCloseFold = !Travis.tailing.isActive();
return false;
},
removeLogPopup() {
if (this.get('canRemoveLog')) {
this.get('popup').open('remove-log-popup');
return false;
}
},
toggleLog() {
this.toggleProperty('logIsVisible');
}
},
// don't remove this, it's needed as an empty willChange callback
noop: function() {}
});

View File

@ -1,19 +0,0 @@
`import Ember from 'ember'`
`import config from 'travis/config/environment'`
NoBuildsComponent = Ember.Component.extend
actions:
triggerBuild: () ->
@set('isLoading', true)
apiEndpoint = config.apiEndpoint
$.ajax(apiEndpoint + "/v3/repo/#{@get('repo.repo.id')}/requests", {
headers: {
Authorization: 'token ' + @get('repo.auth')
},
type: "POST"
}).then( =>
@set('isLoading', false)
# @transitionToRoute('repo')
);
`export default NoBuildsComponent`

View File

@ -0,0 +1,20 @@
import Ember from 'ember';
import config from 'travis/config/environment';
export default Ember.Component.extend({
actions: {
triggerBuild() {
var apiEndpoint;
this.set('isLoading', true);
apiEndpoint = config.apiEndpoint;
return $.ajax(apiEndpoint + ("/v3/repo/" + (this.get('repo.repo.id')) + "/requests"), {
headers: {
Authorization: 'token ' + this.get('repo.auth')
},
type: "POST"
}).then(() => {
return this.set('isLoading', false);
});
}
}
});

View File

@ -1,5 +0,0 @@
`import Ember from 'ember'`
NoReposComponent = Ember.Component.extend()
`export default NoReposComponent`

View File

@ -0,0 +1,3 @@
import Ember from 'ember';
export default Ember.Component.extend();

View File

@ -1,5 +0,0 @@
`import Ember from 'ember'`
NotActiveComponent = Ember.Component.extend()
`export default NotActiveComponent`

View File

@ -0,0 +1,3 @@
import Ember from 'ember';
export default Ember.Component.extend();

View File

@ -1,28 +0,0 @@
`import Ember from 'ember'`
OrgItemComponent = Ember.Component.extend
classNames: ['media', 'account']
tagName: 'li'
classNameBindings: ['type', 'selected']
typeBinding: 'account.type'
selectedBinding: 'account.selected'
tokenIsVisible: false
name: (->
@get('account.name') || @get('account.login')
).property('account')
avatarUrl: (->
@get('account.avatarUrl') || false
).property('account')
isUser: (->
@get('account.type') == 'user'
).property('account')
actions:
tokenVisibility: () ->
@toggleProperty('tokenIsVisible')
`export default OrgItemComponent`

View File

@ -0,0 +1,28 @@
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['media', 'account'],
tagName: 'li',
classNameBindings: ['type', 'selected'],
typeBinding: 'account.type',
selectedBinding: 'account.selected',
tokenIsVisible: false,
name: function() {
return this.get('account.name') || this.get('account.login');
}.property('account'),
avatarUrl: function() {
return this.get('account.avatarUrl') || false;
}.property('account'),
isUser: function() {
return this.get('account.type') === 'user';
}.property('account'),
actions: {
tokenVisibility() {
return this.toggleProperty('tokenIsVisible');
}
}
});

View File

@ -1,13 +0,0 @@
`import Ember from 'ember'`
Component = Ember.Component.extend
actions:
toggleOrgFilter: () ->
@toggleProperty('showFilter')
false
select: (org) ->
@toggleProperty('showFilter')
@sendAction('action', org)
`export default Component`

View File

@ -0,0 +1,17 @@
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['organisation-filter'],
actions: {
toggleOrgFilter() {
this.toggleProperty('showFilter');
return false;
},
select(org) {
this.toggleProperty('showFilter');
return this.sendAction('action', org);
}
}
});

View File

@ -1,29 +0,0 @@
`import Ember from 'ember'`
OwnerRepoTileComponent = Ember.Component.extend
tagName: 'li'
classNames: ['owner-tile', 'row-li']
classNameBindings: ['repo.default_branch.last_build.state']
ownerName: (->
@get('repo.slug').split(/\//)[0]
).property('repo.slug')
repoName: (->
@get('repo.slug').split(/\//)[1]
).property('repo.slug')
isAnimating: (->
state = @get('repo.default_branch.last_build.state')
animationStates = ['received', 'queued', 'started', 'booting']
unless animationStates.indexOf(state) == -1
true
).property('repo.default_branch.last_build.state')
`export default OwnerRepoTileComponent`

View File

@ -0,0 +1,24 @@
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'li',
classNames: ['owner-tile', 'row-li'],
classNameBindings: ['repo.default_branch.last_build.state'],
ownerName: function() {
return this.get('repo.slug').split(/\//)[0];
}.property('repo.slug'),
repoName: function() {
return this.get('repo.slug').split(/\//)[1];
}.property('repo.slug'),
isAnimating: function() {
var animationStates, state;
state = this.get('repo.default_branch.last_build.state');
animationStates = ['received', 'queued', 'started', 'booting'];
if (animationStates.indexOf(state) !== -1) {
return true;
}
}.property('repo.default_branch.last_build.state')
});

View File

@ -1,6 +0,0 @@
`import Ember from 'ember'`
`import SyncButton from 'travis/components/sync-button'`
Component = SyncButton.extend()
`export default Component`

View File

@ -0,0 +1,4 @@
import Ember from 'ember';
import SyncButton from 'travis/components/sync-button';
export default SyncButton.extend();

View File

@ -0,0 +1,17 @@
import Ember from 'ember';
export default Ember.Component.extend({
popup: Ember.inject.service(),
classNames: ['application'],
click(event) {
var targetAndParents = $(event.target).parents().andSelf();
if (!(targetAndParents.hasClass('open-popup') || targetAndParents.hasClass('popup'))) {
this.get('popup').close();
}
if (!targetAndParents.hasClass('menu') && !targetAndParents.is('#tools > a')) {
$('.menu').removeClass('display');
}
}
});

View File

@ -0,0 +1,6 @@
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['profile-orglist', 'columns', 'medium-4'],
tagName: 'aside',
});

View File

@ -1,16 +0,0 @@
`import Ember from 'ember'`
`import config from 'travis/config/environment'`
QueuedJobsComponent = Ember.Component.extend
store: Ember.inject.service()
init: ->
@_super.apply this, arguments
if !Ember.testing
Visibility.every config.intervals.updateTimes, @updateTimes.bind(this)
updateTimes: ->
if jobs = @get('jobs')
jobs.forEach (job) -> job.updateTimes()
`export default QueuedJobsComponent`

View File

@ -0,0 +1,18 @@
import Ember from 'ember';
import config from 'travis/config/environment';
export default Ember.Component.extend({
store: Ember.inject.service(),
updateTimesService: Ember.inject.service('updateTimes'),
init() {
this._super.apply(this, arguments);
if (!Ember.testing) {
return Visibility.every(config.intervals.updateTimes, this.updateTimes.bind(this));
}
},
updateTimes() {
this.get('updateTimesService').push(this.get('jobs'));
}
});

View File

@ -1,23 +0,0 @@
`import Ember from 'ember'`
Component = Ember.Component.extend(
actions:
close: ->
$('.popup').removeClass('display')
return false
removeLog: ->
$('.popup').removeClass('display')
job = @get('job')
job.removeLog().then ->
Travis.flash(success: 'Log has been successfully removed.')
, (xhr) ->
if xhr.status == 409
Travis.flash(error: 'Log can\'t be removed')
else if xhr.status == 401
Travis.flash(error: 'You don\'t have sufficient access to remove the log')
else
Travis.flash(error: 'An error occured when removing the log')
)
`export default Component`

View File

@ -0,0 +1,27 @@
import Ember from 'ember';
export default Ember.Component.extend({
actions: {
close() {
$('.popup').removeClass('display');
return false;
},
removeLog() {
var job = this.get('job');
$('.popup').removeClass('display');
return job.removeLog().then(function() {
return Travis.flash({ success: 'Log has been successfully removed.' });
}, function(xhr) {
if (xhr.status === 409) {
return Travis.flash({ error: 'Log can\'t be removed' });
} else if (xhr.status === 401) {
return Travis.flash({ error: 'You don\'t have sufficient access to remove the log' });
} else {
return Travis.flash({ error: 'An error occured when removing the log' });
}
});
}
}
});

View File

@ -1,15 +0,0 @@
`import Ember from 'ember'`
RepoActionsComponent = Ember.Component.extend(
displayCodeClimate: (->
@get('repo.githubLanguage') == 'Ruby'
).property('repo.githubLanguage')
actions:
codeClimatePopup: ->
$('.popup').removeClass('display')
$('#code-climate').addClass('display')
return false
)
`export default RepoActionsComponent`

View File

@ -0,0 +1,7 @@
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['repo-main-tools']
});

View File

@ -1,55 +0,0 @@
`import Ember from 'ember'`
RepoShowTabsComponent = Ember.Component.extend
tagName: 'nav'
classNames: ['tabnav']
ariaRole: 'tablist'
# hrm. how to parametrize bind-attr?
classCurrent: (->
'active' if @get('tab') == 'current'
).property('tab')
classBuilds: (->
'active' if @get('tab') == 'builds'
).property('tab')
classPullRequests: (->
'active' if @get('tab') == 'pull_requests'
).property('tab')
classBranches: (->
'active' if @get('tab') == 'branches'
).property('tab')
classBuild: (->
tab = @get('tab')
classes = []
classes.push('active') if tab == 'build'
classes.push('display-inline') if tab == 'build' || tab == 'job'
classes.join(' ')
).property('tab')
# TODO: refactor tabs, most of the things here are not really DRY
classJob: (->
'active' if @get('tab') == 'job'
).property('tab')
classRequests: (->
'active' if @get('tab') == 'requests'
).property('tab')
classCaches: (->
'active' if @get('tab') == 'caches'
).property('tab')
classSettings: (->
'active' if @get('tab') == 'settings'
).property('tab')
classRequest: (->
'active' if @get('tab') == 'request'
).property('tab')
`export default RepoShowTabsComponent`

View File

@ -0,0 +1,74 @@
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'nav',
classNames: ['tabnav'],
ariaRole: 'tablist',
classCurrent: function() {
if (this.get('tab') === 'current') {
return 'active';
}
}.property('tab'),
classBuilds: function() {
if (this.get('tab') === 'builds') {
return 'active';
}
}.property('tab'),
classPullRequests: function() {
if (this.get('tab') === 'pull_requests') {
return 'active';
}
}.property('tab'),
classBranches: function() {
if (this.get('tab') === 'branches') {
return 'active';
}
}.property('tab'),
classBuild: function() {
var classes, tab;
tab = this.get('tab');
classes = [];
if (tab === 'build') {
classes.push('active');
}
if (tab === 'build' || tab === 'job') {
classes.push('display-inline');
}
return classes.join(' ');
}.property('tab'),
classJob: function() {
if (this.get('tab') === 'job') {
return 'active';
}
}.property('tab'),
classRequests: function() {
if (this.get('tab') === 'requests') {
return 'active';
}
}.property('tab'),
classCaches: function() {
if (this.get('tab') === 'caches') {
return 'active';
}
}.property('tab'),
classSettings: function() {
if (this.get('tab') === 'settings') {
return 'active';
}
}.property('tab'),
classRequest: function() {
if (this.get('tab') === 'request') {
return 'active';
}
}.property('tab')
});

View File

@ -1,49 +0,0 @@
`import Ember from 'ember'`
`import config from 'travis/config/environment'`
RepoShowToolsComponent = Ember.Component.extend
popup: Ember.inject.service()
classNames: ['settings-menu']
classNameBindings: ['isOpen:display']
isOpen: false
click: (event) ->
if $(event.target).is('a') && $(event.target).parents('.settings-dropdown').length
@closeMenu()
closeMenu: ->
@toggleProperty('isOpen')
actions:
menu: ->
@toggleProperty('isOpen')
hasPermission: (->
if permissions = @get('currentUser.permissions')
permissions.contains parseInt(@get('repo.id'))
).property('currentUser.permissions.length', 'repo.id')
hasPushPermission: (->
if permissions = @get('currentUser.pushPermissions')
permissions.contains parseInt(@get('repo.id'))
).property('currentUser.pushPermissions.length', 'repo.id')
hasAdminPermission: (->
if permissions = @get('currentUser.adminPermissions')
permissions.contains parseInt(@get('repo.id'))
).property('currentUser.adminPermissions.length', 'repo.id')
displaySettingsLink: (->
@get('hasPushPermission')
).property('hasPushPermission')
displayCachesLink: (->
@get('hasPushPermission') && config.endpoints.caches
).property('hasPushPermission')
displayStatusImages: (->
@get('hasPermission')
).property('hasPermission')
`export default RepoShowToolsComponent`

View File

@ -0,0 +1,38 @@
import Ember from 'ember';
import config from 'travis/config/environment';
import { hasPermission, hasPushPermission } from 'travis/utils/permission';
export default Ember.Component.extend({
popup: Ember.inject.service(),
classNames: ['option-button'],
classNameBindings: ['isOpen:display'],
isOpen: false,
click(event) {
if ($(event.target).is('a') && $(event.target).parents('.settings-dropdown').length) {
return this.closeMenu();
}
},
closeMenu() {
return this.toggleProperty('isOpen');
},
actions: {
menu() {
return this.toggleProperty('isOpen');
}
},
displaySettingsLink: function() {
return hasPushPermission(this.get('currentUser'), this.get('repo.id'));
}.property('currentUser.pushPermissions.length', 'repo'),
displayCachesLink: function() {
return hasPushPermission(this.get('currentUser'), this.get('repo.id')) && config.endpoints.caches;
}.property('currentUser.pushPermissions.length', 'repo'),
displayStatusImages: function() {
return hasPermission(this.get('currentUser'), this.get('repo.id'));
}.property('currentUser.permissions.length', 'repo.id')
});

View File

@ -0,0 +1,7 @@
import Polling from 'travis/mixins/polling';
import Ember from 'ember';
export default Ember.Component.extend(Polling, {
pollModels: 'repo',
classNameBindings: ['isLoading:loading']
});

View File

@ -1,5 +0,0 @@
`import Ember from 'ember'`
ReposEmptyComponent = Ember.Component.extend()
`export default ReposEmptyComponent`

View File

@ -0,0 +1,3 @@
import Ember from 'ember';
export default Ember.Component.extend();

View File

@ -1,31 +0,0 @@
`import Ember from 'ember'`
`import Polling from 'travis/mixins/polling'`
`import { colorForState } from 'travis/utils/helpers'`
ReposListItemComponent = Ember.Component.extend Polling,
routing: Ember.inject.service('-routing')
tagName: 'li'
pollModels: 'repo'
classNames: ['repo']
classNameBindings: ['selected']
selected: (->
@get('repo') == @get('selectedRepo')
).property('selectedRepo')
color: (->
colorForState(@get('repo.lastBuildState'))
).property('repo.lastBuildState')
scrollTop: (->
if (window.scrollY > 0)
$('html, body').animate({scrollTop: 0}, 200)
)
click: ->
@scrollTop()
@get('routing').transitionTo('repo', @get('repo.slug').split('/'))
`export default ReposListItemComponent`

View File

@ -0,0 +1,27 @@
import Ember from 'ember';
import Polling from 'travis/mixins/polling';
import { colorForState } from 'travis/utils/helpers';
export default Ember.Component.extend(Polling, {
routing: Ember.inject.service('-routing'),
tagName: 'li',
pollModels: 'repo',
classNames: ['repo'],
classNameBindings: ['selected'],
selected: function() {
return this.get('repo') === this.get('selectedRepo');
}.property('selectedRepo'),
color: function() {
return colorForState(this.get('repo.lastBuildState'));
}.property('repo.lastBuildState'),
scrollTop: function() {
if (window.scrollY > 0) {
return $('html, body').animate({
scrollTop: 0
}, 200);
}
}
});

View File

@ -0,0 +1,48 @@
import Ember from 'ember';
export default Ember.Component.extend({
auth: Ember.inject.service(),
currentUserBinding: 'auth.currentUser',
classRecent: function() {
if (this.get('tab') === 'recent') {
return 'active';
} else if (this.get('tab') === 'search' && this.get('auth.signedIn')) {
return 'hidden';
}
}.property('tab'),
classRunning: function() {
var classes;
classes = [];
if (this.get('tab') === 'running') {
classes.push('active');
}
return classes.join(' ');
}.property('tab'),
classOwned: function() {
var classes;
classes = [];
if (this.get('tab') === 'owned') {
classes.push('active');
}
if (this.get('currentUser')) {
classes.push('display-inline');
}
return classes.join(' ');
}.property('tab', 'currentUser'),
classSearch: function() {
if (this.get('tab') === 'search') {
return 'active';
}
}.property('tab'),
classNew: function() {
if (this.get('currentUser')) {
return 'display-inline';
}
}.property('currentUser')
});

View File

@ -1,25 +0,0 @@
`import Ember from 'ember'`
RequestIconComponent = Ember.Component.extend
tagName: 'span'
classNames: ['status-icon', 'icon']
classNameBindings: ['event', 'state']
isPush: (->
@get('event') == 'push'
).property('event')
isPR: (->
@get('event') == 'pull_request'
).property('event')
isAPI: (->
@get('event') == 'api'
).property('event')
isEmpty: (->
true if @get('event') == null || @get('event') == null
).property('event')
`export default RequestIconComponent`

View File

@ -0,0 +1,25 @@
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'span',
classNames: ['request-icon', 'icon'],
classNameBindings: ['event', 'state'],
isPush: function() {
return this.get('event') === 'push';
}.property('event'),
isPR: function() {
return this.get('event') === 'pull_request';
}.property('event'),
isAPI: function() {
return this.get('event') === 'api';
}.property('event'),
isEmpty: function() {
if (this.get('event') === null || this.get('event') === null) {
return true;
}
}.property('event')
});

Some files were not shown because too many files have changed in this diff Show More