updates of I18n refinement and add confirm dialog when deleting project member.

This commit is contained in:
kunw 2016-06-20 16:05:14 +08:00
parent 5bb80bfb5c
commit 58487ed06c
11 changed files with 62 additions and 45 deletions

View File

@ -3,7 +3,7 @@ runmode = dev
[lang] [lang]
types = en-US|zh-CN types = en-US|zh-CN
names = English|中文 names = en-US|zh-CN
[dev] [dev]
httpport = 80 httpport = 80

View File

@ -35,6 +35,7 @@ const (
) )
var supportLanguages map[string]langType var supportLanguages map[string]langType
var mappingLangNames map[string]string
// Prepare extracts the language information from request and populate data for rendering templates. // Prepare extracts the language information from request and populate data for rendering templates.
func (b *BaseController) Prepare() { func (b *BaseController) Prepare() {
@ -49,35 +50,22 @@ func (b *BaseController) Prepare() {
} }
} }
if _, exist := supportLanguages[lang]; exist == false { //Check if support the request language.
lang = defaultLang //Set default language if not supported.
}
sessionLang := b.GetSession("lang") sessionLang := b.GetSession("lang")
if sessionLang != nil { if sessionLang != nil {
b.SetSession("Lang", lang) b.SetSession("Lang", lang)
lang = sessionLang.(string) lang = sessionLang.(string)
} }
if _, exist := supportLanguages[lang]; !exist { //Check if support the request language.
lang = defaultLang //Set default language if not supported.
}
curLang := langType{ curLang := langType{
Lang: lang, Lang: lang,
} }
restLangs := make([]*langType, 0, len(langTypes)-1)
for _, v := range langTypes {
if lang != v.Lang {
restLangs = append(restLangs, v)
} else {
curLang.Name = v.Name
}
}
// Set language properties. // Set language properties.
b.Lang = lang
b.Data["Lang"] = curLang.Lang b.Data["Lang"] = curLang.Lang
b.Data["CurLang"] = curLang.Name
b.Data["RestLangs"] = restLangs
b.Data["SupportLanguages"] = supportLanguages
authMode := strings.ToLower(os.Getenv("AUTH_MODE")) authMode := strings.ToLower(os.Getenv("AUTH_MODE"))
if authMode == "" { if authMode == "" {
@ -143,10 +131,11 @@ func (cc *CommonController) LogOut() {
// SwitchLanguage User can swith to prefered language // SwitchLanguage User can swith to prefered language
func (cc *CommonController) SwitchLanguage() { func (cc *CommonController) SwitchLanguage() {
lang := cc.GetString("lang") lang := cc.GetString("lang")
if _, exist := supportLanguages[lang]; exist { if _, exist := supportLanguages[lang]; !exist {
cc.SetSession("lang", lang) lang = defaultLang
cc.Data["Lang"] = lang
} }
cc.SetSession("lang", lang)
cc.Data["Lang"] = lang
cc.Redirect(cc.Ctx.Request.Header.Get("Referer"), http.StatusFound) cc.Redirect(cc.Ctx.Request.Header.Get("Referer"), http.StatusFound)
} }
@ -184,8 +173,6 @@ func init() {
} }
} }
beego.AddFuncMap("i18n", i18n.Tr)
langs := strings.Split(beego.AppConfig.String("lang::types"), "|") langs := strings.Split(beego.AppConfig.String("lang::types"), "|")
names := strings.Split(beego.AppConfig.String("lang::names"), "|") names := strings.Split(beego.AppConfig.String("lang::names"), "|")

View File

@ -14,8 +14,9 @@
vm.currentLanguage = I18nService().getCurrentLanguage(); vm.currentLanguage = I18nService().getCurrentLanguage();
vm.languageName = I18nService().getLanguageName(vm.currentLanguage); vm.languageName = I18nService().getLanguageName(vm.currentLanguage);
console.log('current language:' + I18nService().getCurrentLanguage()); console.log('current language:' + vm.languageName);
vm.supportLanguages = I18nService().getSupportLanguages();
vm.user = currentUser.get(); vm.user = currentUser.get();
vm.setLanguage = setLanguage; vm.setLanguage = setLanguage;
vm.logOut = logOut; vm.logOut = logOut;

View File

