Commit Graph

314 Commits

Author SHA1 Message Date
Piotr Sarnacki
b83948f583 Fallback to login if name is not given for a user 2013-01-09 16:42:10 +01:00
Konstantin Haase
5ca5b15f40 Merge branch 'master' of github.com:travis-ci/travis-web 2013-01-08 15:10:59 +01:00
Piotr Sarnacki
ae9ff005d3 Don't throw error when repo can't be find
When visiting page of repo that doesn't exist, we should not throw an
error. It still does not work as expected, redirecting to
/undefined/undefined, which should be addressed as well, but at least we
don't throw errors now.
2013-01-08 15:01:49 +01:00
Konstantin Haase
5b48aa20e7 check scopes 2013-01-07 20:59:54 +01:00
Piotr Sarnacki
938aaafc71 Merge pull request #84 from randym/instrumentation
WIP! Added first level instrumentation for travis-web
2013-01-03 07:13:34 -08:00
Konstantin Haase
cb392b549d reduce logging 2012-12-17 20:33:28 +01:00
Konstantin Haase
f756df1468 typo 2012-12-17 20:17:36 +01:00
Konstantin Haase
12c84d8359 more logging in auth 2012-12-17 20:15:19 +01:00
Konstantin Haase
7ce690aecf add logging 2012-12-17 19:58:34 +01:00
Konstantin Haase
f326960f9a check for token 2012-12-17 15:19:22 +01:00
Konstantin Haase
34aaa070c9 don't check for token for now 2012-12-16 18:14:04 +01:00
Konstantin Haase
946dd55ce3 fix validation 2012-12-16 18:01:44 +01:00
Konstantin Haase
6c87a9c267 more verbose validation 2012-12-16 17:52:59 +01:00
Konstantin Haase
0b7d7a6eec fix typo 2012-12-16 17:44:27 +01:00
Konstantin Haase
de0790c5d9 we might not have user yet 2012-12-16 17:26:52 +01:00
Konstantin Haase
a37dc4dca3 fix for nested user data 2012-12-16 17:20:32 +01:00
Konstantin Haase
43726e4025 fix reference 2012-12-16 17:04:41 +01:00
Konstantin Haase
5d7604567c js and bindings, how does it work? 2012-12-16 17:00:31 +01:00
Konstantin Haase
368ef859ea refactor auth 2012-12-16 16:57:12 +01:00
Sven Fuchs
ab0cb7d432 set auto_signin flag to false before actually trying to sign in 2012-12-16 14:59:43 +01:00
Sven Fuchs
b6df2bfbe1 add Auth.validateUser 2012-12-16 14:25:52 +01:00
Randy Morgan
fa7f8b9332 Added first level instrumentation for travis-web
This is not enabled by default. You need to run:

Travis.Instrumentation.subscribe('render.view')

