Little refactoring of all assets. JS code better identing.

This commit is contained in:
Alexander Simonov 2015-07-12 22:32:46 +03:00
parent 78a30c8d59
commit 229e88a438
No known key found for this signature in database
GPG Key ID: 5CCFFED829314C35
12 changed files with 2112 additions and 2064 deletions

View File

@ -10,37 +10,37 @@
<link href='//fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'> <link href='//fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/icon?family=Material+Icons' rel='stylesheet' type='text/css'> <link href='//fonts.googleapis.com/icon?family=Material+Icons' rel='stylesheet' type='text/css'>
<link href='//cdnjs.cloudflare.com/ajax/libs/octicons/2.1.2/octicons.min.css' rel='stylesheet' type='text/css'> <link href='//cdnjs.cloudflare.com/ajax/libs/octicons/2.1.2/octicons.min.css' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Droid+Sans+Mono" /> <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Droid+Sans+Mono"/>
<link href='/static/styles/drone.css' rel='stylesheet' type='text/css'> <link href='/static/styles/drone.css' rel='stylesheet' type='text/css'>
<link rel="icon" href="/static/favicon.png"> <link rel="icon" href="/static/favicon.png">
</head> </head>
<body> <body>
<div ui-view="layout"></div> <div ui-view="layout"></div>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-route.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-route.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-resource.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-resource.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui/0.4.0/angular-ui.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui/0.4.0/angular-ui.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.15/angular-ui-router.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.15/angular-ui-router.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.6.0/moment.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.6.0/moment.min.js"></script>
<!-- main javascript application --> <!-- main javascript application -->
<script src="/static/scripts/term.js"></script> <script src="/static/scripts/term.js"></script>
<script src="/static/scripts/drone.js"></script> <script src="/static/scripts/drone.js"></script>
<script src="/static/scripts/controllers/repos.js"></script> <script src="/static/scripts/controllers/repos.js"></script>
<script src="/static/scripts/controllers/builds.js"></script> <script src="/static/scripts/controllers/builds.js"></script>
<script src="/static/scripts/controllers/users.js"></script> <script src="/static/scripts/controllers/users.js"></script>
<script src="/static/scripts/services/repos.js"></script> <script src="/static/scripts/services/repos.js"></script>
<script src="/static/scripts/services/builds.js"></script> <script src="/static/scripts/services/builds.js"></script>
<script src="/static/scripts/services/users.js"></script> <script src="/static/scripts/services/users.js"></script>
<script src="/static/scripts/services/logs.js"></script> <script src="/static/scripts/services/logs.js"></script>
<script src="/static/scripts/services/tokens.js"></script> <script src="/static/scripts/services/tokens.js"></script>
<script src="/static/scripts/services/feed.js"></script> <script src="/static/scripts/services/feed.js"></script>
<script src="/static/scripts/filters/filter.js"></script> <script src="/static/scripts/filters/filter.js"></script>
<script src="/static/scripts/filters/gravatar.js"></script> <script src="/static/scripts/filters/gravatar.js"></script>
<script src="/static/scripts/filters/time.js"></script> <script src="/static/scripts/filters/time.js"></script>
</body> </body>
</html> </html>

View File

