mirror of
https://github.com/goharbor/harbor.git
synced 2024-11-18 16:25:16 +01:00
Merge branch 'new-version-of-ui' of https://github.com/vmware/harbor into new-version-of-ui
This commit is contained in:
commit
ce2454472b
@ -1,9 +1,11 @@
|
||||
package ng
|
||||
|
||||
// AccountSettingController handles request to /ng/account_setting
|
||||
type AccountSettingController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get renders the account settings page
|
||||
func (asc *AccountSettingController) Get() {
|
||||
asc.Forward("Account Settings", "account-settings.htm")
|
||||
}
|
||||
|
@ -1,9 +1,11 @@
|
||||
package ng
|
||||
|
||||
// AdminOptionController handles requests to /ng/admin_option
|
||||
type AdminOptionController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get renders the admin options page
|
||||
func (aoc *AdminOptionController) Get() {
|
||||
aoc.Forward("Admin Options", "admin-options.htm")
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import (
|
||||
"github.com/vmware/harbor/utils/log"
|
||||
)
|
||||
|
||||
// BaseController wraps common methods such as i18n support, forward, which can be leveraged by other UI render controllers.
|
||||
type BaseController struct {
|
||||
beego.Controller
|
||||
i18n.Locale
|
||||
@ -84,32 +85,37 @@ func (b *BaseController) Prepare() {
|
||||
|
||||
}
|
||||
|
||||
func (bc *BaseController) Forward(title, templateName string) {
|
||||
bc.Layout = filepath.Join(prefixNg, "layout.htm")
|
||||
bc.TplName = filepath.Join(prefixNg, templateName)
|
||||
bc.Data["Title"] = title
|
||||
bc.LayoutSections = make(map[string]string)
|
||||
bc.LayoutSections["HeaderInclude"] = filepath.Join(prefixNg, viewPath, "header-include.htm")
|
||||
bc.LayoutSections["FooterInclude"] = filepath.Join(prefixNg, viewPath, "footer-include.htm")
|
||||
bc.LayoutSections["HeaderContent"] = filepath.Join(prefixNg, viewPath, "header-content.htm")
|
||||
bc.LayoutSections["FooterContent"] = filepath.Join(prefixNg, viewPath, "footer-content.htm")
|
||||
// Forward to setup layout and template for content for a page.
|
||||
func (b *BaseController) Forward(title, templateName string) {
|
||||
b.Layout = filepath.Join(prefixNg, "layout.htm")
|
||||
b.TplName = filepath.Join(prefixNg, templateName)
|
||||
b.Data["Title"] = title
|
||||
b.LayoutSections = make(map[string]string)
|
||||
b.LayoutSections["HeaderInclude"] = filepath.Join(prefixNg, viewPath, "header-include.htm")
|
||||
b.LayoutSections["FooterInclude"] = filepath.Join(prefixNg, viewPath, "footer-include.htm")
|
||||
b.LayoutSections["HeaderContent"] = filepath.Join(prefixNg, viewPath, "header-content.htm")
|
||||
b.LayoutSections["FooterContent"] = filepath.Join(prefixNg, viewPath, "footer-content.htm")
|
||||
|
||||
}
|
||||
|
||||
var langTypes []*langType
|
||||
|
||||
// CommonController handles request from UI that doesn't expect a page, such as /SwitchLanguage /logout ...
|
||||
type CommonController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Render returns nil.
|
||||
func (cc *CommonController) Render() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// LogOut Habor UI
|
||||
func (cc *CommonController) LogOut() {
|
||||
cc.DestroySession()
|
||||
}
|
||||
|
||||
// SwitchLanguage User can swith to prefered language
|
||||
func (cc *CommonController) SwitchLanguage() {
|
||||
lang := cc.GetString("lang")
|
||||
if _, exist := supportLanguages[lang]; exist {
|
||||
|
@ -1,9 +1,11 @@
|
||||
package ng
|
||||
|
||||
// DashboardController handles requests to /ng/dashboard
|
||||
type DashboardController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get renders the dashboard page
|
||||
func (dc *DashboardController) Get() {
|
||||
dc.Forward("Dashboard", "dashboard.htm")
|
||||
}
|
||||
|
@ -1,9 +1,11 @@
|
||||
package ng
|
||||
|
||||
// IndexController handles request to /ng
|
||||
type IndexController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get renders the index page
|
||||
func (ic *IndexController) Get() {
|
||||
ic.Forward("Index", "index.htm")
|
||||
}
|
||||
|
@ -8,10 +8,12 @@ import (
|
||||
"github.com/vmware/harbor/utils/log"
|
||||
)
|
||||
|
||||
// NavigationHeaderController handles requests to /ng/navigation_header
|
||||
type NavigationHeaderController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get renders user's navigation header
|
||||
func (nhc *NavigationHeaderController) Get() {
|
||||
sessionUserID := nhc.GetSession("userId")
|
||||
var hasLoggedIn bool
|
||||
|
@ -8,10 +8,12 @@ import (
|
||||
"github.com/vmware/harbor/utils/log"
|
||||
)
|
||||
|
||||
// OptionalMenuController handles request to /ng/optional_menu
|
||||
type OptionalMenuController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get renders optional menu, Admin user has "Add User" menu
|
||||
func (omc *OptionalMenuController) Get() {
|
||||
sessionUserID := omc.GetSession("userId")
|
||||
|
||||
|
@ -95,10 +95,12 @@ func (cc *CommonController) SendEmail() {
|
||||
|
||||
}
|
||||
|
||||
// ForgotPasswordController handles requests to /ng/forgot_password
|
||||
type ForgotPasswordController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get renders forgot password page
|
||||
func (fpc *ForgotPasswordController) Get() {
|
||||
fpc.Forward("Forgot Password", "forgot-password.htm")
|
||||
}
|
||||
|
@ -1,9 +1,11 @@
|
||||
package ng
|
||||
|
||||
// ProjectController handles requests to /ng/projec
|
||||
type ProjectController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get renders project page
|
||||
func (pc *ProjectController) Get() {
|
||||
pc.Forward("My Projects", "project.htm")
|
||||
}
|
||||
|
@ -2,10 +2,12 @@ package ng
|
||||
|
||||
import "os"
|
||||
|
||||
// RepositoryController handles request to /ng/repository
|
||||
type RepositoryController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get renders repository page
|
||||
func (rc *RepositoryController) Get() {
|
||||
rc.Data["HarborRegUrl"] = os.Getenv("HARBOR_REG_URL")
|
||||
rc.Forward("Repository", "repository.htm")
|
||||
|
@ -1,9 +1,11 @@
|
||||
package ng
|
||||
|
||||
// SearchController handles request to ng/search
|
||||
type SearchController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get rendlers search bar
|
||||
func (sc *SearchController) Get() {
|
||||
sc.Forward("Search", "search.htm")
|
||||
}
|
||||
|
@ -1,9 +1,11 @@
|
||||
package ng
|
||||
|
||||
// SignUpController handles requests to /ng/sign_up
|
||||
type SignUpController struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// Get renders sign up page
|
||||
func (suc *SignUpController) Get() {
|
||||
suc.Forward("Sign Up", "sign-up.htm")
|
||||
}
|
||||
|
59
static/ng/Gruntfile.js
Normal file
59
static/ng/Gruntfile.js
Normal file
@ -0,0 +1,59 @@
|
||||
/*global module:false*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
'use strict';
|
||||
// Project configuration.
|
||||
grunt.initConfig({
|
||||
// Task configuration.
|
||||
jshint: {
|
||||
options: {
|
||||
browser: true,
|
||||
curly: true,
|
||||
freeze: true,
|
||||
bitwise: true,
|
||||
eqeqeq: true,
|
||||
strict: true,
|
||||
immed: true,
|
||||
latedef: false,
|
||||
newcap: false,
|
||||
smarttabs: true,
|
||||
noarg: true,
|
||||
devel: true,
|
||||
sub: true,
|
||||
undef: true,
|
||||
unused: false,
|
||||
boss: true,
|
||||
eqnull: true,
|
||||
globals: {
|
||||
jQuery: true,
|
||||
angular: true,
|
||||
$: true,
|
||||
}
|
||||
},
|
||||
gruntfile: {
|
||||
src: 'Gruntfile.js'
|
||||
},
|
||||
scripts: {
|
||||
src: ['resources/**/**/*.js']
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
gruntfile: {
|
||||
files: '<%= jshint.gruntfile.src %>',
|
||||
tasks: ['jshint:gruntfile']
|
||||
},
|
||||
scripts: {
|
||||
files: '<%= jshint.scripts.src %>',
|
||||
tasks: ['jshint:scripts']
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// These plugins provide necessary tasks.
|
||||
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||
grunt.loadNpmTasks('grunt-contrib-watch');
|
||||
|
||||
// Default task.
|
||||
grunt.registerTask('default', ['jshint']);
|
||||
|
||||
};
|
10
static/ng/package.json
Normal file
10
static/ng/package.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"engines": {
|
||||
"node": ">= 0.10.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"grunt": "~0.4.5",
|
||||
"grunt-contrib-jshint": "~0.10.0",
|
||||
"grunt-contrib-watch": "~0.6.1"
|
||||
}
|
||||
}
|
@ -58,7 +58,7 @@
|
||||
|
||||
if($routeParams.project_id){
|
||||
angular.forEach(vm.projects, function(value, index) {
|
||||
if(value['ProjectId'] == $routeParams.project_id) {
|
||||
if(value['ProjectId'] === $routeParams.project_id) {
|
||||
vm.selectedProject = value;
|
||||
}
|
||||
});
|
||||
@ -117,7 +117,7 @@
|
||||
controller: RetrieveProjectsController,
|
||||
bindToController: true,
|
||||
controllerAs: 'vm'
|
||||
}
|
||||
};
|
||||
|
||||
return directive;
|
||||
|
||||
|
@ -42,7 +42,7 @@
|
||||
controller: SwitchPaneProjectsController,
|
||||
controllerAs: 'vm',
|
||||
bindToController: true
|
||||
}
|
||||
};
|
||||
|
||||
return directive;
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
||||
vm.op = [];
|
||||
vm.op.push('all');
|
||||
function checkOperation(e) {
|
||||
if(e.checked == 'all') {
|
||||
if(e.checked === 'all') {
|
||||
vm.opCreate = vm.opAll;
|
||||
vm.opPull = vm.opAll;
|
||||
vm.opPush = vm.opAll;
|
||||
@ -48,7 +48,7 @@
|
||||
if(vm.opDelete) {
|
||||
vm.op.push('delete');
|
||||
}
|
||||
if(vm.opOthers && vm.others != "") {
|
||||
if(vm.opOthers && vm.others !== "") {
|
||||
vm.op.push(vm.others);
|
||||
}
|
||||
}
|
||||
|
@ -33,7 +33,7 @@
|
||||
retrieve(vm.queryParams);
|
||||
|
||||
function search(e) {
|
||||
if(e.op[0] == 'all') {
|
||||
if(e.op[0] === 'all') {
|
||||
vm.queryParams.keywords = '';
|
||||
}else {
|
||||
vm.queryParams.keywords = e.op.join('/') ;
|
||||
@ -68,7 +68,7 @@
|
||||
}
|
||||
|
||||
function toUTCSeconds(date, hour, min, sec) {
|
||||
if(date == "") {
|
||||
if(date === "") {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -96,7 +96,7 @@
|
||||
controller: ListLogController,
|
||||
controllerAs: 'vm',
|
||||
bindToController: true
|
||||
}
|
||||
};
|
||||
|
||||
return directive;
|
||||
}
|
||||
|
@ -55,7 +55,7 @@
|
||||
vm.hasError = true;
|
||||
vm.errorMessage = 'username_already_exist';
|
||||
}
|
||||
if(status == 404) {
|
||||
if(status === 404) {
|
||||
vm.hasError = true;
|
||||
vm.errorMessage = 'username_does_not_exist';
|
||||
}
|
||||
@ -76,7 +76,8 @@
|
||||
'controller': AddProjectMemberController,
|
||||
'controllerAs': 'vm',
|
||||
'bindToController': true
|
||||
}
|
||||
};
|
||||
|
||||
return directive;
|
||||
}
|
||||
|
||||
|
@ -60,7 +60,8 @@
|
||||
controller: ListProjectMemberController,
|
||||
controllerAs: 'vm',
|
||||
bindToController: true
|
||||
}
|
||||
};
|
||||
|
||||
return directive;
|
||||
}
|
||||
|
||||
|
@ -24,8 +24,8 @@
|
||||
|
||||
for(var i = 0; i < r.length; i++) {
|
||||
var role = r[i];
|
||||
if(query.key == 'roleName' && role.roleName == query.value
|
||||
|| query.key == 'roleId' && role.id == query.value) {
|
||||
if(query.key === 'roleName' && role.roleName === query.value
|
||||
|| query.key === 'roleId' && role.id === query.value) {
|
||||
return role;
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +44,7 @@
|
||||
vm.hasError = true;
|
||||
vm.errorMessage = 'project_already_exist';
|
||||
}
|
||||
if(status == 500) {
|
||||
if(status === 500) {
|
||||
vm.hasError = true;
|
||||
vm.errorMessage = 'project_name_is_invalid';
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
var vm = this;
|
||||
vm.toggle = toggle;
|
||||
|
||||
if(vm.isPublic == 1) {
|
||||
if(vm.isPublic === 1) {
|
||||
vm.isPublic = true;
|
||||
}else{
|
||||
vm.isPublic = false;
|
||||
|
@ -98,7 +98,7 @@
|
||||
controller: ListRepositoryController,
|
||||
controllerAs: 'vm',
|
||||
bindToController: true
|
||||
}
|
||||
};
|
||||
|
||||
return directive;
|
||||
|
||||
|
@ -40,7 +40,7 @@
|
||||
$scope.$emit('modalTitle', $filter('tr')('alert_delete_tag_title', [e.tag]));
|
||||
|
||||
var message;
|
||||
if(vm.tags.length == 1) {
|
||||
if(vm.tags.length === 1) {
|
||||
message = $filter('tr')('alert_delete_last_tag', [e.tag]);
|
||||
}else {
|
||||
message = $filter('tr')('alert_delete_tag', [e.tag]);
|
||||
|
@ -81,15 +81,15 @@
|
||||
'<div class="form-group"><label class="col-sm-3 control-label">Created</label>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + ctrl.manifest['Created'] + '</p></div></div>' +
|
||||
'<div class="form-group"><label class="col-sm-3 control-label">Duration Days</label>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + (ctrl.manifest['Duration Days'] == '' ? 'N/A' : ctrl.manifest['Duration Days']) + ' days</p></div></div>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + (ctrl.manifest['Duration Days'] === '' ? 'N/A' : ctrl.manifest['Duration Days']) + ' days</p></div></div>' +
|
||||
'<div class="form-group"><label class="col-sm-3 control-label">Author</label>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + (ctrl.manifest['Author'] == '' ? 'N/A' : ctrl.manifest['Author']) + '</p></div></div>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + (ctrl.manifest['Author'] === '' ? 'N/A' : ctrl.manifest['Author']) + '</p></div></div>' +
|
||||
'<div class="form-group"><label class="col-sm-3 control-label">Architecture</label>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + (ctrl.manifest['Architecture'] == '' ? 'N/A' : ctrl.manifest['Architecture']) + '</p></div></div>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + (ctrl.manifest['Architecture'] === '' ? 'N/A' : ctrl.manifest['Architecture']) + '</p></div></div>' +
|
||||
'<div class="form-group"><label class="col-sm-3 control-label">Docker Version</label>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + (ctrl.manifest['Docker Version'] == '' ? 'N/A' : ctrl.manifest['Docker Version']) + '</p></div></div>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + (ctrl.manifest['Docker Version'] === '' ? 'N/A' : ctrl.manifest['Docker Version']) + '</p></div></div>' +
|
||||
'<div class="form-group"><label class="col-sm-3 control-label">OS</label>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + (ctrl.manifest['OS'] == '' ? 'N/A' : ctrl.manifest['OS']) + '</p></div></div>' +
|
||||
'<div class="col-sm-9"><p class="form-control-static">' + (ctrl.manifest['OS'] === '' ? 'N/A' : ctrl.manifest['OS']) + '</p></div></div>' +
|
||||
'</form>';
|
||||
return content;
|
||||
}
|
||||
|
@ -60,7 +60,8 @@
|
||||
'controller': SignInController,
|
||||
'controllerAs': 'vm',
|
||||
'bindToController': true
|
||||
}
|
||||
};
|
||||
|
||||
return directive;
|
||||
|
||||
}
|
||||
|
@ -11,7 +11,7 @@
|
||||
function ToggleAdminController($scope, ToggleAdminService) {
|
||||
var vm = this;
|
||||
|
||||
vm.isAdmin = (vm.hasAdminRole == 1) ? true : false;
|
||||
vm.isAdmin = (vm.hasAdminRole === 1) ? true : false;
|
||||
vm.toggle = toggle;
|
||||
|
||||
function toggle() {
|
||||
|
@ -21,7 +21,7 @@
|
||||
ctrl.$validators.compareTo = validator;
|
||||
|
||||
function validator(modelValue) {
|
||||
return modelValue == scope.otherModelValue;
|
||||
return modelValue === scope.otherModelValue;
|
||||
}
|
||||
|
||||
scope.$watch("otherModelValue", function(current, origin) {
|
||||
|
@ -19,8 +19,14 @@
|
||||
name = name.replace(/[\[\]]/g, "\\$&");
|
||||
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
|
||||
results = regex.exec(url);
|
||||
if (!results) return null;
|
||||
if (!results[2]) return '';
|
||||
if (!results) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!results[2]) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return decodeURIComponent(results[2].replace(/\+/g, " "));
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,7 @@
|
||||
unset: function() {
|
||||
$cookies.remove('user', {'path': '/'});
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
currentProjectMember.$inject = ['$cookies'];
|
||||
@ -36,7 +36,7 @@
|
||||
unset: function() {
|
||||
$cookies.remove('member', {'path': '/'});
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
})();
|
@ -35,10 +35,10 @@
|
||||
input = input || [];
|
||||
var filteredResults = [];
|
||||
|
||||
if (filterInput != '') {
|
||||
if (filterInput !== '') {
|
||||
for(var i = 0; i < input.length; i++) {
|
||||
var item = input[i];
|
||||
if((key == "" && item.indexOf(filterInput) >= 0) || (key != "" && item[key].indexOf(filterInput) >= 0)) {
|
||||
if((key === "" && item.indexOf(filterInput) >= 0) || (key !== "" && item[key].indexOf(filterInput) >= 0)) {
|
||||
filteredResults.push(item);
|
||||
continue;
|
||||
}
|
||||
|
@ -32,7 +32,7 @@
|
||||
controller: NavigationDetailsController,
|
||||
controllerAs: 'vm',
|
||||
bindToController: true
|
||||
}
|
||||
};
|
||||
|
||||
return directive;
|
||||
|
||||
|
@ -22,13 +22,13 @@
|
||||
controller: NavigationHeaderController,
|
||||
controllerAs: 'vm',
|
||||
bindToController: true
|
||||
}
|
||||
};
|
||||
|
||||
return directive;
|
||||
|
||||
function link(scope, element, attrs, ctrl) {
|
||||
var visited = ctrl.url;
|
||||
if (visited != "/ng") {
|
||||
if (visited !== "/ng") {
|
||||
element.find('a[href*="' + visited + '"]').addClass('active');
|
||||
}
|
||||
element.find('a').on('click', click);
|
||||
|
@ -59,7 +59,7 @@
|
||||
}
|
||||
|
||||
function showAddButton() {
|
||||
if(vm.publicity == 0) {
|
||||
if(vm.publicity === 0) {
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
|
@ -18,15 +18,16 @@
|
||||
};
|
||||
var isSupportLanguage = function(language) {
|
||||
for (var i in supportLanguages) {
|
||||
if(language == i) {
|
||||
if(language === i) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
return tr;
|
||||
function tr() {
|
||||
|
||||
return {
|
||||
'setCurrentLanguage': function(language) {
|
||||
if(!angular.isDefined(language) || !isSupportLanguage(language)) {
|
||||
@ -52,7 +53,8 @@
|
||||
'getValue': function(key) {
|
||||
return messages[key];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,8 +17,9 @@
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
transformRequest: function(obj) {
|
||||
var str = [];
|
||||
for(var p in obj)
|
||||
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
|
||||
for(var p in obj) {
|
||||
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
|
||||
}
|
||||
return str.join("&");
|
||||
},
|
||||
data: {'reset_uuid': uuid, 'password': password}
|
||||
|
@ -19,8 +19,9 @@
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
transformRequest: function(obj) {
|
||||
var str = [];
|
||||
for(var p in obj)
|
||||
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
|
||||
for(var p in obj) {
|
||||
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
|
||||
}
|
||||
return str.join("&");
|
||||
},
|
||||
data: {'principal': principal, 'password': password}
|
||||
|
Loading…
Reference in New Issue
Block a user