@ -7,5 +7,5 @@
<a ng-show="vm.userId != vm.currentUserId" href="javascript:void(0);" ng-click="vm.cancelUpdate()" title="Cancel"> <a ng-show="vm.userId != vm.currentUserId" href="javascript:void(0);" ng-click="vm.cancelUpdate()" title="Cancel">
<span ng-if="vm.editMode" class="glyphicon glyphicon-repeat"></span> <span ng-if="vm.editMode" class="glyphicon glyphicon-repeat"></span>
</a> </a>
<a ng-show="vm.userId != vm.currentUserId && !vm.editMode" href="javascript:void(0);" ng-click="vm.deleteProjectMember({projectId: vm.projectId, userId: vm.userId})" title="Delete"><span class="glyphicon glyphicon-trash"></span></a> <a ng-show="vm.userId != vm.currentUserId && !vm.editMode" href="javascript:void(0);" data-toggle="modal" data-target="#myModal" ng-click="vm.deleteProjectMember()" title="Delete"><span class="glyphicon glyphicon-trash"></span></a>
</td> </td>

View File

@ -6,9 +6,9 @@
.module('harbor.project.member') .module('harbor.project.member')
.directive('editProjectMember', editProjectMember); .directive('editProjectMember', editProjectMember);
EditProjectMemberController.$inject = ['$scope', 'roles', 'getRole','EditProjectMemberService', 'DeleteProjectMemberService']; EditProjectMemberController.$inject = ['$scope', 'roles', 'getRole','EditProjectMemberService'];
function EditProjectMemberController($scope, roles, getRole, EditProjectMemberService, DeleteProjectMemberService) { function EditProjectMemberController($scope, roles, getRole, EditProjectMemberService) {
var vm = this; var vm = this;
vm.roles = roles(); vm.roles = roles();
@ -37,10 +37,8 @@
} }
} }
function deleteProjectMember(e) { function deleteProjectMember() {
DeleteProjectMemberService(e.projectId, e.userId) vm.delete();
.success(editProjectMemberComplete)
.error(editProjectMemberFailed);
} }
function editProjectMemberComplete(data, status, headers) { function editProjectMemberComplete(data, status, headers) {
@ -71,6 +69,7 @@
'currentUserId': '=', 'currentUserId': '=',
'roleName': '=', 'roleName': '=',
'projectId': '=', 'projectId': '=',
'delete': '&',
'reload': '&' 'reload': '&'
}, },
'controller': EditProjectMemberController, 'controller': EditProjectMemberController,

View File

@ -12,13 +12,14 @@
</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>
<div class="sub-pane"> <div class="sub-pane">
<table class="table table-pane" > <table class="table table-pane" >
<thead> <thead>
<th width="30%">// 'username' | tr //</th><th width="40%">// 'role' | tr //</th><th width="30%">// 'operation' | tr //</th> <th width="30%">// 'username' | tr //</th><th width="40%">// 'role' | tr //</th><th width="30%">// 'operation' | tr //</th>
</thead> </thead>
<tbody> <tbody>
<tr ng-repeat="pr in vm.projectMembers" edit-project-member username="pr.username" project-id="vm.projectId" user-id="pr.user_id" current-user-id="vm.user.user_id" role-name="pr.role_name" reload='vm.search({projectId: vm.projectId, username: vm.username})'></tr> <tr ng-repeat="pr in vm.projectMembers" edit-project-member username="pr.username" project-id="vm.projectId" user-id="pr.user_id" delete="vm.deleteMember({projectId: vm.projectId, userId: pr.user_id})" current-user-id="vm.user.user_id" role-name="pr.role_name" reload='vm.search({projectId: vm.projectId, username: vm.username})'></tr>
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -6,17 +6,19 @@
.module('harbor.project.member') .module('harbor.project.member')
.directive('listProjectMember', listProjectMember); .directive('listProjectMember', listProjectMember);
ListProjectMemberController.$inject = ['$scope', 'ListProjectMemberService', 'getParameterByName', '$location', 'currentUser']; ListProjectMemberController.$inject = ['$scope', 'ListProjectMemberService', 'DeleteProjectMemberService', 'getParameterByName', '$location', 'currentUser'];
function ListProjectMemberController($scope, ListProjectMemberService, getParameterByName, $location, currentUser) { function ListProjectMemberController($scope, ListProjectMemberService, DeleteProjectMemberService, getParameterByName, $location, currentUser) {
var vm = this; var vm = this;
vm.isOpen = false; vm.isOpen = false;
vm.search = search; vm.search = search;
vm.addProjectMember = addProjectMember; vm.addProjectMember = addProjectMember;
vm.deleteProjectMember = deleteProjectMember;
vm.deleteMember = deleteMember
vm.retrieve = retrieve; vm.retrieve = retrieve;
vm.username = ''; vm.username = '';
vm.projectId = getParameterByName('project_id', $location.absUrl()); vm.projectId = getParameterByName('project_id', $location.absUrl());
vm.retrieve(); vm.retrieve();
@ -38,6 +40,30 @@
vm.isOpen = true; vm.isOpen = true;
} }
} }
function deleteProjectMember() {
DeleteProjectMemberService(vm.selectedProjectId, vm.selectedUserId)
.success(deleteProjectMemberSuccess)
.error(deleteProjectMemberFailed);
}
function deleteMember(e) {
vm.selectedProjectId = e.projectId;
vm.selectedUserId = e.userId;
vm.modalTitle = 'Delete project member';
vm.modalMessage = 'Are you sure to delete the current member?';
}
function deleteProjectMemberSuccess(data, status) {
console.log('Successful delete project member complete.');
vm.retrieve();
}
function deleteProjectMemberFailed(e) {
console.log('Failed to edit project member:' + e);
}
function retrieve() { function retrieve() {
ListProjectMemberService(vm.projectId, {'username': vm.username}) ListProjectMemberService(vm.projectId, {'username': vm.username})

View File

@ -128,5 +128,7 @@ var locale_messages = {
'to_harbor': ' to Harbor!', 'to_harbor': ' to Harbor!',
'continue' : 'Continue', 'continue' : 'Continue',
'no_projects_add_new_project': 'No projects, add new project now.', 'no_projects_add_new_project': 'No projects, add new project now.',
'no_repositories': 'No repositories found, please use "docker push" to upload images.' 'no_repositories': 'No repositories found, please use "docker push" to upload images.',
'confirm_to_delete_member_title': 'Delete project member',
'confirm_to_delete_member': 'Are you sure to delete the current project member?'
}; };

View File

@ -126,5 +126,7 @@ var locale_messages = {
'to_harbor': ' 使用Harbor!', 'to_harbor': ' 使用Harbor!',
'continue' : '继续', 'continue' : '继续',
'no_projects_add_new_project': '当前没有项目,请新增项目。', 'no_projects_add_new_project': '当前没有项目,请新增项目。',
'no_repositories': '未发现镜像,请用"docker push"命令上传镜像。' 'no_repositories': '未发现镜像,请用"docker push"命令上传镜像。',
'confirm_to_delete_member_title': '删除项目成员',
'confirm_to_delete_member': '确认删除当前项目成员吗?'
}; };

