Merge remote-tracking branch 'upstream/new-ui-with-sync-image' into author

This commit is contained in:
wemeya 2016-06-22 14:15:05 +08:00
commit 1c1764495d
22 changed files with 133 additions and 118 deletions

View File

@ -33,8 +33,10 @@ body {
background-color: #EFEFEF; background-color: #EFEFEF;
max-height: 100%; max-height: 100%;
height: 100%; height: 100%;
overflow-y: auto; width: 100%;
overflow-x: hidden; min-width: 1px;
overflow: auto;
min-height: 1px;
} }
.up-section { .up-section {
@ -75,8 +77,6 @@ body {
.long-line { .long-line {
overflow: hidden; overflow: hidden;
width: 100%; width: 100%;
white-space: nowrap;
text-overflow: ellipsis;
} }
.down-table-pane { .down-table-pane {
@ -111,4 +111,5 @@ body {
.page-content { .page-content {
margin: 0 20px 0 20px; margin: 0 20px 0 20px;
text-align: left; text-align: left;
overflow-y: hidden;
} }

View File

@ -3,13 +3,13 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">//vm.title//</h4> <h4 class="modal-title">//vm.modalTitle//</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-primary" id="btnOk">// 'ok' | tr //</button> <button type="button" class="btn btn-primary" id="btnOk">// 'ok' | tr //</button>
<button type="button" class="btn btn-default" data-dismiss="modal">// 'close' | tr //</button> <button type="button" ng-show="!vm.confirmOnly" class="btn btn-default" data-dismiss="modal">// 'close' | tr //</button>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->

View File

@ -10,6 +10,7 @@
function ModalDialogController($scope) { function ModalDialogController($scope) {
var vm = this; var vm = this;
vm.confirmOnly = false;
} }
function modalDialog() { function modalDialog() {
@ -19,9 +20,10 @@
'link': link, 'link': link,
'scope': { 'scope': {
'contentType': '@', 'contentType': '@',
'title': '@', 'modalTitle': '@',
'message': '@', 'modalMessage': '@',
'action': '&' 'action': '&',
'confirmOnly': '@'
}, },
'controller': ModalDialogController, 'controller': ModalDialogController,
'controllerAs': 'vm', 'controllerAs': 'vm',
@ -36,7 +38,7 @@
} }
console.log('Received contentType in modal:' + ctrl.contentType); console.log('Received contentType in modal:' + ctrl.contentType);
scope.$watch('vm.message', function(current) { scope.$watch('vm.modalMessage', function(current) {
if(current) { if(current) {
switch(ctrl.contentType) { switch(ctrl.contentType) {
case 'text/html': case 'text/html':
@ -49,11 +51,22 @@
} }
}); });
scope.$on('showDialog', function(e, val) {
console.log('modal-dialog show:' + ctrl.show);
if(val) {
element.find('#myModal').modal('show');
}else{
element.find('#myModal').modal('hide');
}
});
element.find('#btnOk').on('click', clickHandler); element.find('#btnOk').on('click', clickHandler);
function clickHandler(e) { function clickHandler(e) {
ctrl.action(); ctrl.action();
element.find('#myModal').modal('hide'); element.find('#myModal').modal('hide');
ctrl.show = false;
} }
} }
} }

View File

@ -12,7 +12,7 @@
</div> </div>
<div class="pane"> <div class="pane">
<add-project-member ng-show="vm.isOpen" is-open="vm.isOpen" project-id="//vm.projectId//" reload='vm.search({projectId: vm.projectId, username: vm.username})'></add-project-member> <add-project-member ng-show="vm.isOpen" is-open="vm.isOpen" project-id="//vm.projectId//" reload='vm.search({projectId: vm.projectId, username: vm.username})'></add-project-member>
<modal-dialog title="// 'confirm_to_delete_member_title' | tr //" message="// 'confirm_to_delete_member' | tr //" action="vm.deleteProjectMember()"></modal-dialog> <modal-dialog modal-title="// 'confirm_to_delete_member_title' | tr //" modal-message="// 'confirm_to_delete_member' | tr //" action="vm.deleteProjectMember()"></modal-dialog>
<div class="sub-pane"> <div class="sub-pane">
<table class="table table-pane" > <table class="table table-pane" >
<thead> <thead>

View File

@ -7,7 +7,7 @@
<button class="btn btn-primary" type="button" ng-click="vm.searchReplicationPolicy()"><span class="glyphicon glyphicon-search"></span></button> <button class="btn btn-primary" type="button" ng-click="vm.searchReplicationPolicy()"><span class="glyphicon glyphicon-search"></span></button>
</span> </span>
</div> </div>
<button ng-if="!vm.isOpen" class="btn btn-success" type="button" ng-click="vm.addReplication()" data-toggle="modal" data-target="#createPolicyModal"><span class="glyphicon glyphicon-plus"></span>// 'add_new_replication' | tr //</button> <button ng-if="!vm.isOpen" class="btn btn-success" type="button" ng-click="vm.addReplication()" data-toggle="modal" data-target="#createPolicyModal"><span class="glyphicon glyphicon-plus"></span>// 'add_new_policy' | tr //</button>
<create-policy reload="vm.retrievePolicy()" action="vm.action" modal-title="//vm.modalTitle//" policy-id="//vm.policyId//"></create-policy> <create-policy reload="vm.retrievePolicy()" action="vm.action" modal-title="//vm.modalTitle//" policy-id="//vm.policyId//"></create-policy>
</div> </div>
<div class="pane-split" id="upon-pane"> <div class="pane-split" id="upon-pane">
@ -42,7 +42,7 @@
&nbsp; &nbsp;
<a href="javascript:void(0);" data-toggle="modal" data-target="#createPolicyModal" ng-click="vm.editReplication(r.id)"><span class="glyphicon glyphicon-pencil"></span></a> <a href="javascript:void(0);" data-toggle="modal" data-target="#createPolicyModal" ng-click="vm.editReplication(r.id)"><span class="glyphicon glyphicon-pencil"></span></a>
&nbsp; &nbsp;
<a href="javascript:void(0);"><span class="glyphicon glyphicon-trash"></span></a> <!--a href="javascript:void(0);"><span class="glyphicon glyphicon-trash"></span></a -->
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -6,9 +6,9 @@
.module('harbor.replication') .module('harbor.replication')
.directive('listReplication', listReplication); .directive('listReplication', listReplication);
ListReplicationController.$inject = ['$scope', 'getParameterByName', '$location', 'ListReplicationPolicyService', 'ToggleReplicationPolicyService', 'ListReplicationJobService', '$window']; ListReplicationController.$inject = ['$scope', 'getParameterByName', '$location', 'ListReplicationPolicyService', 'ToggleReplicationPolicyService', 'ListReplicationJobService', '$window', '$filter', 'trFilter'];
function ListReplicationController($scope, getParameterByName, $location, ListReplicationPolicyService, ToggleReplicationPolicyService, ListReplicationJobService, $window) { function ListReplicationController($scope, getParameterByName, $location, ListReplicationPolicyService, ToggleReplicationPolicyService, ListReplicationJobService, $window, $filter, trFilter) {
var vm = this; var vm = this;
$scope.$on('$locationChangeSuccess', function() { $scope.$on('$locationChangeSuccess', function() {
@ -73,13 +73,13 @@
} }
function addReplication() { function addReplication() {
vm.modalTitle = 'Create New Policy'; vm.modalTitle = $filter('tr')('add_new_policy', []);
vm.action = 'ADD_NEW'; vm.action = 'ADD_NEW';
} }
function editReplication(policyId) { function editReplication(policyId) {
vm.policyId = policyId; vm.policyId = policyId;
vm.modalTitle = 'Edit Policy'; vm.modalTitle = $filter('tr')('edit_policy', []);
vm.action = 'EDIT'; vm.action = 'EDIT';
console.log('Selected policy ID:' + vm.policyId); console.log('Selected policy ID:' + vm.policyId);

View File

@ -12,7 +12,7 @@
<h3 style="margin-top: 200px;" class="text-muted">// 'no_repositories' | tr //</h3> <h3 style="margin-top: 200px;" class="text-muted">// 'no_repositories' | tr //</h3>
</div> </div>
<div ng-if="vm.repositories.length > 0" class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> <div ng-if="vm.repositories.length > 0" class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
<modal-dialog action="vm.deleteImage()" content-type="text/html" title="//vm.modalTitle//" message="//vm.modalMessage//"></modal-dialog> <modal-dialog action="vm.deleteImage()" content-type="text/html" modal-title="//vm.modalTitle//" modal-message="//vm.modalMessage//"></modal-dialog>
<div class="panel panel-default" ng-repeat="repo in vm.repositories"> <div class="panel panel-default" ng-repeat="repo in vm.repositories">
<div class="panel-heading" role="tab" id="heading//$index + 1//"> <div class="panel-heading" role="tab" id="heading//$index + 1//">
<h4 class="panel-title"> <h4 class="panel-title">

View File

@ -11,7 +11,7 @@
<create-destination action="//vm.action//" target-id="//vm.targetId//" reload="vm.retrieve()"></create-destination> <create-destination action="//vm.action//" target-id="//vm.targetId//" reload="vm.retrieve()"></create-destination>
</div> </div>
<div class="pane"> <div class="pane">
<modal-dialog title="// 'confirm_to_delete_destination_title' | tr //" message="// 'confirm_to_delete_destination' | tr //" action="vm.deleteDestination()"></modal-dialog> <modal-dialog modal-title="// 'confirm_to_delete_destination_title' | tr //" modal-message="// 'confirm_to_delete_destination' | tr //" action="vm.deleteDestination()"></modal-dialog>
<div class="sub-pane"> <div class="sub-pane">
<table class="table table-pane"> <table class="table table-pane">
<thead> <thead>

View File

@ -9,7 +9,7 @@
</div> </div>
</div> </div>
<div class="pane project-pane"> <div class="pane project-pane">
<modal-dialog title="// 'confirm_to_delete_user_title' | tr //" message="// 'confirm_to_delete_user' | tr //" action="vm.deleteUser()"></modal-dialog> <modal-dialog modal-title="// 'confirm_to_delete_user_title' | tr //" modal-message="// 'confirm_to_delete_user' | tr //" action="vm.deleteUser()"></modal-dialog>
<div class="sub-pane"> <div class="sub-pane">
<table class="table"> <table class="table">
<thead> <thead>

View File

@ -17,7 +17,7 @@
vm.reset = reset; vm.reset = reset;
vm.toggleChangePassword = toggleChangePassword; vm.toggleChangePassword = toggleChangePassword;
vm.confirmToUpdate = confirmToUpdate; vm.confirm = confirm;
vm.updateUser = updateUser; vm.updateUser = updateUser;
vm.cancel = cancel; vm.cancel = cancel;
@ -39,43 +39,32 @@
} }
} }
function confirmToUpdate(user) { function confirm() {
vm.user = user; $window.location.href = '/dashboard';
if(vm.isOpen) {
if(vm.user && angular.isDefined(user.oldPassword) && angular.isDefined(user.password)) {
vm.modalTitle = $filter('tr')('change_password', []);
vm.modalMessage = $filte('tr')('confirm_to_change_password', []);
return true;
}
}else{
if(vm.user && angular.isDefined(vm.user.username) && angular.isDefined(vm.user.password) &&
angular.isDefined(vm.user.realname)) {
vm.modalTitle = $filter('tr')('change_profile', []);
vm.modalMessage = $filter('tr')('confirm_to_change_profile', []);
return true;
}
} }
vm.modalTitle = $filter('tr')('form_is_invalid'); function updateUser(user) {
vm.modalMessage = $filter('tr')('form_is_invalid_message', []);
return false;
}
function updateUser() {
if(vm.isOpen){ if(vm.isOpen){
ChangePasswordService(userId, vm.user.oldPassword, vm.user.password) if(user && angular.isDefined(user.oldPassword) && angular.isDefined(user.password)) {
ChangePasswordService(userId, user.oldPassword, user.password)
.success(changePasswordSuccess) .success(changePasswordSuccess)
.error(changePasswordFailed); .error(changePasswordFailed);
}
}else{ }else{
UpdateUserService(userId, vm.user) if(user && angular.isDefined(user.username) && angular.isDefined(user.password) &&
angular.isDefined(user.realname)) {
UpdateUserService(userId, user)
.success(updateUserSuccess) .success(updateUserSuccess)
.error(updateUserFailed); .error(updateUserFailed);
currentUser.set(vm.user); currentUser.set(user);
}
} }
} }
function changePasswordSuccess(data, status) { function changePasswordSuccess(data, status) {
$window.location.href = '/dashboard'; vm.modalTitle = $filter('tr')('change_password', []);
vm.modalMessage = $filter('tr')('successful_changed_password', []);
$scope.$broadcast('showDialog', true);
} }
function changePasswordFailed(data, status) { function changePasswordFailed(data, status) {
@ -87,7 +76,9 @@
} }
function updateUserSuccess(data, status) { function updateUserSuccess(data, status) {
$window.location.href = '/dashboard'; vm.modalTitle = $filter('tr')('change_profile', []);
vm.modalMessage = $filter('tr')('successful_changed_profile', []);
$scope.$broadcast('showDialog', true);
} }
function updateUserFailed(data, status) { function updateUserFailed(data, status) {

View File

@ -6,17 +6,20 @@
.module('harbor.layout.forgot.password') .module('harbor.layout.forgot.password')
.controller('ForgotPasswordController', ForgotPasswordController); .controller('ForgotPasswordController', ForgotPasswordController);
ForgotPasswordController.$inject = ['SendMailService', '$window']; ForgotPasswordController.$inject = ['SendMailService', '$window', '$scope'];
function ForgotPasswordController(SendMailService, $window) { function ForgotPasswordController(SendMailService, $window, $scope) {
var vm = this; var vm = this;
vm.hasError = false; vm.hasError = false;
vm.show = false;
vm.errorMessage = ''; vm.errorMessage = '';
vm.reset = reset; vm.reset = reset;
vm.sendMail = sendMail; vm.sendMail = sendMail;
vm.confirm = confirm;
function reset(){ function reset(){
vm.hasError = false; vm.hasError = false;
vm.errorMessage = ''; vm.errorMessage = '';
@ -31,7 +34,7 @@
} }
function sendMailSuccess(data, status) { function sendMailSuccess(data, status) {
$window.location.href = '/'; $scope.$broadcast('showDialog', true);
} }
function sendMailFailed(data) { function sendMailFailed(data) {
@ -39,6 +42,12 @@
vm.errorMessage = data; vm.errorMessage = data;
console.log('Failed send mail:' + data); console.log('Failed send mail:' + data);
} }
function confirm() {
$window.location.href = '/';
}
} }
})(); })();

View File

@ -6,10 +6,24 @@
.module('harbor.layout.header') .module('harbor.layout.header')
.controller('HeaderController', HeaderController); .controller('HeaderController', HeaderController);
HeaderController.$inject = ['$scope', '$window', 'getParameterByName']; HeaderController.$inject = ['$scope', '$window', 'getParameterByName', '$location', 'currentUser'];
function HeaderController($scope, $window, getParameterByName) { function HeaderController($scope, $window, getParameterByName, $location, currentUser) {
var vm = this; var vm = this;
vm.user = currentUser.get();
if(location.pathname === '/dashboard') {
vm.defaultUrl = '/dashboard';
}else{
vm.defaultUrl = '/';
}
$scope.$watch('vm.user', function(current) {
if(current) {
vm.defaultUrl = '/dashboard';
}
});
if($window.location.search) { if($window.location.search) {
vm.searchInput = getParameterByName('q', $window.location.search); vm.searchInput = getParameterByName('q', $window.location.search);
console.log('vm.searchInput at header:' + vm.searchInput); console.log('vm.searchInput at header:' + vm.searchInput);

View File

@ -6,13 +6,14 @@
.module('harbor.layout.sign.up') .module('harbor.layout.sign.up')
.controller('SignUpController', SignUpController); .controller('SignUpController', SignUpController);
SignUpController.$inject = ['SignUpService', '$window']; SignUpController.$inject = ['$scope', 'SignUpService', '$window'];
function SignUpController(SignUpService, $window) { function SignUpController($scope, SignUpService, $window) {
var vm = this; var vm = this;
vm.user = {}; vm.user = {};
vm.signUp = signUp; vm.signUp = signUp;
vm.confirm = confirm;
function signUp(user) { function signUp(user) {
var userObject = { var userObject = {
@ -27,16 +28,20 @@
.error(signUpFailed); .error(signUpFailed);
} }
function signUpSuccess(data, status) { function signUpSuccess(data, status) {
console.log('Signed up successfully:' + status); console.log('Signed up successfully:' + status);
alert('Signed up successfully'); $scope.$broadcast('showDialog', true);
$window.location.href = '/';
} }
function signUpFailed(data, status) { function signUpFailed(data, status) {
console.log('Signed up failed.'); console.log('Signed up failed.');
} }
function confirm() {
$window.location.href = '/';
}
} }
})(); })();

View File

@ -9,11 +9,11 @@ var locale_messages = {
'user_management_and_role_assignment': 'User management and role assignment', 'user_management_and_role_assignment': 'User management and role assignment',
'why_use_harbor': 'Why use Harbor?', 'why_use_harbor': 'Why use Harbor?',
'index_desc': 'Project Harbor is to build an enterprise-class, reliable registry server. Enterprises can set up a private registry server in their own environment to improve productivity as well as security. Project Harbor can be used in both development and production environment.', 'index_desc': 'Project Harbor is to build an enterprise-class, reliable registry server. Enterprises can set up a private registry server in their own environment to improve productivity as well as security. Project Harbor can be used in both development and production environment.',
'index_desc_1': 'Security: Keep their intellectual properties within their organizations.', 'index_desc_1': '<strong>Security:</strong> Keep their intellectual properties within their organizations.',
'index_desc_2': 'Efficiency: A private registry server is set up within the organization\'s network and can reduce significantly the internet traffic to the public service. ', 'index_desc_2': '<strong>Efficiency:</strong> A private registry server is set up within the organization\'s network and can reduce significantly the internet traffic to the public service. ',
'index_desc_3': 'Access Control: RBAC (Role Based Access Control) is provided. User management can be integrated with existing enterprise identity services like AD/LDAP. ', 'index_desc_3': '<strong>Access Control:</strong> RBAC (Role Based Access Control) is provided. User management can be integrated with existing enterprise identity services like AD/LDAP. ',
'index_desc_4': 'Audit: All access to the registry are logged and can be used for audit purpose.', 'index_desc_4': '<strong>Audit:</strong> All access to the registry are logged and can be used for audit purpose.',
'index_desc_5': 'GUI: User friendly single-pane-of-glass management console.', 'index_desc_5': '<strong>GUI:</strong> User friendly single-pane-of-glass management console.',
'view_all': 'View all...', 'view_all': 'View all...',
'repositories': 'Repositories', 'repositories': 'Repositories',
'project_repo_name': 'Project/Repository Name', 'project_repo_name': 'Project/Repository Name',
@ -136,7 +136,6 @@ var locale_messages = {
'confirm_to_delete_destination_title': 'Delete destination', 'confirm_to_delete_destination_title': 'Delete destination',
'confirm_to_delete_destination': 'Are you sure to delete the current destination?', 'confirm_to_delete_destination': 'Are you sure to delete the current destination?',
'replication': 'Replication', 'replication': 'Replication',
'add_new_replication': 'New Replication',
'name': 'Name', 'name': 'Name',
'description': 'Description', 'description': 'Description',
'destination': 'Destination', 'destination': 'Destination',
@ -161,12 +160,17 @@ var locale_messages = {
'endpoint': 'Endpoint', 'endpoint': 'Endpoint',
'test_connection': 'Test connection', 'test_connection': 'Test connection',
'add_new_destination': 'New Destination', 'add_new_destination': 'New Destination',
'confirm_to_change_password': 'Are you sure to change your password?', 'successful_changed_password': 'Password has been changed successfully.',
'change_profile': 'Change Profile', 'change_profile': 'Change Profile',
'confirm_to_change_profile': 'Are you sure to change your profile?', 'successful_changed_profile': 'User profile has been changed successfully.',
'form_is_invalid': 'Form content is invalid', 'form_is_invalid': 'Form content is invalid',
'form_is_invalid_message': 'Form content is invalid, please fill the required fields.', 'form_is_invalid_message': 'Form content is invalid, please fill the required fields.',
'administrator': 'Administrator', 'administrator': 'Administrator',
'popular_repositories': 'Popular Repositories', 'popular_repositories': 'Popular Repositories',
'harbor_intro_title': 'About Harbor' 'harbor_intro_title': 'About Harbor',
'mail_has_been_sent': 'Resetting Email has been sent.',
'send': 'Send',
'successful_signed_up': 'Signed up successfully.',
'add_new_policy': 'Add New Policy',
'edit_policy': 'Edit Policy'
}; };

View File

@ -9,11 +9,11 @@ var locale_messages = {
'user_management_and_role_assignment': '用户管理和角色分派', 'user_management_and_role_assignment': '用户管理和角色分派',
'why_use_harbor': '为什么要使用Harbor', 'why_use_harbor': '为什么要使用Harbor',
'index_desc': 'Harbor是可靠的企业级Registry服务器。企业用户可使用Harbor搭建私有容器Registry服务提高生产效率和安全度既可应用于生产环境也可以在开发环境中使用。', 'index_desc': 'Harbor是可靠的企业级Registry服务器。企业用户可使用Harbor搭建私有容器Registry服务提高生产效率和安全度既可应用于生产环境也可以在开发环境中使用。',
'index_desc_1': '安全: 确保知识产权在自己组织内部的管控之下。', 'index_desc_1': '<strong>安全:</strong> 确保知识产权在自己组织内部的管控之下。',
'index_desc_2': '效率: 搭建组织内部的私有容器Registry服务可显著降低访问公共Registry服务的网络需求。', 'index_desc_2': '<strong>效率:</strong> 搭建组织内部的私有容器Registry服务可显著降低访问公共Registry服务的网络需求。',
'index_desc_3': '访问控制: 提供基于角色的访问控制,可集成企业目前拥有的用户管理系统(如:AD/LDAP。', 'index_desc_3': '<strong>访问控制:</strong> 提供基于角色的访问控制,可集成企业目前拥有的用户管理系统(如:AD/LDAP。',
'index_desc_4': '审计: 所有访问Registry服务的操作均被记录便于日后审计。', 'index_desc_4': '<strong>审计:</strong> 所有访问Registry服务的操作均被记录便于日后审计。',
'index_desc_5': '管理界面: 具有友好易用图形管理界面。', 'index_desc_5': '<strong>管理界面:</strong> 具有友好易用图形管理界面。',
'view_all': '显示全部...', 'view_all': '显示全部...',
'repositories': '镜像仓库', 'repositories': '镜像仓库',
'project_repo_name': '项目/镜像仓库名称', 'project_repo_name': '项目/镜像仓库名称',
@ -134,7 +134,6 @@ var locale_messages = {
'confirm_to_delete_destination_title': '删除目标', 'confirm_to_delete_destination_title': '删除目标',
'confirm_to_delete_destination': '确认删除当前目标吗?', 'confirm_to_delete_destination': '确认删除当前目标吗?',
'replication': '复制', 'replication': '复制',
'add_new_replication': '新增复制',
'name': '名称', 'name': '名称',
'description': '描述', 'description': '描述',
'destination': '目标', 'destination': '目标',
@ -160,12 +159,17 @@ var locale_messages = {
'endpoint_is_required': '终端URL为必填项。', 'endpoint_is_required': '终端URL为必填项。',
'test_connection': '测试连接', 'test_connection': '测试连接',
'add_new_destination': '新建目标', 'add_new_destination': '新建目标',
'confirm_to_change_password': '确认要修改密码吗?', 'successful_changed_password': '修改密码操作成功。',
'change_profile': '修改个人信息', 'change_profile': '修改个人信息',
'confirm_to_change_profile': '确认要修改个人信息吗?', 'successful_changed_profile': '修改个人信息操作成功。',
'form_is_invalid': '表单内容无效', 'form_is_invalid': '表单内容无效',
'form_is_invalid_message': '表单内容无效,请填写必填字段。', 'form_is_invalid_message': '表单内容无效,请填写必填字段。',
'administrator': '管理员', 'administrator': '管理员',
'popular_repositories': '热门镜像仓库', 'popular_repositories': '热门镜像仓库',
'harbor_intro_title': '关于 Harbor' 'harbor_intro_title': '关于 Harbor',
'mail_has_been_sent': '重置密码邮件已发送。',
'send': '发送',
'successful_signed_up': '注册成功。',
'add_new_policy': '新增策略',
'edit_policy': '修改策略'
}; };

View File

@ -19,6 +19,9 @@
function getCurrentUserComplete(response) { function getCurrentUserComplete(response) {
if(angular.isDefined(response)) { if(angular.isDefined(response)) {
currentUser.set(response.data); currentUser.set(response.data);
if(location.pathname === '/') {
$window.location.href = '/dashboard';
}
} }
} }

View File

@ -4,7 +4,7 @@
<div class="section"> <div class="section">
<h1 class="col-md-12 col-md-offset-2 main-title title-color">// 'account_setting' | tr //</h1> <h1 class="col-md-12 col-md-offset-2 main-title title-color">// 'account_setting' | tr //</h1>
<div class="col-md-12 col-md-offset-2 main-content"> <div class="col-md-12 col-md-offset-2 main-content">
<modal-dialog title="//vm.modalTitle//" message="//vm.modalMessage//" action="vm.updateUser()"></modal-dialog> <modal-dialog modal-title="//vm.modalTitle//" modal-message="//vm.modalMessage//" action="vm.confirm()" confirm-only="true"></modal-dialog>
<form name="form" class="css-form form-horizontal" novalidate> <form name="form" class="css-form form-horizontal" novalidate>
<div class="form-group"> <div class="form-group">
<label for="username" class="col-sm-3 control-label">// 'username' | tr //:</label> <label for="username" class="col-sm-3 control-label">// 'username' | tr //:</label>
@ -102,7 +102,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-md-offset-7 col-md-10"> <div class="col-md-offset-7 col-md-10">
<input type="submit" class="btn btn-primary" ng-click="vm.confirmToUpdate(user)" data-toggle="modal" data-target="#myModal" value="// 'save' | tr //"> <input type="submit" class="btn btn-primary" ng-click="vm.updateUser(user)" value="// 'save' | tr //">
<input type="button" class="btn btn-default" ng-click="vm.cancel(form)" value="// 'cancel' | tr //"> <input type="button" class="btn btn-default" ng-click="vm.cancel(form)" value="// 'cancel' | tr //">
</div> </div>
</div> </div>

View File

@ -2,10 +2,11 @@
<div class="container container-custom"> <div class="container container-custom">
<div class="row extend-height"> <div class="row extend-height">
<div class="section"> <div class="section">
<modal-dialog modal-title="// 'forgot_password' | tr //" modal-message="// 'mail_has_been_sent' | tr //" confirm-only="true" action="vm.confirm()"></modal-dialog>
<h1 class="col-md-12 col-md-offset-2 main-title title-color">// 'forgot_password' | tr //</h1> <h1 class="col-md-12 col-md-offset-2 main-title title-color">// 'forgot_password' | tr //</h1>
<div class="row"> <div class="row">
<div class="col-md-12 col-md-offset-2 main-content"> <div class="col-md-12 col-md-offset-2 main-content">
<form name="form" class="form-horizontal css-form" ng-submit="form.$valid" > <form name="form" class="form-horizontal css-form">
<div class="form-group"> <div class="form-group">
<label for="email" class="col-sm-3 control-label">// 'email' | tr //:</label> <label for="email" class="col-sm-3 control-label">// 'email' | tr //:</label>
<div class="col-sm-7"> <div class="col-sm-7">
@ -17,14 +18,14 @@
</div> </div>
</div> </div>
<div class="error-message"> <div class="error-message">
<div ng-messages="form.uEmail.$error"> <div ng-messages="form.$submitted && form.uEmail.$error">
<span ng-message="required">// 'email_is_required' | tr //</span> <span ng-message="required">// 'email_is_required' | tr //</span>
</div> </div>
<span ng-show="vm.hasError">// vm.errorMessage | tr //</span> <span ng-show="vm.hasError">// vm.errorMessage | tr //</span>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-md-offset-8 col-md-10"> <div class="col-md-offset-8 col-md-10">
<input type="submit" class="btn btn-success" ng-disabled="form.$invalid" ng-click="vm.sendMail(user)" value="Send"> <input type="submit" class="btn btn-success" ng-click="form.$valid && vm.sendMail(user)" value="// 'send' | tr //">
</div> </div>
</div> </div>
</form> </form>

View File

@ -1,24 +0,0 @@
<nav class="navbar navbar-default navbar-custom" ng-controller="HeaderController as vm">
<div class="container container-custom">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-harbor-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/main"><img class="img-responsive" src="/static/resources/img/Harbor_Logo_rec.png" alt="Harbor's Logo"/></a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-harbor-navbar-collapse-1">
<optional-menu current="vm.current"></optional-menu>
<ul class="nav navbar-nav navbar-right">
<li>
<navigation-header></navigation-header>
</li>
<li>
<search-input search-input='vm.searchInput'></search-input>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>

View File

@ -39,18 +39,11 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="row"> <div class="row">
<div class="down-section"> <div class="down-section">
<modal-dialog title="// 'harbor_intro_title' | tr //" message='// vm.message //' content-type="text/html"></modal-dialog> <modal-dialog modal-title="// 'harbor_intro_title' | tr //" modal-message='// vm.message //' content-type="text/html" confirm-only="true"></modal-dialog>
<h4 class="page-header underlined">// 'why_use_harbor' | tr //</h4> <h4 class="page-header underlined">// 'why_use_harbor' | tr //</h4>
<p class="page-content text-justify"> <p class="page-content text-justify" style="line-height: 2em; height: 70%;">
// 'index_desc' | tr // // 'index_desc' | tr //
</p> </p>
<ul>
<li class="long-line">▪︎ // 'index_desc_1' | tr //</li>
<li class="long-line">▪︎ // 'index_desc_2' | tr //</li>
<li class="long-line">▪︎ // 'index_desc_3' | tr //</li>
<li class="long-line">▪︎ // 'index_desc_4' | tr //</li>
<li class="long-line">▪︎ // 'index_desc_5' | tr //</li>
</ul>
<div class="page-content pull-right"> <div class="page-content pull-right">
<a href="javascript:void(0);" data-toggle="modal" data-target="#myModal"><span class="glyphicon glyphicon-triangle-right"></span> // 'view_all' | tr //</a> <a href="javascript:void(0);" data-toggle="modal" data-target="#myModal"><span class="glyphicon glyphicon-triangle-right"></span> // 'view_all' | tr //</a>
</div> </div>

View File

@ -6,7 +6,7 @@
<span class="sr-only">Toggle navigation</span> <span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
<a class="navbar-brand" href="/"><img class="img-responsive" src="/static/resources/img/Harbor_Logo_rec.png" alt="Harbor's Logo"/></a> <a class="navbar-brand" href="//vm.defaultUrl//"><img class="img-responsive" src="/static/resources/img/Harbor_Logo_rec.png" alt="Harbor's Logo"/></a>
</div> </div>
<!-- Collect the nav links, forms, and other content for toggling --> <!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-harbor-navbar-collapse-1"> <div class="collapse navbar-collapse" id="bs-harbor-navbar-collapse-1">

View File

@ -2,6 +2,7 @@
<div class="container container-custom"> <div class="container container-custom">
<div class="row extend-height"> <div class="row extend-height">
<div class="section"> <div class="section">
<modal-dialog modal-title="// 'sign_up' | tr //" modal-message="// 'successful_signed_up' | tr //" confirm-only="true" action="vm.confirm()"></modal-dialog>
<h1 class="col-md-12 col-md-offset-2 main-title title-color">// 'sign_up' | tr //</h1> <h1 class="col-md-12 col-md-offset-2 main-title title-color">// 'sign_up' | tr //</h1>
<div class="row"> <div class="row">
<div class="col-md-12 col-md-offset-2 main-content"> <div class="col-md-12 col-md-offset-2 main-content">