To start capturing info
2012-12-14 19:31:05 +09:00
Piotr Sarnacki
4bdf94484f Merge branch 'sortable-fix' 2012-12-14 05:12:06 +01:00
Piotr Sarnacki
23a58866bd Fix LimitedArray to work properly with SortableMixin 2012-12-14 04:31:28 +01:00
Piotr Sarnacki
6fd56d4521 Display link to build/job only if id is present already 2012-12-13 15:17:04 +01:00
Piotr Sarnacki
9f7796a023 Use #with helper for job and builds link on tabs
Thanks to that, id will be refreshed when the build changes.
2012-12-13 01:44:42 +01:00
Piotr Sarnacki
25ac08fab6 Missing changes for 9853826, I accidentally undid changes before commiting 2012-12-12 23:45:07 +01:00
Piotr Sarnacki
9853826bae Properly refresh last build link on repos list
value change. Since {{action}} is also not a bound helper, I need some
structure that I can put into {{with}} helper
2012-12-12 23:40:51 +01:00
Piotr Sarnacki
d37da09502 Merge pull request #79 from mrshu/master
Updated links to GitHub hooks page
2012-12-11 07:14:49 -08:00
Piotr Sarnacki
4657ee351b Merge pull request #78 from randym/i18n
Updates and Fixes for Profile and UI to properly handle locale switching
2012-12-11 07:07:54 -08:00
Piotr Sarnacki
fd82bf3791 Use contentArrayWillChange for deleting records from LimitedArray
Using contentArrayDidChange is usless for deletion, because the records
were already deleted, so we can't fetch them from the content array.
2012-12-11 15:51:11 +01:00
mr.Shu
c9ecde2632 updated links to GitHub hooks 2012-12-11 14:58:59 +01:00
Piotr Sarnacki
79e6f5e037 Allow to change the place of insertion for limited array 2012-12-11 14:41:21 +01:00
Randy Morgan
91812fb21c Connected flash outlet for profile 2012-12-11 13:17:24 +09:00
Randy Morgan
0e727819b0 Updated profile view to support auto-updating locale selection 2012-12-11 13:13:54 +09:00
Randy Morgan
992cbb13f7 Removed unsupported locales from profile.
This should be written to populate from the I18n.translations hash but
for now, I am just getting rid of the ones that do not exist.
2012-12-11 10:55:43 +09:00
Randy Morgan
e4fb6c1fee Completed dynamic I18n intetegration.
travis-web starts in English. When the user logs in, it switches to
their locale, when they logout, it goes back to english.
2012-12-11 10:48:19 +09:00
Randy Morgan
667722c663 Fixed User#update_locale to call Travis#updateLocale on locale change 2012-12-11 09:34:44 +09:00
Randy Morgan
e4819d8e0b Fixed I18n handlebars helpers to update when locale changes
Via the console, you can Travis.set('locale', 'ja') and all the labels
will properly update. This should work on User#updateLocale as well but
I am having a devil of a time testing it locally as I cannot sign in.
2012-12-11 08:54:43 +09:00
Piotr Sarnacki
fa5de8ba66 Merge pull request #76 from travis-ci/rkh-correct-status-image
use current host for status images
2012-12-10 08:54:52 -08:00
Piotr Sarnacki
364f6927d3 Don't error out if capitilize helper gets null as an argument 2012-12-10 17:44:15 +01:00
Piotr Sarnacki
8e97b68313 Make the app work with disabled cookies
Browsers disable local storage and session storage when cookies are
disabled - any call to one of those will cause an error. This commit
provides fallback storage, which will store items in memory.
2012-12-10 17:37:09 +01:00
Konstantin Haase
b16f9281c4 use current host for status images 2012-12-10 15:32:01 +01:00
Sven Fuchs
7759061d4e disable "cancel build" 2012-12-10 15:14:12 +01:00
Piotr Sarnacki
8f27943fe4 Kill typo 💣 2012-12-10 14:57:34 +01:00
Piotr Sarnacki
5b0b7d7002 Fix isAttributeLoaded checks
We can't check 'isFinished' when model is asked for
isAttributeLoaded('state'). In such situation, it will go to isFinished
and call @get('state'), which will trigger isAttributeLoaded('state')
again.
2012-12-10 14:26:44 +01:00
Piotr Sarnacki
a662d03ee7 Revert "Don't automatically sign in if there is no token available"
This commit breaks login in Safari, without it people will need log out
and log in again if they experienced 401 requests on the profile page,
but we can't break Safari.

It seems that the root cause of the error is the fact that auto sign in
fails in Safari.

This reverts commit d84b3581eb.
2012-12-10 13:53:35 +01:00
Piotr Sarnacki
0829825a14 Merge pull request #75 from mojavelinux/asciidoc-status-image
Add AsciiDoc markup to the status images dialog
2012-12-10 04:34:26 -08:00
Piotr Sarnacki
d84b3581eb Don't automatically sign in if there is no token available 2012-12-10 11:22:18 +01:00
Piotr Sarnacki
567ba4cc6d Fix storing token when doing auto sign in 2012-12-10 10:42:21 +01:00
Dan Allen
454c1c3e9a add AsciiDoc markup to status images dialog 2012-12-09 17:29:16 -07:00
Sven Fuchs
e2ea999974 try using font/icons for color issues 2012-12-09 15:16:27 +01:00
Sven Fuchs
d005f241ba fix things after rebase 2012-12-09 15:16:27 +01:00
Sven Fuchs
15dc2c503d add state attribute to Branch 2012-12-09 15:16:27 +01:00
Sven Fuchs
395918a406 use states instead of result 2012-12-09 15:16:27 +01:00
Sven Fuchs
f6975e5b02 add cancel menu items 2012-12-09 15:16:27 +01:00
Konstantin Haase
c3e1bb7d67 only sign in once 2012-12-06 17:11:32 +01:00
Konstantin Haase
b4a1535533 check user 2012-12-06 16:58:28 +01:00
Konstantin Haase
3eb4c04f11 Merge branch 'master' into rkh-better-login 2012-12-06 13:52:09 +01:00
Piotr Sarnacki
aca1550933 Fix log tailing 2012-12-06 02:20:53 +01:00
Piotr Sarnacki
27fe85989a Make rendering long logs faster when rendering huge chunks at once
After change log rendering method, to append HTML elements instead of
rerendering the entire thing, the case of gradual rendering of a log
started to behave much better (because we just append new elements), but
the initial render took a bit longer, because of the fact that appending
large separate HTML elements to DOM at once is not a good idea.