View File

@ -18,7 +18,7 @@
}; };
var isSupportLanguage = function(language) { var isSupportLanguage = function(language) {
for (var i in supportLanguages) { for (var i in supportLanguages) {
if(language === i) { if(language === String(i)) {
return true; return true;
} }
} }
@ -47,6 +47,9 @@
} }
return supportLanguages[language]; return supportLanguages[language];
}, },
'getSupportLanguages': function() {
return supportLanguages;
},
'unset': function(){ 'unset': function(){
$cookies.put('language', defaultLanguage, cookieOptions); $cookies.put('language', defaultLanguage, cookieOptions);
}, },

View File

@ -8,9 +8,7 @@
<li class="dropdown-submenu"> <li class="dropdown-submenu">
<a tabindex="-1" href="#"><span class="glyphicon glyphicon-globe"></span> //vm.languageName//</a> <a tabindex="-1" href="#"><span class="glyphicon glyphicon-globe"></span> //vm.languageName//</a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
{{ range $key, $value := .SupportLanguages }} <li ng-repeat="(key, value) in vm.supportLanguages"><a href="javascript:void(0);" ng-click="vm.setLanguage(key)">// value //</a></li>
<li><a href="javascript:void(0);" ng-click="vm.setLanguage('{{ $key }}')">{{ $value.Name }}</a></li>
{{ end }}
</ul> </ul>
</li> </li>
<li class="divider"></li> <li class="divider"></li>
@ -23,9 +21,7 @@
<span class="glyphicon glyphicon-globe"></span> //vm.languageName// <span class="glyphicon glyphicon-globe"></span> //vm.languageName//
</a> </a>
<ul class="dropdown-menu multi-level" role="menu" aria-labelledby="dropdownMenu"> <ul class="dropdown-menu multi-level" role="menu" aria-labelledby="dropdownMenu">
{{ range $key, $value := .SupportLanguages }} <li ng-repeat="(key, value) in vm.supportLanguages"><a href="javascript:void(0);" ng-click="vm.setLanguage(key)">// value //</a></li>
<li><a href="javascript:void(0);" ng-click="vm.setLanguage('{{ $key }}')">{{ $value.Name }}</a></li>
{{ end }}
</ul> </ul>
</div> </div>
{{ end }} {{ end }}