From 07c7ce403cbb2b2c361a22a410ff2712b88929c6 Mon Sep 17 00:00:00 2001 From: Wenkai Yin Date: Wed, 1 Jun 2016 13:47:23 +0800 Subject: [PATCH 1/3] bug fix: the length should be 0 when initialize a slice --- api/utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/utils.go b/api/utils.go index 97799cc55..e63fae2be 100644 --- a/api/utils.go +++ b/api/utils.go @@ -48,7 +48,7 @@ func hasProjectAdminRole(userID int, projectID int64) bool { //sysadmin has all privileges to all projects func listRoles(userID int, projectID int64) ([]models.Role, error) { - roles := make([]models.Role, 1) + roles := make([]models.Role, 0, 1) isSysAdmin, err := dao.IsAdminRole(userID) if err != nil { return roles, err From e8531edd39693c0bde0fd0fb47ca4ef11918270c Mon Sep 17 00:00:00 2001 From: kunw Date: Thu, 2 Jun 2016 12:10:32 +0800 Subject: [PATCH 2/3] updates for attribute-rename of js --- static/resources/js/item-detail.js | 40 ++++++++++++++++-------------- static/resources/js/project.js | 20 +++++++-------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/static/resources/js/item-detail.js b/static/resources/js/item-detail.js index 6f445f717..b37089d75 100644 --- a/static/resources/js/item-detail.js +++ b/static/resources/js/item-detail.js @@ -243,22 +243,26 @@ jQuery(function(){ $("#tblUser tbody tr").remove(); for(var i = 0; i < userList.length; ){ - var userId = userList[i].UserId; - var roleId = userList[i].RoleId; + var userId = userList[i].user_id; + var roleId = userList[i].role_id; var username = userList[i].username; - var roleNameList = []; +// var roleNameList = []; - for(var j = i; j < userList.length; i++, j++){ - if(userList[j].UserId == userId){ - roleNameList.push(name_mapping[userList[j].Rolename]); - }else{ - break; - } - } +// for(var j = i; j < userList.length; i++, j++){ +// if(userList[j].UserId == userId){ +// roleNameList.push(name_mapping[userList[j].Rolename]); +// }else{ +// break; +// } +// } - var row = '' + +// var row = '' + +// '' + username + '' + +// '' + roleNameList.join(",") + '' + +// ''; + var row = '' + '' + username + '' + - '' + roleNameList.join(",") + '' + + '' + '--' + '' + ''; var isShowOperations = true; if(loginedUserRoleId >= 3 /*role: developer guest*/){ @@ -285,10 +289,10 @@ jQuery(function(){ $("#tabOperationLog tbody").append( '' + '' + e.Username + '' + - '' + e.RepoName + '' + - '' + e.RepoTag + '' + - '' + e.Operation + '' + - '' + moment(new Date(e.OpTime)).format("YYYY-MM-DD HH:mm:ss") + '' + + '' + e.repo_name + '' + + '' + e.repo_tag + '' + + '' + e.operation + '' + + '' + moment(new Date(e.op_time)).format("YYYY-MM-DD HH:mm:ss") + '' + ''); }); } @@ -326,7 +330,7 @@ jQuery(function(){ } }).exec() ).done(function(userList){ - listUserByProjectCallback(userList || []); +// listUserByProjectCallback(userList || []); $("#tblUser .glyphicon-pencil").on("click", function(e){ var userId = $(this).attr("userid") getUserRoleCallback(userId); @@ -404,7 +408,7 @@ jQuery(function(){ new AjaxUtil({ url: "/api/projects/" + projectId + "/logs/filter", - data:{"username":username, "project_id" : projectId, "keywords" : getKeyWords() , "beginTimestamp" : beginTimestamp, "endTimestamp" : endTimestamp}, + data:{"Username":username, "project_id" : Number(projectId), "keywords" : getKeyWords() , "begin_timestamp" : beginTimestamp, "end_timestamp" : endTimestamp}, type: "post", success: function(data, status, xhr){ if(xhr && xhr.status == 200){ diff --git a/static/resources/js/project.js b/static/resources/js/project.js index 97da2d6f9..a59dfa85a 100644 --- a/static/resources/js/project.js +++ b/static/resources/js/project.js @@ -19,7 +19,7 @@ jQuery(function(){ type: "get", success: function(data, status, xhr){ if(xhr && xhr.status == 200){ - if(data.HasAdminRole == 1) { + if(data.has_admin_role == 1) { renderForAdminRole(); } renderForAnyRole(); @@ -55,16 +55,16 @@ jQuery(function(){ $("#tblProject tbody tr").remove(); $.each(data || [], function(i, e){ var row = '' + - '' + e.Name + '' + - '' + moment(new Date(e.CreationTime)).format("YYYY-MM-DD HH:mm:ss") + ''; + '' + e.name + '' + + '' + moment(new Date(e.creation_time)).format("YYYY-MM-DD HH:mm:ss") + ''; if(e.Public == 1 && e.Togglable){ - row += '' + row += '' } else if (e.Public == 1) { - row += ''; + row += ''; } else if (e.Public == 0 && e.Togglable) { - row += ''; + row += ''; } else if (e.Public == 0) { - row += ''; + row += ''; row += ''; } $("#tblProject tbody").append(row); @@ -164,11 +164,11 @@ jQuery(function(){ '' + e.username + '' + '' + e.email + ''; if(e.HasAdminRole == 1){ - row += ''; + row += ''; } else { - row += ''; + row += ''; } - row += ''; + row += ''; row += ''; $("#tblUser tbody").append(row); }); From 32ab3164fa86cc8b228ff5ac651d6775f92e5544 Mon Sep 17 00:00:00 2001 From: kunw Date: Thu, 2 Jun 2016 16:56:16 +0800 Subject: [PATCH 3/3] updates for adapting renamed model attributes and reformated code structures. --- static/resources/css/base.css | 1 - static/resources/js/change-password.js | 50 +- static/resources/js/common.js | 82 +-- static/resources/js/forgot-password.js | 52 +- static/resources/js/header-login.js | 6 +- static/resources/js/item-detail.js | 870 ++++++++++++------------ static/resources/js/login.js | 2 +- static/resources/js/project.js | 179 ++--- static/resources/js/register.js | 50 +- static/resources/js/reset-password.js | 43 +- static/resources/js/search.js | 4 +- static/resources/js/sign-in.js | 10 +- static/resources/js/validate-options.js | 80 +-- views/change-password.tpl | 48 +- views/forgot-password.tpl | 26 +- views/index.tpl | 40 +- views/item-detail.tpl | 258 ++++--- views/project.tpl | 132 ++-- views/register.tpl | 114 ++-- views/reset-password-mail.tpl | 8 +- views/reset-password.tpl | 38 +- views/search.tpl | 14 +- views/segment/base-layout.tpl | 22 +- views/segment/foot-content.tpl | 14 +- views/segment/header-content.tpl | 128 ++-- views/segment/modal-dialog.tpl | 38 +- views/sign-in.tpl | 40 +- 27 files changed, 1170 insertions(+), 1179 deletions(-) diff --git a/static/resources/css/base.css b/static/resources/css/base.css index 0f8b9bd14..685da65ea 100644 --- a/static/resources/css/base.css +++ b/static/resources/css/base.css @@ -13,7 +13,6 @@ limitations under the License. */ .footer { - margin-top: 60px; width: 100%; /* Set the fixed height of the footer here */ height: 60px; diff --git a/static/resources/js/change-password.js b/static/resources/js/change-password.js index 4c8c2efdc..0a536b7b4 100644 --- a/static/resources/js/change-password.js +++ b/static/resources/js/change-password.js @@ -24,7 +24,7 @@ jQuery(function(){ error: function(jqXhr){ if(jqXhr && jqXhr.status == 401){ document.location = "/signIn"; - } + } } }).exec(); @@ -36,12 +36,12 @@ jQuery(function(){ function bindEnterKey(){ $(document).on("keydown", function(e){ if(e.keyCode == 13){ - e.preventDefault(); - if($("#txtCommonSearch").is(":focus")){ - document.location = "/search?q=" + $("#txtCommonSearch").val(); - }else{ - $("#btnSubmit").trigger("click"); - } + e.preventDefault(); + if($("#txtCommonSearch").is(":focus")){ + document.location = "/search?q=" + $("#txtCommonSearch").val(); + }else{ + $("#btnSubmit").trigger("click"); + } } }); } @@ -61,35 +61,35 @@ jQuery(function(){ type: "put", data: {"old_password": oldPassword, "new_password" : password}, beforeSend: function(e){ - unbindEnterKey(); - $("h1").append(spinner.el); - $("#btnSubmit").prop("disabled", true); + unbindEnterKey(); + $("h1").append(spinner.el); + $("#btnSubmit").prop("disabled", true); }, complete: function(xhr, status){ spinner.stop(); $("#btnSubmit").prop("disabled", false); if(xhr && xhr.status == 200){ $("#dlgModal") - .dialogModal({ - "title": i18n.getMessage("title_change_password"), - "content": i18n.getMessage("change_password_successfully"), - "callback": function(){ - window.close(); - } - }); + .dialogModal({ + "title": i18n.getMessage("title_change_password"), + "content": i18n.getMessage("change_password_successfully"), + "callback": function(){ + window.close(); + } + }); } }, error: function(jqXhr, status, error){ if(jqXhr && jqXhr.responseText.length){ $("#dlgModal") - .dialogModal({ - "title": i18n.getMessage("title_change_password"), - "content": i18n.getMessage(jqXhr.responseText), - "callback": function(){ - bindEnterKey(); - return; - } - }); + .dialogModal({ + "title": i18n.getMessage("title_change_password"), + "content": i18n.getMessage(jqXhr.responseText), + "callback": function(){ + bindEnterKey(); + return; + } + }); } } }).exec(); diff --git a/static/resources/js/common.js b/static/resources/js/common.js index 7c7397d6b..411ea315c 100644 --- a/static/resources/js/common.js +++ b/static/resources/js/common.js @@ -12,8 +12,9 @@ See the License for the specific language governing permissions and limitations under the License. */ + var AjaxUtil = function(params){ - + this.url = params.url; this.data = params.data; this.dataRaw = params.dataRaw; @@ -31,39 +32,39 @@ AjaxUtil.prototype.exec = function(){ var self = this; return $.ajax({ - url: self.url, - contentType: (self.dataRaw ? "application/x-www-form-urlencoded; charset=UTF-8" : "application/json; charset=utf-8"), - data: JSON.stringify(self.data) || self.dataRaw, - type: self.type, - dataType: "json", - success: function(data, status, xhr){ - if(self.success != null){ - self.success(data, status, xhr); - } - }, - complete: function(jqXhr, status) { - if(self.complete != null){ - self.complete(jqXhr, status); - } - }, - error: function(jqXhr){ - if(self.error != null){ - self.error(jqXhr); - }else{ - var errorMessage = self.errors[jqXhr.status] || jqXhr.responseText; - if(jqXhr.status == 401){ - var lastUri = location.pathname + location.search; - if(lastUri != ""){ - document.location = "/signIn?uri=" + encodeURIComponent(lastUri); - }else{ - document.location = "/signIn"; + url: self.url, + contentType: (self.dataRaw ? "application/x-www-form-urlencoded; charset=UTF-8" : "application/json; charset=utf-8"), + data: JSON.stringify(self.data) || self.dataRaw, + type: self.type, + dataType: "json", + success: function(data, status, xhr){ + if(self.success != null){ + self.success(data, status, xhr); + } + }, + complete: function(jqXhr, status) { + if(self.complete != null){ + self.complete(jqXhr, status); + } + }, + error: function(jqXhr){ + if(self.error != null){ + self.error(jqXhr); + }else{ + var errorMessage = self.errors[jqXhr.status] || jqXhr.responseText; + if(jqXhr.status == 401){ + var lastUri = location.pathname + location.search; + if(lastUri != ""){ + document.location = "/signIn?uri=" + encodeURIComponent(lastUri); + }else{ + document.location = "/signIn"; + } + }else if($.trim(errorMessage).length > 0){ + $("#dlgModal").dialogModal({"title": i18n.getMessage("operation_failed"), "content": errorMessage}); } - }else if($.trim(errorMessage).length > 0){ - $("#dlgModal").dialogModal({"title": i18n.getMessage("operation_failed"), "content": errorMessage}); } } - } - }); + }); }; var SUPPORT_LANGUAGES = { @@ -133,7 +134,7 @@ jQuery(function(){ var self = this; $("#dlgLabel", self).text(settings.title); - + if(options.text){ $("#dlgBody", self).html(settings.content); }else if(typeof settings.content == "object"){ @@ -141,9 +142,9 @@ jQuery(function(){ var lines = ['
']; for(var item in settings.content){ lines.push('
'+ - '' + - '

' + settings.content[item] + '

' + - '
'); + '' + + '

' + settings.content[item] + '

' + + ''); } lines.push('
'); $("#dlgBody", self).html(lines.join("")); @@ -153,10 +154,15 @@ jQuery(function(){ } if(settings.callback != null){ - $("#dlgConfirm").on("click", function(){ - settings.callback(); + var hasEntered = false; + $("#dlgConfirm").on("click", function(e){ + if(!hasEntered) { + hasEntered = true; + settings.callback(); + + } }); } $(self).modal('show'); } -}); +}); \ No newline at end of file diff --git a/static/resources/js/forgot-password.js b/static/resources/js/forgot-password.js index b7c4be9e6..d6fdea319 100644 --- a/static/resources/js/forgot-password.js +++ b/static/resources/js/forgot-password.js @@ -13,26 +13,26 @@ limitations under the License. */ jQuery(function(){ - + $("#divErrMsg").css({"display": "none"}); validateOptions.Items = ["#EmailF"]; function bindEnterKey(){ $(document).on("keydown", function(e){ if(e.keyCode == 13){ - e.preventDefault(); - if($("#txtCommonSearch").is(":focus")){ - document.location = "/search?q=" + $("#txtCommonSearch").val(); - }else{ - $("#btnSubmit").trigger("click"); - } + e.preventDefault(); + if($("#txtCommonSearch").is(":focus")){ + document.location = "/search?q=" + $("#txtCommonSearch").val(); + }else{ + $("#btnSubmit").trigger("click"); + } } }); } function unbindEnterKey(){ $(document).off("keydown"); } - bindEnterKey(); + bindEnterKey(); var spinner = new Spinner({scale:1}).spin(); $("#btnSubmit").on("click", function(){ @@ -44,20 +44,20 @@ jQuery(function(){ "type": "get", "data": {"username": username, "email": email}, "beforeSend": function(e){ - unbindEnterKey(); - $("h1").append(spinner.el); - $("#btnSubmit").prop("disabled", true); + unbindEnterKey(); + $("h1").append(spinner.el); + $("#btnSubmit").prop("disabled", true); }, "success": function(data, status, xhr){ if(xhr && xhr.status == 200){ $("#dlgModal") - .dialogModal({ - "title": i18n.getMessage("title_forgot_password"), - "content": i18n.getMessage("email_has_been_sent"), - "callback": function(){ - document.location="/"; - } - }); + .dialogModal({ + "title": i18n.getMessage("title_forgot_password"), + "content": i18n.getMessage("email_has_been_sent"), + "callback": function(){ + document.location="/"; + } + }); } }, @@ -68,14 +68,14 @@ jQuery(function(){ "error": function(jqXhr, status, error){ if(jqXhr){ $("#dlgModal") - .dialogModal({ - "title": i18n.getMessage("title_forgot_password"), - "content": i18n.getMessage(jqXhr.responseText), - "callback": function(){ - bindEnterKey(); - return; - } - }); + .dialogModal({ + "title": i18n.getMessage("title_forgot_password"), + "content": i18n.getMessage(jqXhr.responseText), + "callback": function(){ + bindEnterKey(); + return; + } + }); } } }); diff --git a/static/resources/js/header-login.js b/static/resources/js/header-login.js index 8e1a6e35e..1bd5cda0d 100644 --- a/static/resources/js/header-login.js +++ b/static/resources/js/header-login.js @@ -13,20 +13,20 @@ limitations under the License. */ jQuery(function(){ - $("#btnSignUp").css({"visibility": "visible"}); + $("#btnSignUp").css({"visibility": "visible"}); $(document).on("keydown", function(e){ if(e.keyCode == 13){ e.preventDefault(); if($("#txtCommonSearch").is(":focus")){ - document.location = "/search?q=" + $("#txtCommonSearch").val(); + document.location = "/search?q=" + $("#txtCommonSearch").val(); } } }); $("#btnSignIn").on("click", function(){ document.location = "/signIn"; }); - $("#btnSignUp").on("click", function(){ + $("#btnSignUp").on("click", function(){ document.location = "/register"; }); }); \ No newline at end of file diff --git a/static/resources/js/item-detail.js b/static/resources/js/item-detail.js index b37089d75..9deb09e34 100644 --- a/static/resources/js/item-detail.js +++ b/static/resources/js/item-detail.js @@ -23,465 +23,451 @@ jQuery(function(){ if(jqXhr.status == 403){ return false; } - } + } } }).exec() - ).then(function(){ - noNeedToLoginCallback(); - needToLoginCallback(); - }).fail(function(){ - noNeedToLoginCallback(); - }); - - function noNeedToLoginCallback(){ - - $("#tabItemDetail a:first").tab("show"); - $("#btnFilterOption button:first").addClass("active"); - $("#divErrMsg").hide(); - - if($("#public").val() == 1){ - $("#tabItemDetail li:eq(1)").hide(); - $("#tabItemDetail li:eq(2)").hide(); - } - - listRepo($("#repoName").val()); - - function listRepo(repoName){ + ).then(function(){ + noNeedToLoginCallback(); + needToLoginCallback(); + }).fail(function(){ + noNeedToLoginCallback(); + }); + function noNeedToLoginCallback(){ + + $("#tabItemDetail a:first").tab("show"); + $("#btnFilterOption button:first").addClass("active"); $("#divErrMsg").hide(); + + if($("#public").val() == 1){ + $("#tabItemDetail li:eq(1)").hide(); + $("#tabItemDetail li:eq(2)").hide(); + } + + listRepo($("#repoName").val()); + + function listRepo(repoName){ + + $("#divErrMsg").hide(); - new AjaxUtil({ - url: "/api/repositories?project_id=" + $("#projectId").val() + "&q=" + repoName, - type: "get", - success: function(data, status, xhr){ - if(xhr && xhr.status == 200){ - $("#accordionRepo").children().remove(); - if(data == null){ - $("#divErrMsg").show(); - $("#divErrMsg center").html(i18n.getMessage("no_repo_exists")); - return; - } - $.each(data, function(i, e){ - var targetId = e.replace(/\//g, "------"); - var row = '
' + + new AjaxUtil({ + url: "/api/repositories?project_id=" + $("#projectId").val() + "&q=" + repoName, + type: "get", + success: function(data, status, xhr){ + if(xhr && xhr.status == 200){ + $("#accordionRepo").children().remove(); + if(data == null){ + $("#divErrMsg").show(); + $("#divErrMsg center").html(i18n.getMessage("no_repo_exists")); + return; + } + $.each(data, function(i, e){ + var targetId = e.replace(/\//g, "------"); + var row = '
' + '' + - '
' + - '
' + - '
' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '
' + i18n.getMessage("tag")+ ' ' + i18n.getMessage("pull_command") + '
' - '
' + - '
' + - '
' + - '
'; - $("#accordionRepo").append(row); - }); - if(repoName != ""){ - $("#txtRepoName").val(repoName); - $("#accordionRepo #heading0 a").trigger("click"); + '

' + + '' + + ' ' + e + ' ' + + '' + + '

' + + '
' + + '
' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + i18n.getMessage("tag")+ ' ' + i18n.getMessage("pull_command") + '
' + '
' + + '
' + + '
' + + ''; + $("#accordionRepo").append(row); + }); + if(repoName != ""){ + $("#txtRepoName").val(repoName); + $("#accordionRepo #heading0 a").trigger("click"); + } } } - } - }).exec(); - } - $("#btnSearchRepo").on("click", function(){ - listRepo($.trim($("#txtRepoName").val())); - }); - - $('#accordionRepo').on('show.bs.collapse', function (e) { - $('#accordionRepo .in').collapse('hide'); - var targetId = $(e.target).attr("targetId"); - var repoName = targetId.replace(/------/g, "/"); - new AjaxUtil({ - url: "/api/repositories/tags?repo_name=" + repoName, - type: "get", - success: function(data, status, xhr){ - $('#' + targetId +' table tbody tr').remove(); - var row = []; - for(var i in data){ - var tagName = data[i] - row.push('' + tagName + ''); - } - $('#' + targetId +' table tbody').append(row.join("")); - $('#' + targetId +' table tbody tr a').on("click", function(e){ - var imageId = $(this).attr("imageId"); - var repoName = $(this).attr("repoName"); - new AjaxUtil({ - url: "/api/repositories/manifests?repo_name=" + repoName + "&tag=" + imageId, - type: "get", - success: function(data, status, xhr){ - if(data){ - for(var i in data){ - if(data[i] == ""){ - data[i] = "N/A"; - } - } - data.Created = moment(new Date(data.Created)).format("YYYY-MM-DD HH:mm:ss"); - - $("#dlgModal").dialogModal({"title": i18n.getMessage("image_details"), "content": data}); - } - } - }).exec(); - }); - } - }).exec(); - }); - } - - function needToLoginCallback(){ - - var hasAuthorization = false; - - $.when( - new AjaxUtil({ - url: "/api/projects/" + $("#projectId").val() + "/members/current", - type: "get", - success: function(data, status, xhr){ - if(xhr && xhr.status == 200 && data.roles != null && data.roles.length > 0){ - hasAuthorization = true; - } - } - }).exec()) - .done(function(){ - - if(!hasAuthorization) return false; - - $("#tabItemDetail a:eq(1)").css({"visibility": "visible"}); - $("#tabItemDetail a:eq(2)").css({"visibility": "visible"}); - - $(".glyphicon .glyphicon-pencil", "#tblUser").on("click", function(e){ - $("#txtUserName").hide(); - $("#lblUserName").show(); - $("#dlgUserTitle").text(i18n.getMessage("edit_members")); - }); - - $("#btnAddUser").on("click", function(){ - $("#operationType").val("add"); - $("#spnSearch").show(); - $("#txtUserName").prop("disabled", false) - $("#txtUserName").val(""); - $("#lstRole input[name=chooseRole]:radio").prop("checked", false); - $("#dlgUserTitle").text(i18n.getMessage("add_members")); - }); - - $("#btnSave").on("click", function(){ - - var username = $("#txtUserName").val(); - if($.trim(username).length == 0){ - $("#dlgModal").dialogModal({"title": i18n.getMessage("add_member_failed"), "content": i18n.getMessage("please_input_username")}); - return; - } - var projectId = $("#projectId").val(); - var operationType = $("#operationType").val(); - var userId = $("#editUserId").val(); - - var checkedRole = $("#lstRole input[name='chooseRole']:checked") - if(checkedRole.length == 0){ - $("#dlgModal").dialogModal({"title": i18n.getMessage("add_member_failed"), "content": i18n.getMessage("please_assign_a_role_to_user")}); - return; - } - - var checkedRoleItemList = []; - $.each(checkedRole, function(i, e){ - checkedRoleItemList.push(new Number($(this).val())); - }); - - var ajaxOpts = {}; - if(operationType == "add"){ - ajaxOpts.url = "/api/projects/" + projectId + "/members/"; - ajaxOpts.type = "post"; - ajaxOpts.data = {"roles" : checkedRoleItemList, "user_name": username}; - }else if(operationType == "edit"){ - ajaxOpts.url = "/api/projects/" + projectId + "/members/" + userId; - ajaxOpts.type = "put"; - ajaxOpts.data = {"roles" : checkedRoleItemList}; - } - - new AjaxUtil({ - url: ajaxOpts.url, - data: ajaxOpts.data, - type: ajaxOpts.type, - complete: function(jqXhr, status){ - if(jqXhr && jqXhr.status == 200){ - $("#btnCancel").trigger("click"); - listUser(null); - } - }, - errors: { - 404: i18n.getMessage("user_id_does_not_exist"), - 409: i18n.getMessage("user_id_exists"), - 403: i18n.getMessage("insufficient_privileges") - } - }).exec(); - }); - - var name_mapping = { - "projectAdmin": "Project Admin", - "developer": "Developer", - "guest": "Guest" - } - - function listUserByProjectCallback(userList){ - var loginedUserId = $("#userId").val(); - var loginedUserRoleId = $("#roleId").val(); - var ownerId = $("#ownerId").val(); - - $("#tblUser tbody tr").remove(); - for(var i = 0; i < userList.length; ){ - - var userId = userList[i].user_id; - var roleId = userList[i].role_id; - var username = userList[i].username; -// var roleNameList = []; - -// for(var j = i; j < userList.length; i++, j++){ -// if(userList[j].UserId == userId){ -// roleNameList.push(name_mapping[userList[j].Rolename]); -// }else{ -// break; -// } -// } - -// var row = '' + -// '' + username + '' + -// '' + roleNameList.join(",") + '' + -// ''; - var row = '' + - '' + username + '' + - '' + '--' + '' + - ''; - var isShowOperations = true; - if(loginedUserRoleId >= 3 /*role: developer guest*/){ - isShowOperations = false; - }else if(ownerId == userId){ - isShowOperations = false; - }else if (loginedUserId == userId){ - isShowOperations = false; - } - if(isShowOperations){ - row += ' ' + - ''; - } - - row += ''; - $("#tblUser tbody").append(row); - - } - } - - function searchAccessLogCallback(LogList){ - $("#tabOperationLog tbody tr").remove(); - $.each(LogList || [], function(i, e){ - $("#tabOperationLog tbody").append( - '' + - '' + e.Username + '' + - '' + e.repo_name + '' + - '' + e.repo_tag + '' + - '' + e.operation + '' + - '' + moment(new Date(e.op_time)).format("YYYY-MM-DD HH:mm:ss") + '' + - ''); - }); - } - - function getUserRoleCallback(userId){ - new AjaxUtil({ - url: "/api/projects/" + $("#projectId").val() + "/members/" + userId, - type: "get", - success: function(data, status, xhr){ - var user = data; - $("#operationType").val("edit"); - $("#editUserId").val(user.user_id); - $("#spnSearch").hide(); - $("#txtUserName").val(user.user_name); - $("#txtUserName").prop("disabled", true); - $("#btnSave").removeClass("disabled"); - $("#dlgUserTitle").text(i18n.getMessage("edit_members")); - $("#lstRole input[name=chooseRole]:radio").not('[value=' + user.role_id + ']').prop("checked", false) - $.each(user.roles, function(i, e){ - $("#lstRole input[name=chooseRole]:radio").filter('[value=' + e.role_id + ']').prop("checked", "checked"); - }); - } }).exec(); } - function listUser(username){ - $.when( - new AjaxUtil({ - url: "/api/projects/" + $("#projectId").val() + "/members?username=" + (username == null ? "" : username), - type: "get", - errors: { - 403: "" - }, - success: function(data, status, xhr){ - return data || []; - } - }).exec() - ).done(function(userList){ -// listUserByProjectCallback(userList || []); - $("#tblUser .glyphicon-pencil").on("click", function(e){ - var userId = $(this).attr("userid") - getUserRoleCallback(userId); - }); - $("#tblUser .glyphicon-trash").on("click", function(){ - var userId = $(this).attr("userid"); - new AjaxUtil({ - url: "/api/projects/" + $("#projectId").val() + "/members/" + userId, - type: "delete", - complete: function(jqXhr, status){ - if(jqXhr && jqXhr.status == 200){ - listUser(null); - } - } - }).exec(); - }); - }); - } - listUser(null); - listOperationLogs(); - - function listOperationLogs(){ - var projectId = $("#projectId").val(); - - $.when( - new AjaxUtil({ - url : "/api/projects/" + projectId + "/logs/filter", - data: {}, - type: "post", - success: function(data){ - return data || []; - } - }).exec() - ).done(function(operationLogs){ - searchAccessLogCallback(operationLogs); - }); - } - - $("#btnSearchUser").on("click", function(){ - var username = $("#txtSearchUser").val(); - if($.trim(username).length == 0){ - username = null; - } - listUser(username); + $("#btnSearchRepo").on("click", function(){ + listRepo($.trim($("#txtRepoName").val())); }); - function toUTCSeconds(date, hour, min, sec) { - var t = new Date(date); - t.setHours(hour); - t.setMinutes(min); - t.setSeconds(sec); - var utcTime = new Date(t.getUTCFullYear(), + $('#accordionRepo').on('show.bs.collapse', function (e) { + $('#accordionRepo .in').collapse('hide'); + var targetId = $(e.target).attr("targetId"); + var repoName = targetId.replace(/------/g, "/"); + new AjaxUtil({ + url: "/api/repositories/tags?repo_name=" + repoName, + type: "get", + success: function(data, status, xhr){ + $('#' + targetId +' table tbody tr').remove(); + var row = []; + for(var i in data){ + var tagName = data[i] + row.push('' + tagName + ''); + } + $('#' + targetId +' table tbody').append(row.join("")); + $('#' + targetId +' table tbody tr a').on("click", function(e){ + var imageId = $(this).attr("imageId"); + var repoName = $(this).attr("repoName"); + new AjaxUtil({ + url: "/api/repositories/manifests?repo_name=" + repoName + "&tag=" + imageId, + type: "get", + success: function(data, status, xhr){ + if(data){ + for(var i in data){ + if(data[i] == ""){ + data[i] = "N/A"; + } + } + data.Created = moment(new Date(data.Created)).format("YYYY-MM-DD HH:mm:ss"); + $("#dlgModal").dialogModal({"title": i18n.getMessage("image_details"), "content": data}); + } + } + }).exec(); + }); + } + }).exec(); + }); + } + + function needToLoginCallback(){ + + var hasAuthorization = false; + + $.when( + new AjaxUtil({ + url: "/api/projects/" + $("#projectId").val() + "/members/current", + type: "get", + success: function(data, status, xhr){ + if(xhr && xhr.status == 200 && data.roles != null && data.roles.length > 0){ + hasAuthorization = true; + } + } + }).exec()) + .done(function(){ + + if(!hasAuthorization) return false; + + $("#tabItemDetail a:eq(1)").css({"visibility": "visible"}); + $("#tabItemDetail a:eq(2)").css({"visibility": "visible"}); + + $(".glyphicon .glyphicon-pencil", "#tblUser").on("click", function(e){ + $("#txtUserName").hide(); + $("#lblUserName").show(); + $("#dlgUserTitle").text(i18n.getMessage("edit_members")); + }); + + $("#btnAddUser").on("click", function(){ + $("#operationType").val("add"); + $("#spnSearch").show(); + $("#txtUserName").prop("disabled", false) + $("#txtUserName").val(""); + $("#lstRole input[name=chooseRole]:radio").prop("checked", false); + $("#dlgUserTitle").text(i18n.getMessage("add_members")); + }); + + $("#btnSave").on("click", function(){ + + var username = $("#txtUserName").val(); + if($.trim(username).length == 0){ + $("#dlgModal").dialogModal({"title": i18n.getMessage("add_member_failed"), "content": i18n.getMessage("please_input_username")}); + return; + } + var projectId = $("#projectId").val(); + var operationType = $("#operationType").val(); + var userId = $("#editUserId").val(); + + var checkedRole = $("#lstRole input[name='chooseRole']:checked") + if(checkedRole.length == 0){ + $("#dlgModal").dialogModal({"title": i18n.getMessage("add_member_failed"), "content": i18n.getMessage("please_assign_a_role_to_user")}); + return; + } + + var checkedRoleItemList = []; + $.each(checkedRole, function(i, e){ + checkedRoleItemList.push(new Number($(this).val())); + }); + + var ajaxOpts = {}; + if(operationType == "add"){ + ajaxOpts.url = "/api/projects/" + projectId + "/members/"; + ajaxOpts.type = "post"; + ajaxOpts.data = {"roles" : checkedRoleItemList, "username": username}; + }else if(operationType == "edit"){ + ajaxOpts.url = "/api/projects/" + projectId + "/members/" + userId; + ajaxOpts.type = "put"; + ajaxOpts.data = {"roles" : checkedRoleItemList}; + } + + new AjaxUtil({ + url: ajaxOpts.url, + data: ajaxOpts.data, + type: ajaxOpts.type, + complete: function(jqXhr, status){ + if(jqXhr && jqXhr.status == 200){ + $("#btnCancel").trigger("click"); + listUser(null); + } + }, + errors: { + 404: i18n.getMessage("user_id_does_not_exist"), + 409: i18n.getMessage("user_id_exists"), + 403: i18n.getMessage("insufficient_privileges") + } + }).exec(); + }); + + var name_mapping = { + "projectAdmin": "Project Admin", + "developer": "Developer", + "guest": "Guest" + } + + function listUserByProjectCallback(userList){ + var loginedUserId = $("#userId").val(); + var loginedUserRoleId = $("#roleId").val(); + var ownerId = $("#ownerId").val(); + + $("#tblUser tbody tr").remove(); + for(var i = 0; i < userList.length; i++){ + + var userId = userList[i].user_id; + var roleId = userList[i].role_id; + var username = userList[i].username; + + var row = '' + + '' + username + '' + + '' + name_mapping[userList[i].role_name] + '' + + ''; + var isShowOperations = true; + if(loginedUserRoleId >= 3 /*role: developer guest*/){ + isShowOperations = false; + }else if(ownerId == userId){ + isShowOperations = false; + }else if (loginedUserId == userId){ + isShowOperations = false; + } + if(isShowOperations){ + row += ' ' + + ''; + } + + row += ''; + $("#tblUser tbody").append(row); + + } + } + + function searchAccessLogCallback(LogList){ + $("#tabOperationLog tbody tr").remove(); + $.each(LogList || [], function(i, e){ + $("#tabOperationLog tbody").append( + '' + + '' + e.username + '' + + '' + e.repo_name + '' + + '' + e.repo_tag + '' + + '' + e.operation + '' + + '' + moment(new Date(e.op_time)).format("YYYY-MM-DD HH:mm:ss") + '' + + ''); + }); + } + + function getUserRoleCallback(userId){ + new AjaxUtil({ + url: "/api/projects/" + $("#projectId").val() + "/members/" + userId, + type: "get", + success: function(data, status, xhr){ + var user = data; + $("#operationType").val("edit"); + $("#editUserId").val(user.user_id); + $("#spnSearch").hide(); + $("#txtUserName").val(user.username); + $("#txtUserName").prop("disabled", true); + $("#btnSave").removeClass("disabled"); + $("#dlgUserTitle").text(i18n.getMessage("edit_members")); + $("#lstRole input[name=chooseRole]:radio").not('[value=' + user.role_id + ']').prop("checked", false) + $.each(user.roles, function(i, e){ + $("#lstRole input[name=chooseRole]:radio").filter('[value=' + e.role_id + ']').prop("checked", "checked"); + }); + } + }).exec(); + } + function listUser(username){ + $.when( + new AjaxUtil({ + url: "/api/projects/" + $("#projectId").val() + "/members?username=" + (username == null ? "" : username), + type: "get", + errors: { + 403: "" + }, + success: function(data, status, xhr){ + return data || []; + } + }).exec() + ).done(function(userList){ + listUserByProjectCallback(userList || []); + $("#tblUser .glyphicon-pencil").on("click", function(e){ + var userId = $(this).attr("userid") + getUserRoleCallback(userId); + }); + $("#tblUser .glyphicon-trash").on("click", function(){ + var userId = $(this).attr("userid"); + new AjaxUtil({ + url: "/api/projects/" + $("#projectId").val() + "/members/" + userId, + type: "delete", + complete: function(jqXhr, status){ + if(jqXhr && jqXhr.status == 200){ + listUser(null); + } + } + }).exec(); + }); + }); + } + listUser(null); + listOperationLogs(); + + function listOperationLogs(){ + var projectId = $("#projectId").val(); + + $.when( + new AjaxUtil({ + url : "/api/projects/" + projectId + "/logs/filter", + data: {}, + type: "post", + success: function(data){ + return data || []; + } + }).exec() + ).done(function(operationLogs){ + searchAccessLogCallback(operationLogs); + }); + } + + $("#btnSearchUser").on("click", function(){ + var username = $("#txtSearchUser").val(); + if($.trim(username).length == 0){ + username = null; + } + listUser(username); + }); + + function toUTCSeconds(date, hour, min, sec) { + var t = new Date(date); + t.setHours(hour); + t.setMinutes(min); + t.setSeconds(sec); + var utcTime = new Date(t.getUTCFullYear(), t.getUTCMonth(), t.getUTCDate(), t.getUTCHours(), t.getUTCMinutes(), t.getUTCSeconds()); - return utcTime.getTime() / 1000; - } - - $("#btnFilterLog").on("click", function(){ - - var projectId = $("#projectId").val(); - var username = $("#txtSearchUserName").val(); - - var beginTimestamp = 0; - var endTimestamp = 0; - - if($("#begindatepicker").val() != ""){ - beginTimestamp = toUTCSeconds($("#begindatepicker").val(), 0, 0, 0); - } - if($("#enddatepicker").val() != ""){ - endTimestamp = toUTCSeconds($("#enddatepicker").val(), 23, 59, 59); - } - - new AjaxUtil({ - url: "/api/projects/" + projectId + "/logs/filter", - data:{"Username":username, "project_id" : Number(projectId), "keywords" : getKeyWords() , "begin_timestamp" : beginTimestamp, "end_timestamp" : endTimestamp}, - type: "post", - success: function(data, status, xhr){ - if(xhr && xhr.status == 200){ - searchAccessLogCallback(data); + return utcTime.getTime() / 1000; } - } - }).exec(); - }); - - $("#spnFilterOption input[name=chkAll]").on("click", function(){ - $("#spnFilterOption input[name=chkOperation]").prop("checked", $(this).prop("checked")); - }); - - $("#spnFilterOption input[name=chkOperation]").on("click", function(){ - if(!$(this).prop("checked")){ - $("#spnFilterOption input[name=chkAll]").prop("checked", false); - } - - var selectedAll = true; - - $("#spnFilterOption input[name=chkOperation]").each(function(i, e){ - if(!$(e).prop("checked")){ - selectedAll = false; - } - }); - - if(selectedAll){ - $("#spnFilterOption input[name=chkAll]").prop("checked", true); - } - }); - - function getKeyWords(){ - var keywords = ""; - var checkedItemList=$("#spnFilterOption input[name=chkOperation]:checked"); - var keywords = []; - $.each(checkedItemList, function(i, e){ - var itemValue = $(e).val(); - if(itemValue == "others" && $.trim($("#txtOthers").val()).length > 0){ - keywords.push($("#txtOthers").val()); - }else{ - keywords.push($(e).val()); - } - }); - return keywords.join("/"); - } - - $('#datetimepicker1').datetimepicker({ - locale: i18n.getLocale(), - ignoreReadonly: true, - format: 'L', - showClear: true - }); - $('#datetimepicker2').datetimepicker({ - locale: i18n.getLocale(), - ignoreReadonly: true, - format: 'L', - showClear: true - }); - }); - } - - $(document).on("keydown", function(e){ - if(e.keyCode == 13){ - e.preventDefault(); - if($("#tabItemDetail li:eq(0)").is(":focus") || $("#txtRepoName").is(":focus")){ - $("#btnSearchRepo").trigger("click"); - }else if($("#tabItemDetail li:eq(1)").is(":focus") || $("#txtSearchUser").is(":focus")){ - $("#btnSearchUser").trigger("click"); - }else if($("#tabItemDetail li:eq(2)").is(":focus") || $("#txtSearchUserName").is(":focus")){ - $("#btnFilterLog").trigger("click"); - }else if($("#txtUserName").is(":focus") || $("#lstRole :radio").is(":focus")){ - $("#btnSave").trigger("click"); - } + + $("#btnFilterLog").on("click", function(){ + + var projectId = $("#projectId").val(); + var username = $("#txtSearchUserName").val(); + + var beginTimestamp = 0; + var endTimestamp = 0; + + if($("#begindatepicker").val() != ""){ + beginTimestamp = toUTCSeconds($("#begindatepicker").val(), 0, 0, 0); + } + if($("#enddatepicker").val() != ""){ + endTimestamp = toUTCSeconds($("#enddatepicker").val(), 23, 59, 59); + } + + new AjaxUtil({ + url: "/api/projects/" + projectId + "/logs/filter", + data:{"username":username, "project_id" : Number(projectId), "keywords" : getKeyWords() , "begin_timestamp" : beginTimestamp, "end_timestamp" : endTimestamp}, + type: "post", + success: function(data, status, xhr){ + if(xhr && xhr.status == 200){ + searchAccessLogCallback(data); + } + } + }).exec(); + }); + + $("#spnFilterOption input[name=chkAll]").on("click", function(){ + $("#spnFilterOption input[name=chkOperation]").prop("checked", $(this).prop("checked")); + }); + + $("#spnFilterOption input[name=chkOperation]").on("click", function(){ + if(!$(this).prop("checked")){ + $("#spnFilterOption input[name=chkAll]").prop("checked", false); + } + + var selectedAll = true; + + $("#spnFilterOption input[name=chkOperation]").each(function(i, e){ + if(!$(e).prop("checked")){ + selectedAll = false; + } + }); + + if(selectedAll){ + $("#spnFilterOption input[name=chkAll]").prop("checked", true); + } + }); + + function getKeyWords(){ + var keywords = ""; + var checkedItemList=$("#spnFilterOption input[name=chkOperation]:checked"); + var keywords = []; + $.each(checkedItemList, function(i, e){ + var itemValue = $(e).val(); + if(itemValue == "others" && $.trim($("#txtOthers").val()).length > 0){ + keywords.push($("#txtOthers").val()); + }else{ + keywords.push($(e).val()); + } + }); + return keywords.join("/"); + } + + $('#datetimepicker1').datetimepicker({ + locale: i18n.getLocale(), + ignoreReadonly: true, + format: 'L', + showClear: true + }); + $('#datetimepicker2').datetimepicker({ + locale: i18n.getLocale(), + ignoreReadonly: true, + format: 'L', + showClear: true + }); + }); +} + +$(document).on("keydown", function(e){ + if(e.keyCode == 13){ + e.preventDefault(); + if($("#tabItemDetail li:eq(0)").is(":focus") || $("#txtRepoName").is(":focus")){ + $("#btnSearchRepo").trigger("click"); + }else if($("#tabItemDetail li:eq(1)").is(":focus") || $("#txtSearchUser").is(":focus")){ + $("#btnSearchUser").trigger("click"); + }else if($("#tabItemDetail li:eq(2)").is(":focus") || $("#txtSearchUserName").is(":focus")){ + $("#btnFilterLog").trigger("click"); + }else if($("#txtUserName").is(":focus") || $("#lstRole :radio").is(":focus")){ + $("#btnSave").trigger("click"); } - }); + } +}); }) diff --git a/static/resources/js/login.js b/static/resources/js/login.js index 9b0bfda2b..21c0b6cd2 100644 --- a/static/resources/js/login.js +++ b/static/resources/js/login.js @@ -24,7 +24,7 @@ jQuery(function(){ }, error: function(jqXhr){ if(jqXhr.status == 401) - return false; + return false; } }).exec(); diff --git a/static/resources/js/project.js b/static/resources/js/project.js index a59dfa85a..427aa39dd 100644 --- a/static/resources/js/project.js +++ b/static/resources/js/project.js @@ -13,7 +13,7 @@ limitations under the License. */ jQuery(function(){ - + new AjaxUtil({ url: "/api/users/current", type: "get", @@ -29,57 +29,57 @@ jQuery(function(){ function renderForAnyRole(){ $("#tabProject a:first").tab("show"); - + $(document).on("keydown", function(e){ if(e.keyCode == 13){ - e.preventDefault(); - if($("#tabProject li:eq(0)").is(":focus") || $("#txtSearchProject").is(":focus")){ - $("#btnSearch").trigger("click"); - }else if($("#tabProject li:eq(1)").is(":focus") || $("#txtSearchPublicProjects").is(":focus")){ - $("#btnSearchPublicProjects").trigger("click"); - }else if($("#tabProject li:eq(1)").is(":focus") || $("#txtSearchUsername").is(":focus")){ - $("#btnSearchUsername").trigger("click"); - }else if($("#dlgAddProject").is(":focus") || $("#projectName").is(":focus")){ - $("#btnSave").trigger("click"); - } + e.preventDefault(); + if($("#tabProject li:eq(0)").is(":focus") || $("#txtSearchProject").is(":focus")){ + $("#btnSearch").trigger("click"); + }else if($("#tabProject li:eq(1)").is(":focus") || $("#txtSearchPublicProjects").is(":focus")){ + $("#btnSearchPublicProjects").trigger("click"); + }else if($("#tabProject li:eq(1)").is(":focus") || $("#txtSearchUsername").is(":focus")){ + $("#btnSearchUsername").trigger("click"); + }else if($("#dlgAddProject").is(":focus") || $("#projectName").is(":focus")){ + $("#btnSave").trigger("click"); + } } }); - + function listProject(projectName, isPublic){ currentPublic = isPublic; $.when( new AjaxUtil({ - url: "/api/projects?is_public=" + isPublic + "&project_name=" + (projectName == null ? "" : projectName) + "×tamp=" + new Date().getTime(), - type: "get", - success: function(data, status, xhr){ - $("#tblProject tbody tr").remove(); - $.each(data || [], function(i, e){ - var row = '' + - '' + e.name + '' + - '' + moment(new Date(e.creation_time)).format("YYYY-MM-DD HH:mm:ss") + ''; - if(e.Public == 1 && e.Togglable){ - row += '' - } else if (e.Public == 1) { - row += ''; - } else if (e.Public == 0 && e.Togglable) { - row += ''; - } else if (e.Public == 0) { - row += ''; - row += ''; - } - $("#tblProject tbody").append(row); - }); - } - }).exec()) + url: "/api/projects?is_public=" + isPublic + "&project_name=" + (projectName == null ? "" : projectName) + "×tamp=" + new Date().getTime(), + type: "get", + success: function(data, status, xhr){ + $("#tblProject tbody tr").remove(); + $.each(data || [], function(i, e){ + var row = '' + + '' + e.name + '' + + '' + moment(new Date(e.creation_time)).format("YYYY-MM-DD HH:mm:ss") + ''; + if(e.public == 1 && e.Togglable){ + row += '' + } else if (e.public == 1) { + row += ''; + } else if (e.public == 0 && e.Togglable) { + row += ''; + } else if (e.public == 0) { + row += ''; + row += ''; + } + $("#tblProject tbody").append(row); + }); + } + }).exec()) .done(function() { - $("#tblProject tbody tr :button").on("click", function(){ - var projectId = $(this).attr("projectid"); - var self = this; - new AjaxUtil({ - url: "/api/projects/" + projectId, - data: {"public": ($(self).hasClass("btn-success") ? false : true)}, - type: "put", - complete: function(jqXhr, status) { + $("#tblProject tbody tr :button").on("click", function(){ + var projectId = $(this).attr("projectid"); + var self = this; + new AjaxUtil({ + url: "/api/projects/" + projectId, + data: {"public": ($(self).hasClass("btn-success") ? false : true)}, + type: "put", + complete: function(jqXhr, status) { if($(self).hasClass("btn-success")){ $(self).removeClass("btn-success").addClass("btn-danger"); $(self).html(i18n.getMessage("button_off")); @@ -88,9 +88,9 @@ jQuery(function(){ $(self).html(i18n.getMessage("button_on")); } } - }).exec(); - }); - }); + }).exec(); + }); + }); } listProject(null, 0); var currentPublic = 0; @@ -119,7 +119,7 @@ jQuery(function(){ $("#projectName").val(""); $("#projectName").parent().addClass("has-feedback"); $("#projectName").siblings("span").removeClass("glyphicon-warning-sign").removeClass("glyphicon-ok"); - $("#isPublic").prop('checked', false); + $("#isPublic").prop('checked', false); }); $("#btnSave").on("click", function(){ @@ -161,9 +161,9 @@ jQuery(function(){ $("#tblUser tbody tr").remove(); $.each(data || [], function(i, e){ var row = '' + - '' + e.username + '' + - '' + e.email + ''; - if(e.HasAdminRole == 1){ + '' + e.username + '' + + '' + e.email + ''; + if(e.has_admin_role == 1){ row += ''; } else { row += ''; @@ -174,39 +174,39 @@ jQuery(function(){ }); } }).exec() - ).done(function(){ - $("#tblUser tbody tr :button").on("click",function(){ - var userId = $(this).attr("userid"); - var self = this; - new AjaxUtil({ - url: "/api/users/" + userId, - type: "put", - complete: function(jqXhr, status){ - if(jqXhr && jqXhr.status == 200){ - if($(self).hasClass("btn-success")){ - $(self).removeClass("btn-success").addClass("btn-danger"); - $(self).html(i18n.getMessage("button_off")); - }else{ - $(self).removeClass("btn-danger").addClass("btn-success"); - $(self).html(i18n.getMessage("button_on")); - } - } - } - }).exec(); - }); - $("#tblUser tbody tr").on("mouseover", function(){ - $(".tdDeleteUser", this).css({"visibility":"visible"}); - }).on("mouseout", function(){ - $(".tdDeleteUser", this).css({"visibility":"hidden"}); - }); - $("#tblUser tbody tr .tdDeleteUser").on("click", function(){ - var userId = $(this).attr("userid"); - $("#dlgModal") + ).done(function(){ + $("#tblUser tbody tr :button").on("click",function(){ + var userId = $(this).attr("userid"); + var self = this; + new AjaxUtil({ + url: "/api/users/" + userId, + type: "put", + complete: function(jqXhr, status){ + if(jqXhr && jqXhr.status == 200){ + if($(self).hasClass("btn-success")){ + $(self).removeClass("btn-success").addClass("btn-danger"); + $(self).html(i18n.getMessage("button_off")); + }else{ + $(self).removeClass("btn-danger").addClass("btn-success"); + $(self).html(i18n.getMessage("button_on")); + } + } + } + }).exec(); + }); + $("#tblUser tbody tr").on("mouseover", function(e){ + $(".tdDeleteUser", this).css({"visibility":"visible"}); + }).on("mouseout", function(e){ + $(".tdDeleteUser", this).css({"visibility":"hidden"}); + }); + $("#tblUser tbody tr .tdDeleteUser").on("click", function(e){ + var userId = $(this).attr("userid"); + $("#dlgModal") .dialogModal({ "title": i18n.getMessage("delete_user"), "content": i18n.getMessage("are_you_sure_to_delete_user") + $(this).attr("username") + " ?", "enableCancel": true, - "callback": function(){ + "callback": function(){ new AjaxUtil({ url: "/api/users/" + userId, type: "delete", @@ -218,17 +218,18 @@ jQuery(function(){ error: function(jqXhr){} }).exec(); } + }); + }); }); + } + listUserAdminRole(null); + $("#btnSearchUsername").on("click", function(){ + var username = $("#txtSearchUsername").val(); + if($.trim(username).length == 0){ + username = null; + } + listUserAdminRole(username); }); } - listUserAdminRole(null); - $("#btnSearchUsername").on("click", function(){ - var username = $("#txtSearchUsername").val(); - if($.trim(username).length == 0){ - username = null; - } - listUserAdminRole(username); - }); - } -}) + }) diff --git a/static/resources/js/register.js b/static/resources/js/register.js index 3fa2882b4..397087c01 100644 --- a/static/resources/js/register.js +++ b/static/resources/js/register.js @@ -30,14 +30,14 @@ jQuery(function(){ $("#btnPageSignUp").on("click", function(){ validateOptions.Validate(function() { - var username = $.trim($("#Username").val()); - var email = $.trim($("#Email").val()); - var password = $.trim($("#Password").val()); - var confirmedPassword = $.trim($("#ConfirmedPassword").val()); - var realname = $.trim($("#Realname").val()); - var comment = $.trim($("#Comment").val()); - var isAdmin = $("#isAdmin").val(); - + var username = $.trim($("#Username").val()); + var email = $.trim($("#Email").val()); + var password = $.trim($("#Password").val()); + var confirmedPassword = $.trim($("#ConfirmedPassword").val()); + var realname = $.trim($("#Realname").val()); + var comment = $.trim($("#Comment").val()); + var isAdmin = $("#isAdmin").val(); + new AjaxUtil({ url : "/api/users", data: {"username": username, "password": password, "realname": realname, "comment": comment, "email": email}, @@ -47,29 +47,29 @@ jQuery(function(){ }, error:function(jqxhr, status, error){ $("#dlgModal") - .dialogModal({ - "title": i18n.getMessage("title_sign_up"), - "content": i18n.getMessage("internal_error"), - "callback": function(){ - return; - } - }); + .dialogModal({ + "title": i18n.getMessage("title_sign_up"), + "content": i18n.getMessage("internal_error"), + "callback": function(){ + return; + } + }); }, complete: function(xhr, status){ $("#btnPageSignUp").prop("disabled", false); if(xhr && xhr.status == 201){ $("#dlgModal") - .dialogModal({ - "title": isAdmin == "true" ? i18n.getMessage("title_add_user") : i18n.getMessage("title_sign_up"), - "content": isAdmin == "true" ? i18n.getMessage("added_user_successfully") : i18n.getMessage("registered_successfully"), - "callback": function(){ - if(isAdmin == "true") { - document.location = "/registry/project"; - }else{ - document.location = "/signIn"; - } + .dialogModal({ + "title": isAdmin == "true" ? i18n.getMessage("title_add_user") : i18n.getMessage("title_sign_up"), + "content": isAdmin == "true" ? i18n.getMessage("added_user_successfully") : i18n.getMessage("registered_successfully"), + "callback": function(){ + if(isAdmin == "true") { + document.location = "/registry/project"; + }else{ + document.location = "/signIn"; } - }); + } + }); } } }).exec(); diff --git a/static/resources/js/reset-password.js b/static/resources/js/reset-password.js index 0a3efc566..a6c504f48 100644 --- a/static/resources/js/reset-password.js +++ b/static/resources/js/reset-password.js @@ -17,11 +17,11 @@ jQuery(function(){ $("#Password,#ConfirmedPassword").on("blur", validateCallback); validateOptions.Items = ["#Password", "#ConfirmedPassword"]; - function bindEnterKey(){ + function bindEnterKey(){ $(document).on("keydown", function(e){ if(e.keyCode == 13){ - e.preventDefault(); - $("#btnSubmit").trigger("click"); + e.preventDefault(); + $("#btnSubmit").trigger("click"); } }); } @@ -30,7 +30,6 @@ jQuery(function(){ } bindEnterKey(); - var spinner = new Spinner({scale:1}).spin(); $("#btnSubmit").on("click", function(){ @@ -42,20 +41,20 @@ jQuery(function(){ "type": "post", "data": {"reset_uuid": resetUuid, "password": password}, "beforeSend": function(e){ - unbindEnterKey(); - $("h1").append(spinner.el); - $("#btnSubmit").prop("disabled", true); + unbindEnterKey(); + $("h1").append(spinner.el); + $("#btnSubmit").prop("disabled", true); }, "success": function(data, status, xhr){ if(xhr && xhr.status == 200){ $("#dlgModal") - .dialogModal({ - "title": i18n.getMessage("title_reset_password"), - "content": i18n.getMessage("reset_password_successfully"), - "callback": function(){ - document.location="/signIn"; - } - }); + .dialogModal({ + "title": i18n.getMessage("title_reset_password"), + "content": i18n.getMessage("reset_password_successfully"), + "callback": function(){ + document.location="/signIn"; + } + }); } }, @@ -66,14 +65,14 @@ jQuery(function(){ "error": function(jqXhr, status, error){ if(jqXhr){ $("#dlgModal") - .dialogModal({ - "title": i18n.getMessage("title_reset_password"), - "content": i18n.getMessage(jqXhr.responseText), - "callback": function(){ - bindEnterKey(); - return; - } - }); + .dialogModal({ + "title": i18n.getMessage("title_reset_password"), + "content": i18n.getMessage(jqXhr.responseText), + "callback": function(){ + bindEnterKey(); + return; + } + }); } } }); diff --git a/static/resources/js/search.js b/static/resources/js/search.js index 5284866f9..e0158baa8 100644 --- a/static/resources/js/search.js +++ b/static/resources/js/search.js @@ -60,12 +60,12 @@ jQuery(function(){ $.each(data, function(i, e){ var project, description, repoName; switch(discriminator){ - case "project": + case "project": project = new Project(e.id, e.name, e.public); description = project.name; repoName = ""; break; - case "repository": + case "repository": project = new Project(e.project_id, e.project_name, e.project_public); description = e.repository_name; repoName = e.repository_name.substring(e.repository_name.lastIndexOf("/") + 1); diff --git a/static/resources/js/sign-in.js b/static/resources/js/sign-in.js index 1602a6b04..2aaa24c5f 100644 --- a/static/resources/js/sign-in.js +++ b/static/resources/js/sign-in.js @@ -56,7 +56,7 @@ jQuery(function(){ success: function(jqXhr, status){ var lastUri = location.search; if(lastUri != "" && lastUri.indexOf("=") > 0){ - document.location = decodeURIComponent(lastUri.split("=")[1]); + document.location = decodeURIComponent(lastUri.split("=")[1]); }else{ document.location = "/registry/project"; } @@ -69,10 +69,10 @@ jQuery(function(){ i18nKey = "check_your_username_or_password" } $("#dlgModal") - .dialogModal({ - "title": i18n.getMessage("title_login_failed"), - "content": i18n.getMessage(i18nKey) - }); + .dialogModal({ + "title": i18n.getMessage("title_login_failed"), + "content": i18n.getMessage(i18nKey) + }); } }); }); diff --git a/static/resources/js/validate-options.js b/static/resources/js/validate-options.js index 34f28ead9..492366ca7 100644 --- a/static/resources/js/validate-options.js +++ b/static/resources/js/validate-options.js @@ -26,18 +26,18 @@ var validateOptions = { "Username" :{ "Required": { "value" : true, "errMsg" : i18n.getMessage("username_is_required")}, "CheckExist": { "value" : function(value){ - var result = true; - $.ajax({ - url: "/userExists", - data: {"target": "username", "value" : value}, + var result = true; + $.ajax({ + url: "/userExists", + data: {"target": "username", "value" : value}, dataType: "json", - type: "post", - async: false, - success: function(data){ - result = data; - } - }); - return result; + type: "post", + async: false, + success: function(data){ + result = data; + } + }); + return result; }, "errMsg" : i18n.getMessage("username_has_been_taken")}, "MaxLength": {"value" : 20, "errMsg" : i18n.getMessage("username_is_too_long")}, "IllegalChar": {"value": [",","~","#", "$", "%"] , "errMsg": i18n.getMessage("username_contains_illegal_chars")} @@ -45,40 +45,40 @@ var validateOptions = { "Email" :{ "Required": { "value" : true, "errMsg" : i18n.getMessage("email_is_required")}, "RegExp": {"value": /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, - "errMsg": i18n.getMessage("email_contains_illegal_chars")}, + "errMsg": i18n.getMessage("email_contains_illegal_chars")}, "CheckExist": { "value" : function(value){ - var result = true; - $.ajax({ - url: "/userExists", - data: {"target": "email", "value": value}, - dataType: "json", - type: "post", - async: false, - success: function(data){ - result = data; - } - }); - return result; - }, "errMsg" : i18n.getMessage("email_has_been_taken")} + var result = true; + $.ajax({ + url: "/userExists", + data: {"target": "email", "value": value}, + dataType: "json", + type: "post", + async: false, + success: function(data){ + result = data; + } + }); + return result; + }, "errMsg" : i18n.getMessage("email_has_been_taken")} }, "EmailF" :{ "Required": { "value" : true, "errMsg" : i18n.getMessage("email_is_required")}, "RegExp": {"value": /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, - "errMsg": i18n.getMessage("email_content_illegal")}, + "errMsg": i18n.getMessage("email_content_illegal")}, "CheckIfNotExist": { "value" : function(value){ - var result = true; - $.ajax({ - url: "/userExists", - data: {"target": "email", "value": value}, - dataType: "json", - type: "post", - async: false, - success: function(data){ - result = data; - } - }); - return result; - }, "errMsg" : i18n.getMessage("email_does_not_exist")} + var result = true; + $.ajax({ + url: "/userExists", + data: {"target": "email", "value": value}, + dataType: "json", + type: "post", + async: false, + success: function(data){ + result = data; + } + }); + return result; + }, "errMsg" : i18n.getMessage("email_does_not_exist")} }, "Realname" :{ "Required": { "value" : true, "errMsg" : i18n.getMessage("realname_is_required")}, @@ -119,7 +119,7 @@ function validateCallback(target){ var currentId = $(target).attr("id"); var validateItem = validateOptions[currentId]; - var errMsg = ""; + var errMsg = ""; for(var checkTitle in validateItem){ diff --git a/views/change-password.tpl b/views/change-password.tpl index cdcbdb9a5..9dfa50494 100644 --- a/views/change-password.tpl +++ b/views/change-password.tpl @@ -16,32 +16,32 @@
- -
- - - -
-
- - - -
{{i18n .Lang "password_description"}}
-
-
- - - -
{{i18n .Lang "password_description"}}
-
-
-
- -
-
+ +
+ + + +
+
+ + + +
{{i18n .Lang "password_description"}}
+
+
+ + + +
{{i18n .Lang "password_description"}}
+
+
+
+ +
+
diff --git a/views/forgot-password.tpl b/views/forgot-password.tpl index 64f8656b7..0a2738479 100644 --- a/views/forgot-password.tpl +++ b/views/forgot-password.tpl @@ -19,19 +19,19 @@

{{i18n .Lang "title_forgot_password"}}

-
- -
- - - -
{{i18n .Lang "forgot_password_description"}}
-
-
-
- -
-
+
+ +
+ + + +
{{i18n .Lang "forgot_password_description"}}
+
+
+
+ +
+
diff --git a/views/index.tpl b/views/index.tpl index e92eaa5cb..dec019fb1 100644 --- a/views/index.tpl +++ b/views/index.tpl @@ -13,25 +13,25 @@ limitations under the License. --> -
-
- Harbor's Logo -

{{i18n .Lang "index_title"}}

-
-
+
+
+ Harbor's Logo +

{{i18n .Lang "index_title"}}

+
+
-
- -
-
-

{{i18n .Lang "index_desc"}}

-

{{i18n .Lang "index_desc_0"}}

-

{{i18n .Lang "index_desc_1"}}

-

{{i18n .Lang "index_desc_2"}}

-

{{i18n .Lang "index_desc_3"}}

-

{{i18n .Lang "index_desc_4"}}

-

{{i18n .Lang "index_desc_5"}}

-
-
-
+
+ +
+
+

{{i18n .Lang "index_desc"}}

+

{{i18n .Lang "index_desc_0"}}

+

{{i18n .Lang "index_desc_1"}}

+

{{i18n .Lang "index_desc_2"}}

+

{{i18n .Lang "index_desc_3"}}

+

{{i18n .Lang "index_desc_4"}}

+

{{i18n .Lang "index_desc_5"}}

+
+
+
\ No newline at end of file diff --git a/views/item-detail.tpl b/views/item-detail.tpl index e9cdb2753..cce2c2aa3 100644 --- a/views/item-detail.tpl +++ b/views/item-detail.tpl @@ -18,7 +18,7 @@
  • {{.ProjectName}}
  • @@ -29,152 +29,150 @@
  • {{i18n .Lang "logs"}}
  • -
    - - - - - - - - - -
    -
    -
    -
    - -
    -
    {{i18n .Lang "repo_name"}}:
    - - - - -
    -
    -
    -

    -

    - -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    {{i18n .Lang "username"}}:
    - +
    + + + + + + + + + +
    +
    + +
    + +
    +
    {{i18n .Lang "repo_name"}}:
    + - +
    + +

    +

    + +
    +
    - - -

    -

    - - - - - - - - - - -
    {{i18n .Lang "username"}}{{i18n .Lang "role"}}{{i18n .Lang "operation"}}
    -
    -
    -
    -
    - -
    -
    {{i18n .Lang "username"}}:
    - - - - -
    -
    -
    -
    - -
    -
    - -

    -
    - +
    +
    - +
    + +
    +
    {{i18n .Lang "username"}}:
    + + + + +
    +
    +
    + + +

    +

    + + + + + + + + + + +
    {{i18n .Lang "username"}}{{i18n .Lang "role"}}{{i18n .Lang "operation"}}
    +
    +
    +
    +
    +
    +
    -
    {{i18n .Lang "operation"}}:
    - - {{i18n .Lang "all"}} - Create - Pull - Push - Delete - {{i18n .Lang "others"}}: - +
    {{i18n .Lang "username"}}:
    + + +
    -

    - -
    -
    {{i18n .Lang "start_date"}}:
    -
    - - - - -
    +
    +
    -
    -
    -
    -
    {{i18n .Lang "end_date"}}:
    -
    - - - - -
    -
    - -
    - -
    -
    - - - - - - - - - - - - -
    {{i18n .Lang "username"}}{{i18n .Lang "repo_name"}}{{i18n .Lang "repo_tag"}}{{i18n .Lang "operation"}}{{i18n .Lang "timestamp"}}
    -
    -
    +

    +

    +
    +
    + +
    +
    {{i18n .Lang "operation"}}:
    + + {{i18n .Lang "all"}} + Create + Pull + Push + Delete + {{i18n .Lang "others"}}: + + +
    +
    +

    +
    + +
    +
    {{i18n .Lang "start_date"}}:
    +
    + + + + +
    +
    +
    +
    +
    +
    {{i18n .Lang "end_date"}}:
    +
    + + + + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + +
    {{i18n .Lang "username"}}{{i18n .Lang "repo_name"}}{{i18n .Lang "repo_tag"}}{{i18n .Lang "operation"}}{{i18n .Lang "timestamp"}}
    +
    + +
    +
    -
    + {{ if .Username }} +
    + - - -
    - {{ else if eq .AuthMode "db_auth" }} -
    -   - {{ if eq .SelfRegistration true }} -   +
    + {{ else if eq .AuthMode "db_auth" }} +
    +   + {{ if eq .SelfRegistration true }} +   + {{ end }} +
    + {{ else }} +
    +   +
    {{ end }} -
    - {{ else }} -
    -   -
    - {{ end }} - -
    - + +
    + + diff --git a/views/segment/modal-dialog.tpl b/views/segment/modal-dialog.tpl index 95a220b69..7f3da1215 100644 --- a/views/segment/modal-dialog.tpl +++ b/views/segment/modal-dialog.tpl @@ -13,26 +13,26 @@ limitations under the License. --> \ No newline at end of file diff --git a/views/sign-in.tpl b/views/sign-in.tpl index 8cb173d27..86723ad01 100644 --- a/views/sign-in.tpl +++ b/views/sign-in.tpl @@ -13,28 +13,28 @@ limitations under the License. -->
    -