In order to make the situation better I added simple optimization.
Elements are added to DocumentFragment node before inserting to DOM and
appended to DOM only after all elements are processed. That way, when
log needs to be rendered all at once, we will not do any DOM operations
until log is ready.
2012-12-05 21:29:41 +01:00
Konstantin Haase
21af8176a1 listen for redirect events 2012-12-05 14:18:32 +01:00
Piotr Sarnacki
c00aa911d7 Add regenerate key option in repo view 2012-12-05 01:59:03 +01:00
Piotr Sarnacki
1385d7f605 Reset log manager on log rerender 2012-12-05 01:42:37 +01:00
Piotr Sarnacki
b718c3aa2b Rerender log 'pre' on requeue 2012-12-05 00:44:29 +01:00
Piotr Sarnacki
4e7329f638 Open fold if folded command returns an error 2012-12-05 00:33:26 +01:00
Piotr Sarnacki
fc40190c29 Optimize log viewer
Till now, log viewer was rendered in handlebars, which was the simplest
solution, but it had a major drawback - every append to log caused it to
rerender which was not efficient and memory consuming.

The new approach is to make Travis.Log interpret the log and send lines
with instructions to the view, so for example if view should add a line,
it gets something like:

    { number: 1, content: '$ bundle install' }

Such approach is required to handle cases where data coming from pusher
is not actually a new line. For example output containing dots from
tests needs to be appended:

    $ rake
    ....

Such output could be sent to client in 2 chunks: "$ rake\n.." and "..".
In such situation we would need to send 3 instructions:

  { number: 1, content: '$ rake' }
  { number: 2, content: '..'     }
  { number: 2, content: '..', append: true }

The third instruction can come much later, because tests can take a
while to run, so we can't assume that each line will come in one piece.

The other scenario is \r, for example when showing progress:

    \rDownloading: 10%
    \rDownloading: 50%
    \rDownloading: 100%

Such input should be changed into such instructions:

  { number: 1, content: 'Downloading: 10%' }
  { number: 1, content: 'Downloading: 50%',  replace: true }
  { number: 1, content: 'Downloading: 100%', replace: true }