@ -7,42 +7,42 @@
function BuildsCtrl($scope, $stateParams, builds, repos, users, logs) { function BuildsCtrl($scope, $stateParams, builds, repos, users, logs) {
var owner = $stateParams.owner; var owner = $stateParams.owner;
var name = $stateParams.name; var name = $stateParams.name;
var fullName = owner+'/'+name; var fullName = owner + '/' + name;
// Gets the currently authenticated user // Gets the currently authenticated user
users.getCached().then(function(payload){ users.getCached().then(function (payload) {
$scope.user = payload.data; $scope.user = payload.data;
}); });
// Gets a repository // Gets a repository
repos.get(fullName).then(function(payload){ repos.get(fullName).then(function (payload) {
$scope.repo = payload.data; $scope.repo = payload.data;
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
// Gets a list of builds // Gets a list of builds
builds.list(fullName).then(function(payload){ builds.list(fullName).then(function (payload) {
$scope.builds = angular.isArray(payload.data) ? payload.data : []; $scope.builds = angular.isArray(payload.data) ? payload.data : [];
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
$scope.watch = function(repo) { $scope.watch = function (repo) {
repos.watch(repo.full_name).then(function(payload) { repos.watch(repo.full_name).then(function (payload) {
$scope.repo.starred = true; $scope.repo.starred = true;
}); });
} };
$scope.unwatch = function(repo) { $scope.unwatch = function (repo) {
repos.unwatch(repo.full_name).then(function() { repos.unwatch(repo.full_name).then(function () {
$scope.repo.starred = false; $scope.repo.starred = false;
}); });
} };
repos.subscribe(fullName, function(event) { repos.subscribe(fullName, function (event) {
var added = false; var added = false;
for (var i=0;i<$scope.builds.length;i++) { for (var i = 0; i < $scope.builds.length; i++) {
var build = $scope.builds[i]; var build = $scope.builds[i];
if (event.number !== build.number) { if (event.number !== build.number) {
continue; // ignore continue; // ignore
@ -68,28 +68,28 @@
var number = $stateParams.number; var number = $stateParams.number;
var owner = $stateParams.owner; var owner = $stateParams.owner;
var name = $stateParams.name; var name = $stateParams.name;
var fullName = owner+'/'+name; var fullName = owner + '/' + name;
// Gets the currently authenticated user // Gets the currently authenticated user
users.getCached().then(function(payload){ users.getCached().then(function (payload) {
$scope.user = payload.data; $scope.user = payload.data;
}); });
// Gets a repository // Gets a repository
repos.get(fullName).then(function(payload){ repos.get(fullName).then(function (payload) {
$scope.repo = payload.data; $scope.repo = payload.data;
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
// Gets the build // Gets the build
builds.get(fullName, number).then(function(payload){ builds.get(fullName, number).then(function (payload) {
$scope.build = payload.data; $scope.build = payload.data;
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
repos.subscribe(fullName, function(event) { repos.subscribe(fullName, function (event) {
if (event.number !== parseInt(number)) { if (event.number !== parseInt(number)) {
return; // ignore return; // ignore
} }
@ -109,47 +109,47 @@
var number = $stateParams.number; var number = $stateParams.number;
var owner = $stateParams.owner; var owner = $stateParams.owner;
var name = $stateParams.name; var name = $stateParams.name;
var fullName = owner+'/'+name; var fullName = owner + '/' + name;
var streaming = false; var streaming = false;
var tail = false; var tail = false;
// Initiates streaming a build. // Initiates streaming a build.
var stream = function() { var stream = function () {
if (streaming) { if (streaming) {
return; return;
} }
streaming = true; streaming = true;
var convert = new Filter({stream:true,newline:false}); var convert = new Filter({stream: true, newline: false});
var term = document.getElementById("term"); var term = document.getElementById("term");
term.innerHTML = ""; term.innerHTML = "";
// subscribes to the build otuput. // subscribes to the build otuput.
logs.subscribe(fullName, number, step, function(data){ logs.subscribe(fullName, number, step, function (data) {
term.innerHTML += convert.toHtml(data.replace("\\n","\n")); term.innerHTML += convert.toHtml(data.replace("\\n", "\n"));
if (tail) { if (tail) {
// scrolls to the bottom of the page if enabled // scrolls to the bottom of the page if enabled
$window.scrollTo(0, $window.document.body.scrollHeight); $window.scrollTo(0, $window.document.body.scrollHeight);
} }
}); });
} };
// Gets the currently authenticated user // Gets the currently authenticated user
users.getCached().then(function(payload){ users.getCached().then(function (payload) {
$scope.user = payload.data; $scope.user = payload.data;
}); });
// Gets a repository // Gets a repository
repos.get(fullName).then(function(payload){ repos.get(fullName).then(function (payload) {
$scope.repo = payload.data; $scope.repo = payload.data;
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
// Gets the build // Gets the build
builds.get(fullName, number).then(function(payload){ builds.get(fullName, number).then(function (payload) {
$scope.build = payload.data; $scope.build = payload.data;
$scope.task = payload.data.jobs[step-1]; $scope.task = payload.data.jobs[step - 1];
if (['pending', 'killed'].indexOf($scope.task.status) !== -1) { if (['pending', 'killed'].indexOf($scope.task.status) !== -1) {
// do nothing // do nothing
@ -159,47 +159,47 @@
} else { } else {
// fetch the logs for the finished build. // fetch the logs for the finished build.
logs.get(fullName, number, step).then(function(payload){ logs.get(fullName, number, step).then(function (payload) {
var convert = new Filter({stream:false,newline:false}); var convert = new Filter({stream: false, newline: false});
var term = document.getElementById("term") var term = document.getElementById("term")
term.innerHTML = convert.toHtml(payload.data); term.innerHTML = convert.toHtml(payload.data);
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
} }
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
$scope.restart = function() { $scope.restart = function () {
builds.restart(fullName, number).then(function(payload){ builds.restart(fullName, number).then(function (payload) {
$scope.build = payload.data; $scope.build = payload.data;
$scope.task = payload.data.builds[step-1]; $scope.task = payload.data.builds[step - 1];
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
}; };
$scope.cancel = function() { $scope.cancel = function () {
builds.cancel(fullName, number).then(function(payload){ builds.cancel(fullName, number).then(function (payload) {
$scope.build = payload.data; $scope.build = payload.data;
$scope.task = payload.data.builds[step-1]; $scope.task = payload.data.builds[step - 1];
}).catch(function(err) { }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
}; };
$scope.tail = function() { $scope.tail = function () {
tail = !tail; tail = !tail;
}; };
repos.subscribe(fullName, function(event) { repos.subscribe(fullName, function (event) {
if (event.number !== parseInt(number)) { if (event.number !== parseInt(number)) {
return; // ignore return; // ignore
} }
// update the build // update the build
$scope.build = event; $scope.build = event;
$scope.task = event.builds[step-1]; $scope.task = event.builds[step - 1];
$scope.$apply(); $scope.$apply();
// start streaming the current build // start streaming the current build

View File

@ -6,15 +6,15 @@
*/ */
function ReposCtrl($scope, $stateParams, repos, users) { function ReposCtrl($scope, $stateParams, repos, users) {
// Gets the currently authenticated user // Gets the currently authenticated user
users.getCached().then(function(payload){ users.getCached().then(function (payload) {
$scope.user = payload.data; $scope.user = payload.data;
}); });
// Gets a list of repos to display in the // Gets a list of repos to display in the
// dropdown. // dropdown.
repos.list().then(function(payload){ repos.list().then(function (payload) {
$scope.repos = angular.isArray(payload.data) ? payload.data : []; $scope.repos = angular.isArray(payload.data) ? payload.data : [];
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
} }
@ -26,14 +26,14 @@
function RepoAddCtrl($scope, $location, repos, users) { function RepoAddCtrl($scope, $location, repos, users) {
// Gets the currently authenticated user // Gets the currently authenticated user
users.getCached().then(function(payload){ users.getCached().then(function (payload) {
$scope.user = payload.data; $scope.user = payload.data;
}); });
$scope.add = function(slug) { $scope.add = function (slug) {
repos.post(slug).then(function(payload) { repos.post(slug).then(function (payload) {
$location.path('/'+slug); $location.path('/' + slug);
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
} }
@ -45,63 +45,63 @@
function RepoEditCtrl($scope, $window, $location, $stateParams, repos, users) { function RepoEditCtrl($scope, $window, $location, $stateParams, repos, users) {
var owner = $stateParams.owner; var owner = $stateParams.owner;
var name = $stateParams.name; var name = $stateParams.name;
var fullName = owner+'/'+name; var fullName = owner + '/' + name;
// Inject window for composing url // Inject window for composing url
$scope.window = $window; $scope.window = $window;
// Gets the currently authenticated user // Gets the currently authenticated user
users.getCached().then(function(payload){ users.getCached().then(function (payload) {
$scope.user = payload.data; $scope.user = payload.data;
}); });
// Gets a repository // Gets a repository
repos.get(fullName).then(function(payload){ repos.get(fullName).then(function (payload) {
$scope.repo = payload.data; $scope.repo = payload.data;
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
$scope.save = function(repo) { $scope.save = function (repo) {
repo.timeout = parseInt(repo.timeout); repo.timeout = parseInt(repo.timeout);
repos.update(repo).then(function(payload) { repos.update(repo).then(function (payload) {
$scope.repo = payload.data; $scope.repo = payload.data;
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
} };
$scope.delete = function(repo) { $scope.delete = function (repo) {
repos.delete(repo).then(function(payload) { repos.delete(repo).then(function (payload) {
$location.path('/'); $location.path('/');
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
} };
$scope.param={} $scope.param = {};
$scope.addParam = function(param) { $scope.addParam = function (param) {
if (!$scope.repo.params) { if (!$scope.repo.params) {
$scope.repo.params = {} $scope.repo.params = {}
} }
$scope.repo.params[param.key]=param.value; $scope.repo.params[param.key] = param.value;
$scope.param={} $scope.param = {};
// auto-update // auto-update
repos.update($scope.repo).then(function(payload) { repos.update($scope.repo).then(function (payload) {
$scope.repo = payload.data; $scope.repo = payload.data;
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
} };
$scope.deleteParam = function(key) { $scope.deleteParam = function (key) {
delete $scope.repo.params[key]; delete $scope.repo.params[key];
// auto-update // auto-update
repos.update($scope.repo).then(function(payload) { repos.update($scope.repo).then(function (payload) {
$scope.repo = payload.data; $scope.repo = payload.data;
}).catch(function(err){ }).catch(function (err) {
$scope.error = err; $scope.error = err;
}); });
} }

View File

@ -38,15 +38,15 @@
* Defines the route configuration for the * Defines the route configuration for the
* main application. * main application.
*/ */
function Config ($stateProvider, $httpProvider, $locationProvider) { function Config($stateProvider, $httpProvider, $locationProvider) {
// Resolver that will attempt to load the currently // Resolver that will attempt to load the currently
// authenticated user prior to loading the page. // authenticated user prior to loading the page.
var resolveUser = { var resolveUser = {
user: function(users) { user: function (users) {
return users.getCached(); return users.getCached();
} }
} };
$stateProvider $stateProvider
.state('app', { .state('app', {
@ -55,14 +55,12 @@
'layout': { 'layout': {
templateUrl: '/static/scripts/views/layout.html', templateUrl: '/static/scripts/views/layout.html',
controller: function ($scope, $routeParams, repos, users) { controller: function ($scope, $routeParams, repos, users) {
users.getCached().then(function(payload){ users.getCached().then(function (payload) {
$scope.user = payload.data; $scope.user = payload.data;
console.log(repos.list());
}); });
} }
} }
}, }
resolve: resolveUser
}) })
.state('app.index', { .state('app.index', {
url: '/', url: '/',
@ -87,7 +85,7 @@
.state('app.profile', { .state('app.profile', {
url: '/profile', url: '/profile',
views: { views: {
'toolbar': { templateUrl: '/static/scripts/views/profile/toolbar.html' }, 'toolbar': {templateUrl: '/static/scripts/views/profile/toolbar.html'},
'content': { 'content': {
templateUrl: '/static/scripts/views/profile/content.html', templateUrl: '/static/scripts/views/profile/content.html',
controller: 'UserCtrl', controller: 'UserCtrl',
@ -99,7 +97,7 @@
.state('app.users', { .state('app.users', {
url: '/users', url: '/users',
views: { views: {
'toolbar': { templateUrl: '/static/scripts/views/users/toolbar.html' }, 'toolbar': {templateUrl: '/static/scripts/views/users/toolbar.html'},
'content': { 'content': {
templateUrl: '/static/scripts/views/users/content.html', templateUrl: '/static/scripts/views/users/content.html',
controller: 'UsersCtrl', controller: 'UsersCtrl',
@ -111,7 +109,7 @@
.state('app.new_repo', { .state('app.new_repo', {
url: '/new', url: '/new',
views: { views: {
'toolbar': { templateUrl: '/static/scripts/views/repos/add/toolbar.html' }, 'toolbar': {templateUrl: '/static/scripts/views/repos/add/toolbar.html'},
'content': { 'content': {
templateUrl: '/static/scripts/views/repos/add/content.html', templateUrl: '/static/scripts/views/repos/add/content.html',
controller: 'RepoAddCtrl', controller: 'RepoAddCtrl',
@ -136,17 +134,24 @@
.state('app.repo_edit', { .state('app.repo_edit', {
url: '/:owner/:name/edit', url: '/:owner/:name/edit',
views: { views: {
'toolbar': { templateUrl: '/static/scripts/views/repos/toolbar.html' }, 'toolbar': {
'content': { templateUrl: '/static/scripts/views/repos/edit.html' } templateUrl: '/static/scripts/views/repos/toolbar.html',
},
controller: 'RepoEditCtrl', controller: 'RepoEditCtrl',
resolve: resolveUser resolve: resolveUser
},
'content': {
templateUrl: '/static/scripts/views/repos/edit.html',
controller: 'RepoEditCtrl',
resolve: resolveUser
}
},
title: 'Edit Repository'
}) })
.state('app.repo.env', { .state('app.repo.env', {
url: '/:owner/:name/edit/env', url: '/:owner/:name/edit/env',
views: { views: {
'toolbar': { templateUrl: '/static/scripts/views/repos/toolbar.html' }, 'toolbar': {templateUrl: '/static/scripts/views/repos/toolbar.html'},
'content': { templateUrl: '/static/scripts/views/repos/env.html' } 'content': {templateUrl: '/static/scripts/views/repos/env.html'}
}, },
controller: 'RepoEditCtrl', controller: 'RepoEditCtrl',
resolve: resolveUser resolve: resolveUser
@ -154,8 +159,8 @@
.state('app.repo.del', { .state('app.repo.del', {
url: '/:owner/:name/delete', url: '/:owner/:name/delete',
views: { views: {
'toolbar': { templateUrl: '/static/scripts/views/repos/toolbar.html' }, 'toolbar': {templateUrl: '/static/scripts/views/repos/toolbar.html'},
'content': { templateUrl: '/static/scripts/views/repos/del.html' } 'content': {templateUrl: '/static/scripts/views/repos/del.html'}
}, },
controller: 'RepoEditCtrl', controller: 'RepoEditCtrl',
resolve: resolveUser resolve: resolveUser
@ -163,8 +168,8 @@
.state('app.build', { .state('app.build', {
url: '/:owner/:name/:number', url: '/:owner/:name/:number',
views: { views: {
'toolbar': { templateUrl: '/static/scripts/views/builds/show/toolbar.html' }, 'toolbar': {templateUrl: '/static/scripts/views/builds/show/toolbar.html'},
'content': { templateUrl: '/static/scripts/views/builds/show/content.html' } 'content': {templateUrl: '/static/scripts/views/builds/show/content.html'}
}, },
controller: 'BuildCtrl', controller: 'BuildCtrl',
resolve: resolveUser resolve: resolveUser
@ -172,25 +177,25 @@
.state('app.build_step', { .state('app.build_step', {
url: '/:owner/:name/:number/:step', url: '/:owner/:name/:number/:step',
views: { views: {
'toolbar': { templateUrl: '/static/scripts/views/builds/step/toolbar.html' }, 'toolbar': {templateUrl: '/static/scripts/views/builds/step/toolbar.html'},
'content': { templateUrl: '/static/scripts/views/builds/step/content.html' } 'content': {templateUrl: '/static/scripts/views/builds/step/content.html'}
}, },
controller: 'BuildOutCtrl', controller: 'BuildOutCtrl',
resolve: resolveUser resolve: resolveUser
}) });
// Enables html5 mode // Enables html5 mode
$locationProvider.html5Mode(true) $locationProvider.html5Mode(true);
// Appends the Bearer token to authorize every // Appends the Bearer token to authorize every
// outbound http request. // outbound http request.
$httpProvider.defaults.headers.common.Authorization = 'Bearer '+localStorage.getItem('access_token'); $httpProvider.defaults.headers.common.Authorization = 'Bearer ' + localStorage.getItem('access_token');
// Intercepts every oubput http response and redirects // Intercepts every oubput http response and redirects
// the user to the logic screen if the request was rejected. // the user to the logic screen if the request was rejected.
$httpProvider.interceptors.push(function($q, $location) { $httpProvider.interceptors.push(function ($q, $location) {
return { return {
'responseError': function(rejection) { 'responseError': function (rejection) {
if (rejection.status === 401 && rejection.config.url !== "/api/user") { if (rejection.status === 401 && rejection.config.url !== "/api/user") {
$location.path('/login'); $location.path('/login');
} }
@ -204,14 +209,13 @@
}); });
} }
function RouteChange($rootScope, repos, logs) { function RouteChange($rootScope, repos, logs) {
$rootScope.$on('$stateChangeStart', function () { $rootScope.$on('$stateChangeStart', function () {
repos.unsubscribe(); // repos.unsubscribe();
logs.unsubscribe(); // logs.unsubscribe();
}); });
$rootScope.$on('$stateChangeSuccess', function (event, current, previous) { $rootScope.$on('$stateChangeSuccess', function (event, current) {
if (current.title) { if (current.title) {
document.title = current.title + ' · drone'; document.title = current.title + ' · drone';
} }

View File

@ -15,7 +15,7 @@
/** /**
* Gets a list of all repositories. * Gets a list of all repositories.
*/ */
this.list = function() { this.list = function () {
return $http.get('/api/user/repos'); return $http.get('/api/user/repos');
}; };
@ -24,8 +24,8 @@
* *
* @param {string} Name of the repository. * @param {string} Name of the repository.
*/ */
this.get = function(repoName) { this.get = function (repoName) {
return $http.get('/api/repos/'+repoName); return $http.get('/api/repos/' + repoName);
}; };
/** /**
@ -33,7 +33,7 @@
* *
* @param {object} JSON representation of a repository. * @param {object} JSON representation of a repository.
*/ */
this.post = function(repoName) { this.post = function (repoName) {
return $http.post('/api/repos/' + repoName); return $http.post('/api/repos/' + repoName);
}; };
@ -42,8 +42,8 @@
* *
* @param {object} JSON representation of a repository. * @param {object} JSON representation of a repository.
*/ */
this.update = function(repo) { this.update = function (repo) {
return $http.patch('/api/repos/'+repo.full_name, repo); return $http.patch('/api/repos/' + repo.full_name, repo);
}; };
/** /**
@ -51,8 +51,8 @@
* *
* @param {string} Name of the repository. * @param {string} Name of the repository.
*/ */
this.delete = function(repoName) { this.delete = function (repoName) {
return $http.delete('/api/repos/'+repoName); return $http.delete('/api/repos/' + repoName);
}; };
/** /**
@ -60,8 +60,8 @@
* *
* @param {string} Name of the repository. * @param {string} Name of the repository.
*/ */
this.watch = function(repoName) { this.watch = function (repoName) {
return $http.post('/api/repos/'+repoName+'/watch'); return $http.post('/api/repos/' + repoName + '/watch');
}; };
/** /**
@ -69,8 +69,8 @@
* *
* @param {string} Name of the repository. * @param {string} Name of the repository.
*/ */
this.unwatch = function(repoName) { this.unwatch = function (repoName) {
return $http.delete('/api/repos/'+repoName+'/unwatch'); return $http.delete('/api/repos/' + repoName + '/unwatch');
}; };
@ -83,10 +83,10 @@
* *
* @param {string} Name of the repository. * @param {string} Name of the repository.
*/ */
this.subscribe = function(repo, _callback) { this.subscribe = function (repo, _callback) {
callback = _callback; callback = _callback;
events = new EventSource("/api/stream/" + repo + "?access_token=" + token, { withCredentials: true }); events = new EventSource("/api/stream/" + repo + "?access_token=" + token, {withCredentials: true});
events.onmessage = function (event) { events.onmessage = function (event) {
if (callback !== undefined) { if (callback !== undefined) {
callback(angular.fromJson(event.data)); callback(angular.fromJson(event.data));
@ -102,7 +102,7 @@
}; };
}; };
this.unsubscribe = function() { this.unsubscribe = function () {
callback = undefined; callback = undefined;
if (events !== undefined) { if (events !== undefined) {
events.close(); events.close();

View File

@ -1,34 +1,38 @@
<style> <style>
html, body { html, body {
background:#EEEEEE; background: #EEEEEE;
padding:0px; padding: 0px;
margin:0px; margin: 0px;
font-family:"Roboto"; font-family: "Roboto";
font-size:15px; font-size: 15px;
text-transform:uppercase; text-transform: uppercase;
width:100%; width: 100%;
height:100%; height: 100%;
} }
a.box { a.box {
background:#FFF; background: #FFF;
width:250px; width: 250px;
padding:20px; padding: 20px;
box-shadow: 0px 0px 0 rgba(255,255,255,0.05); box-shadow: 0px 0px 0 rgba(255, 255, 255, 0.05);
-webkit-transition: all .5s; -webkit-transition: all .5s;
-webkit-box-flex: 0; -webkit-box-flex: 0;
display:block; display: block;
text-decoration:none; text-decoration: none;
border-radius:3px; border-radius: 3px;
} }
a.box:hover { a.box:hover {
box-shadow: 7px 7px 0 rgba(255,255,255,0.05); box-shadow: 7px 7px 0 rgba(255, 255, 255, 0.05);
} }
div.logo { div.logo {
background: url(/static/images/logo.svg) no-repeat center center;; background: url(/static/images/logo.svg) no-repeat center center;
background-size:72px; background-size: 72px;
height:150px; height: 150px;
-webkit-transition: all .5s; -webkit-transition: all .5s;
} }
div.login { div.login {
text-align: center; text-align: center;
padding: 15px; padding: 15px;
@ -38,11 +42,12 @@
border-radius: 3px; border-radius: 3px;
-webkit-transition: all .5s; -webkit-transition: all .5s;
background: #424242; background: #424242;
color: rgba(255,255,255,0.7); color: rgba(255, 255, 255, 0.7);
} }
body > div { body > div {
width:100%; width: 100%;
height:100%; height: 100%;
display: -webkit-box; display: -webkit-box;
display: -webkit-flex; display: -webkit-flex;
display: flex; display: flex;
@ -53,7 +58,7 @@
-webkit-justify-content: center; -webkit-justify-content: center;
justify-content: center; justify-content: center;
} }
</style> </style>
<a href="/authorize" target="_self" class="box"> <a href="/authorize" target="_self" class="box">
<div class="logo"></div> <div class="logo"></div>
@ -61,7 +66,9 @@
<div ng-switch-when="internal_error">Oops. There was an unexpected error. Please try again.</div> <div ng-switch-when="internal_error">Oops. There was an unexpected error. Please try again.</div>
<div ng-switch-when="user_not_found">There was an error authorizing your account.</div> <div ng-switch-when="user_not_found">There was an error authorizing your account.</div>
<div ng-switch-when="access_denied_org">Login is restricted to approved organization members only</div> <div ng-switch-when="access_denied_org">Login is restricted to approved organization members only</div>
<div ng-switch-when="access_denied">Self-registration is disabled. Please contact the system admin to grant access.</div> <div ng-switch-when="access_denied">Self-registration is disabled. Please contact the system admin to grant
access.
</div>
</div> </div>
<div class="login">Login</div> <div class="login">Login</div>
</a> </a>

View File

@ -1,17 +1,19 @@
<article> <article>
<section> <section>
<h2>Settings</h2> <h2>Settings</h2>
<div class="row"> <div class="row">
<div>Post Commit Hooks</div> <div>Post Commit Hooks</div>
<div> <div>
<input id="post_commits" type="checkbox" hidden="hidden" ng-model="repo.hooks.push" ng-change="save(repo)" /> <input id="post_commits" type="checkbox" hidden="hidden" ng-model="repo.hooks.push" ng-change="save(repo)"/>
<label for="post_commits" class="switch"></label> <label for="post_commits" class="switch"></label>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div>Pull Request Hooks</div> <div>Pull Request Hooks</div>
<div> <div>
<input id="pull_requests" type="checkbox" hidden="hidden" ng-model="repo.hooks.pull_request" ng-change="save(repo)" /> <input id="pull_requests" type="checkbox" hidden="hidden" ng-model="repo.hooks.pull_request"
ng-change="save(repo)"/>
<label for="pull_requests" class="switch"></label> <label for="pull_requests" class="switch"></label>
</div> </div>
</div> </div>
@ -29,17 +31,18 @@
<section ng-if="user.admin"> <section ng-if="user.admin">
<h2>Admin settings</h2> <h2>Admin settings</h2>
<div class="row"> <div class="row">
<div>Trusted (Evelvate Privilege)</div> <div>Trusted (Evelvate Privilege)</div>
<div> <div>
<input id="trusted" type="checkbox" hidden="hidden" ng-model="repo.trusted" ng-change="save(repo)" /> <input id="trusted" type="checkbox" hidden="hidden" ng-model="repo.trusted" ng-change="save(repo)"/>
<label for="trusted" class="switch"></label> <label for="trusted" class="switch"></label>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div>Timeout in minutes</div> <div>Timeout in minutes</div>
<div> <div>
<input type="range" ng-model="repo.timeout" min="0" max="900" ng-blur="save(repo)" /> <input type="range" ng-model="repo.timeout" min="0" max="900" ng-blur="save(repo)"/>
<span class="slider-label">{{ repo.timeout }} minutes</span> <span class="slider-label">{{ repo.timeout }} minutes</span>
</div> </div>
</div> </div>
@ -47,6 +50,7 @@
<section> <section>
<h2>Badges</h2> <h2>Badges</h2>
<div class="row"> <div class="row">
<div>Markdown</div> <div>Markdown</div>
<div> <div>
@ -63,6 +67,7 @@
<section> <section>
<h2>Public Key</h2> <h2>Public Key</h2>
<div> <div>
<pre class="snippet snippet-padding">{{ repo.keypair.public }}</pre> <pre class="snippet snippet-padding">{{ repo.keypair.public }}</pre>
</div> </div>

View File

@ -1,5 +1,7 @@
<div class="breadcrumb" style="position:relative;top:0px;"> <div class="breadcrumb">
<a href="/{{ repo.full_name }}/edit" class="icon icon-home"></a> <a href="/{{ repo.full_name }}/edit" class="icon icon-home">
<i class="material-icons md-18">home</i>
</a>
<a ng-href="/{{ repo.full_name }}">{{ repo.owner }} / {{ repo.name }}</a> <a ng-href="/{{ repo.full_name }}">{{ repo.owner }} / {{ repo.name }}</a>
</div> </div>

View File

@ -2,8 +2,12 @@
<section> <section>
<form style="padding:30px"> <form style="padding:30px">
<input type="text" ng-model="login" placeholder="i.e. octocat" style="font-size:14px;padding:10px 20px;width:400px;border: 1px solid #d9d9d9;outline:none;"/> <input type="text" ng-model="login" placeholder="i.e. octocat"
<button ng-click="add(login)" style="display: inline-block;background:#EEE;font-size:14px; padding:0px 20px;text-transform:uppercase;cursor:pointer;color:#616161;height:39px;line-height:41px;margin-left:10px;">Add User</button> style="font-size:14px;padding:10px 20px;width:400px;border: 1px solid #d9d9d9;outline:none;"/>
<button ng-click="add(login)"
style="display: inline-block;background:#EEE;font-size:14px; padding:0px 20px;text-transform:uppercase;cursor:pointer;color:#616161;height:39px;line-height:41px;margin-left:10px;">
Add User
</button>
</form> </form>
</section> </section>
@ -11,10 +15,12 @@
<section> <section>
<div class="row row-user" ng-repeat="user in users"> <div class="row row-user" ng-repeat="user in users">
<div> <div>
<img ng-src="{{ user.gravatar_id | gravatar }}" /> <img ng-src="{{ user.gravatar_id | gravatar }}"/>
</div> </div>
<div> <div>
<h3>{{ user.login }} <small ng-if="user.admin">Admin</small></h3> <h3>{{ user.login }}
<small ng-if="user.admin">Admin</small>
</h3>
<p>{{ user.email }}</p> <p>{{ user.email }}</p>
<button ng-click="toggle(user)" ng-class="{'btn-admin':true, 'btn-checked': user.admin}"> <button ng-click="toggle(user)" ng-class="{'btn-admin':true, 'btn-checked': user.admin}">
<i class="material-icons md-18">account_circle</i> <i class="material-icons md-18">account_circle</i>

File diff suppressed because it is too large Load Diff