Travis.Log also supports folds, for example on bundle install, the code
was rewritten to make folds management simpler.
2012-12-04 22:57:57 +01:00
Piotr Sarnacki
26def07b9d Show 'compiler' in Config and in matrix 2012-12-02 04:01:40 +01:00
Sven Fuchs
038b6b0572 clear log on job:requeued hax 2012-12-01 16:36:55 +01:00
Sven Fuchs
82c2a4f14c accept job:requeue event 2012-12-01 14:45:58 +01:00
Sven Fuchs
808e341227 split requeueBuild vs requeueJob 2012-12-01 03:13:17 +01:00
Piotr Sarnacki
fba6160703 Reload hooks after sync 2012-11-28 21:07:04 +01:00
Piotr Sarnacki
33358b3613 Start polling only after sync request was done 2012-11-28 20:23:56 +01:00
Piotr Sarnacki
d12a444aed Fix parse error on "done" response from the API
We sometimes get "done" as a response body from API when authenticating.
We should properly fix it in the API, but for now I will add this quick
fix to not completely break on login when it happens until we have
proper fix.
2012-11-28 20:19:11 +01:00
Piotr Sarnacki
875295c1a1 Don't allow to change hook's state while it's saving 2012-11-28 20:11:01 +01:00
Piotr Sarnacki
9cb451d68b Fix Travis.Job.queued to update after receiving new jobs 2012-11-28 02:02:30 +01:00
Piotr Sarnacki
d1633e796a Slightly better implementation of showAll for jobs in queues 2012-11-28 00:26:37 +01:00
Piotr Sarnacki
9c8f93f705 Expand all jobs from queue on one click 2012-11-28 00:20:58 +01:00
Piotr Sarnacki
afa1d07fbe Show only first 15 elements from each queue for now
With shitloads of jobs in queues app becomes unusable, this is a quick
solution to make it better.
2012-11-28 00:04:23 +01:00
Piotr Sarnacki
834e45ceb5 Don't require loading repos when dislaying queues and workers 2012-11-27 22:36:15 +01:00
Sven Fuchs
e27b4e56db make sure the profile details table does not break with long translations 2012-11-22 16:42:54 +01:00
Sven Fuchs
174053dfa6 localize top menu links 2012-11-22 16:23:52 +01:00
Piotr Sarnacki
f32038698d Refresh accounts list after sync (closes #55) 2012-11-21 21:20:12 +01:00
Konstantin Haase
7816ab558b increase timeout, api is now taking care of this 2012-11-18 21:11:06 +01:00
Piotr Sarnacki
7af5d4c1b6 Debug info on auth 2012-11-17 12:31:22 +01:00
Piotr Sarnacki
cdbfac1166 Add google analytics 2012-11-17 12:19:30 +01:00
Sven Fuchs
6d0cf9d5e6 Merge branch 'master' of github.com:travis-ci/travis-web 2012-11-16 17:43:39 +01:00
Sven Fuchs
d63af402c1 issue events on user:signed_in and user:synced 2012-11-16 17:43:22 +01:00
Piotr Sarnacki
3084dacaef Update Ember.js from drogus/ember.js and fix routes
Default regexp used in ember does not work well for us. With repos
starting with 'stats', ember will match such url for /stats/ page, even
though the rest of the url is different, I added ability to overwrite
default regexp.
2012-11-16 17:36:13 +01:00
Piotr Sarnacki
cbd25b8821 Revert "Slugs are case insensitive now (closes #51)"
This reverts commit 8fb481cdd0.
2012-11-16 15:42:50 +01:00
Piotr Sarnacki
8fb481cdd0 Slugs are case insensitive now (closes #51) 2012-11-16 15:16:57 +01:00
Sven Fuchs
216724af64 changes for pro 2012-11-15 16:31:54 +01:00
Piotr Sarnacki
9a0e7d5bb6 Merge pull request #50 from KL-7/info-icon-fix
Fix info icon overlapping tabs (in Firefox).
2012-11-12 08:40:31 -08:00
Sven Fuchs
3a7850cd02 abstract out styles for menu from profile 2012-11-12 12:12:57 +01:00
Kirill Lashuk
3d896d6a57 Fix info icon overlapping tabs. 2012-11-12 12:10:32 +03:00
Piotr Sarnacki
a039da5dd1 Fix showMore
We use ArrayProxy with SortableMixin as container for builds, so
it needs to proxy load method to expandable record array.

closes #49
2012-11-10 16:34:01 +01:00
Piotr Sarnacki
630de8efc3 We should display travis token, not github one in profile 2012-11-10 15:47:34 +01:00
Sven Fuchs
d94b001e81 restore isLoaded for repos controller 2012-11-10 04:21:49 +01:00
Piotr Sarnacki
d19d5003d0 Don't error out when the only response is result: true 2012-11-08 03:37:22 +01:00
Piotr Sarnacki
cc1df67272 We don't need to check isComplete now
We load records based on the tries to load attributes that are not
loaded yet, so isComplete is obsolete now.
2012-11-06 20:30:38 +01:00
Piotr Sarnacki
b164e5f1a8 Load commit from build:started event payload
Commit fields come in with build:started payload. We should split it
into 2 separate keys in the payload, like:

    {
      build:  { .... },
      commit: { .... }
    }

but I can't change pusher v1 API at the moment, due to backwards
compatibility with the old client. We will be able to remove this manual
extraction as soon as we switch to pusher v2 API.
2012-11-06 14:34:18 +01:00
Piotr Sarnacki
380f89435b startedAt attribute for job is not needed in created state 2012-11-06 14:30:46 +01:00
Piotr Sarnacki
6a1bc67fa7 Remove console.log 2012-11-06 12:06:51 +01:00
Piotr Sarnacki
b66e5a9bb3 Fix missing commit in UI on job:started event 2012-11-06 12:06:09 +01:00
Piotr Sarnacki
a91657c128 We don't keep duration for jobs
We always just return finished at and started at for jobs, so just let
travis always calculate duration from those fields.
2012-11-06 11:45:33 +01:00
Piotr Sarnacki
90474edd8b Pass repo instead of slug in showJob
The old version saves us some requets, but is harder to maintain, also
repos in workers should now be sideloaded from pusher payload.
2012-11-05 22:35:01 +01:00
Piotr Sarnacki
eebbe6f77b Sort builds on builds/PRs/branches tabs 2012-11-04 15:56:28 +01:00
Piotr Sarnacki
dff93c93fe Don't require some of the attributes for incomplete records
When build or job is not finished, we don't need to load the record
because of them, they will be loaded when 'finished' events come in.
2012-10-31 16:10:42 +01:00
Piotr Sarnacki
baa95d590d Check if data is an object
I couldn't reproduce it locally, but I got this exception once. This
implementation will need to be rewritten after upgrading to newest
ember, so I'll leave it as it is for now.
2012-10-31 00:48:46 +01:00
Piotr Sarnacki
e897008a2d Remove events tab for now 2012-10-31 00:48:46 +01:00
Piotr Sarnacki
a8e85dc714 Handle case where key on data needs Ember.set
I'm not really sure what cauese a field to be defined as such setter,
but it sometimes happens.
2012-10-27 03:50:16 +02:00
Piotr Sarnacki
63e2a9add6 payload.job.id is not always present in worker:updated event 2012-10-27 03:43:01 +02:00
Piotr Sarnacki
40ef7107f4 Don't add repository on worker events if it already exists
It's best to do that, because worker payload is usually outdated. If
there is no info on repo yet, it's worth to add it, but if it already
exists, we will most likely end up with inconsistent situation.
2012-10-27 03:11:15 +02:00
Piotr Sarnacki
94bff24f2c Fix build link when updating builds through pusher 2012-10-27 00:50:34 +02:00
Piotr Sarnacki
5eb3ab3b01 Fix adding builds to a build list on pusher event 2012-10-26 22:35:10 +02:00
Piotr Sarnacki
a7faec7479 Make sure that repo.slug is loaded for queue urls 2012-10-24 22:37:24 +02:00
Piotr Sarnacki
231f3b8723 Load worker related records from pusher payload 2012-10-24 11:28:01 +02:00
Konstantin Haase
a1fb0ff2be bump up auth timeout 2012-10-23 21:25:22 +02:00
Piotr Sarnacki
a63ac52458 Remove layout views, just change template on application 2012-10-23 01:40:05 +02:00
Piotr Sarnacki
349a4d104e Fix scrolling issues for 'Follow logs' 2012-10-22 21:30:26 +02:00
Piotr Sarnacki
72f14fb594 Do not trigger unnecessary reloads when locale *could* have changed 2012-10-22 21:29:51 +02:00
Piotr Sarnacki
3fdd2d50ab Get back to old version of log number scrolling 2012-10-22 21:29:14 +02:00
Piotr Sarnacki
c02f4d860b Fix errors with reload 2012-10-22 19:54:53 +02:00
Piotr Sarnacki
300ad58516 Fix incomplete implementation
While testing in the wild I spotted a few problems with it:

* it didn't work for camel case names.
* it was sometimes setting loaded data too late - it needed to use find
  and then save data on the record. Instead it should save data in
  special array saved on store, indexed by clientId
* there is already method to get attributes in ember-data, it just
  doesn't work with Travis.Foo.get('attributes'), it needs
  Ember.get(Travis.Foo, 'attributes') - it makes implementation much
  shorter
2012-10-22 02:54:48 +02:00
Piotr Sarnacki
6cfddfd882 Change log.isLoaded to view.job.log.isLoaded
For some weird reason Ember errors out when it's called directly on
context (which is job in this place).
2012-10-21 20:48:24 +02:00
Piotr Sarnacki
60740a8d3d Remove router hacks
I've implemented things that we need into Ember. We're running from my
fork for now, ideally those changes will be merged into official repo.
2012-10-20 16:36:53 +02:00
Piotr Sarnacki
0587991533 Fix scrolling to line numbers
After some of the layout changes, the element that actually gets
scrolled is current layout view (.application > div).
2012-10-20 15:43:17 +02:00
Piotr Sarnacki
af00392d15 Fix jobs table when jobs have different config keys
If we have 2 jobs within 1 build, with such config values:

    { rvm: 'jruby-head', jdk: 'oraclejdk7' }
    { rvm: '1.9.3', jdk: null }

We should return jdk in configValues for second build, even if it's not
present. Otherwise table rows may be missing.

(closes #28)
2012-10-20 02:14:17 +02:00
Sven Fuchs
f790a809ff remove debug output 2012-10-19 22:24:57 +02:00
Sven Fuchs
853606bcc6 moar routing/auth refactorings 2012-10-19 22:20:45 +02:00
Sven Fuchs
c4b91108a0 refactor routes/auth interaction so that it always calls afterSignIn() 2012-10-19 21:24:18 +02:00
Sven Fuchs
786d8ebfc6 use an html char here 2012-10-19 16:04:23 +02:00
Sven Fuchs
a806dd7ff8 refactor broadcasts 2012-10-19 04:27:07 +02:00
Sven Fuchs
eca5d1902f check both repos.isLoaded and repos.length before rendering empty; set height to 100% 2012-10-19 02:46:39 +02:00
Sven Fuchs
45cc6a47e3 fix top menu active item styles 2012-10-19 00:33:39 +02:00
Sven Fuchs
52bdbf5468 Merge branch 'master' of github.com:travis-ci/travis-web
Conflicts:
	public/scripts/app.js
	public/scripts/min/app.js
	public/styles/app.css
	public/version
	script/server
2012-10-18 03:55:17 +02:00
Sven Fuchs
90fb2c3b78 add broadcasts 2012-10-18 03:53:19 +02:00
Piotr Sarnacki
82163346b9 We don't have to transitionTo('root') here 2012-10-18 03:38:45 +02:00
Piotr Sarnacki
cb76de3718 Move afterSignIn to auth Route
If we keep it only on states lower than root and afterSignIn is sent
when app is still in root.loading (which is often the case as we need to
wait for repository deserialization), it will try to find afterSignIn on
root.
2012-10-18 03:28:29 +02:00
Sven Fuchs
03595db5fa re-add guard, rename "profile" menu item to "accounts" and add the github badge to the accounts sidebar 2012-10-17 03:21:28 +02:00
Sven Fuchs
1446fe7aa7 Merge branch 'master' of github.com:travis-ci/travis-web
Conflicts:
	Gemfile.lock
	public/scripts/app.js
	public/scripts/min/app.js
	public/version
2012-10-16 22:47:43 +02:00
Sven Fuchs
510be92eb7 stashing some work on the events log 2012-10-16 22:46:10 +02:00
Piotr Sarnacki
ce534fdcb8 Make layout work for smaller resolutions 2012-10-16 22:29:00 +02:00
Piotr Sarnacki
c9a578a012 Fix log scrolling issues on Firefox 2012-10-16 21:30:02 +02:00
Piotr Sarnacki
0bb3eff03b Fix popup positioning and make sure popups always open properly
(closes #24)
2012-10-16 19:41:57 +02:00
Piotr Sarnacki
e278f007a7 Properly set token on user record (closes #25) 2012-10-16 18:35:18 +02:00
Piotr Sarnacki
c05ce673bf Load incomplete records when trying to get unknown attribute
In order to minimize ajax requests, I implemented isComplete property,
which can be used to check if record is fetched from the API or if it
was just partially loaded (for example by pusher event). This is nice in
terms of requests reduction, but caries risk of showing incomplete data.

This commit fixes this situation by saving which attributes were
provided on "incomplete" load and triggering refresh when any unknown
attribute is tried to be fetched.

The implementation is really simple and will probably need refactoring,
but I would like to test it in the wild before putting much more time
into it.
2012-10-16 03:05:38 +02:00
Sven Fuchs
393ef62eae Merge branch 'master' of github.com:travis-ci/travis-web
Conflicts:
	public/scripts/app.js
	public/scripts/min/app.js
	public/styles/app.css
	public/version
2012-10-16 02:05:17 +02:00
Sven Fuchs
f91622e7e8 add an events tab 2012-10-16 02:00:24 +02:00
Piotr Sarnacki
4153c990be Fix specs 2012-10-15 23:20:33 +02:00