Updates for new UI latest changes.

This commit is contained in:
kunw 2017-03-21 12:11:34 +08:00
parent cef202cb54
commit 084d6a2b91
18 changed files with 88 additions and 106020 deletions

11
.gitignore vendored
View File

@ -12,13 +12,14 @@ jobservice/test
src/ui/static/dist/
src/clarity-seed/coverage/
src/clarity-seed/dist/
src/clarity-seed/html-report/
src/clarity-seed/node_modules/
src/clarity-seed/typings/
src/ui_ng/coverage/
src/ui_ng/dist/
src/ui_ng/html-report/
src/ui_ng/node_modules/
src/ui_ng/typings/
**/*npm-debug.log.*
**/*yarn-error.log.*
.idea/
.DS_Store

View File

@ -0,0 +1 @@
{"signed":{"_type":"Snapshot","expires":"2020-03-14T11:40:40.159699242Z","meta":{"root":{"hashes":{"sha256":"m/o/32uww8VW3apHT9Xh+ib0KRseWOZlaWDw/tWXflI=","sha512":"QxS0hASJWIbZOugekW8e8k6Mo8wO5kqW0gHjTYdQ6Yildef+8fvaAJVv4B+y/pR1pz2wEKoaWN1EH+r9nzNVCA=="},"length":2429},"targets":{"hashes":{"sha256":"cEUxniqitBLAAopevwsIRuCPB/sL1t/Rgc1LvnKDj9c=","sha512":"ejO/EajI5U4/vbrkQ5O0yjOc91RB3dQOoNHMnc7JeLY4rEk3an2MU0II/LUYaRTKLgzFf//h7f1TDpKEKcxhVQ=="},"length":432}},"version":1},"signatures":[{"keyid":"bd2c62bff4fa172fb40605fb2d8658d2b9c09e655b8ebb38f30550f5bd717eea","method":"ecdsa","sig":"MbWydcENSegBhNio1M6xDW6Sq9hlxMtKP8jVN/N0zymUqOaPq4m3FzgEYls1NbuQ0Gj11K7NtdD5al74qWITLQ=="}]}

View File

@ -0,0 +1 @@
{"signed":{"_type":"Targets","delegations":{"keys":{},"roles":[]},"expires":"2020-03-14T19:40:40.13723466+08:00","targets":{"1.0":{"hashes":{"sha256":"E1lggRW5RZnlZBY4usWu8d36p5u5YFfr9B68jTOs+Kc="},"length":527}},"version":2},"signatures":[{"keyid":"2e27b6898d94d3e134f1b223f8342a7f4ea18e95e51271b6d64eb7319a08b855","method":"ecdsa","sig":"SETP7J/FBtIL5cZVNg1ERjv7n1GD2WTBGqHe8wvHymAnKKicMYXtaRAfPWerKrNwG9Yl/1sjJV/Q2lH1SFkEAw=="}]}

View File

@ -65,15 +65,7 @@ func TestMain(t *testing.T) {
w := httptest.NewRecorder()
beego.BeeApp.Handlers.ServeHTTP(w, r)
assert.Equal(int(200), w.Code, "'/' httpStatusCode should be 200")
<<<<<<< HEAD
<<<<<<< HEAD
assert.Equal(true, strings.Contains(fmt.Sprintf("%s", w.Body), "<title>page_title_index</title>"), "http respond should have '<title>page_title_index</title>'")
=======
assert.Equal(true, strings.Contains(fmt.Sprintf("%s", w.Body), "<title>Harbor</title>"), "http respond should have '<title>Harbor</title>'")
>>>>>>> upstream/dev
=======
assert.Equal(true, strings.Contains(fmt.Sprintf("%s", w.Body), "<title>Harbor</title>"), "http respond should have '<title>Harbor</title>'")
>>>>>>> upstream/dev
r, _ = http.NewRequest("POST", "/login", nil)
w = httptest.NewRecorder()

View File

@ -20,23 +20,27 @@
"SAVE": "SAVE",
"TEST_MAIL": "TEST MAIL SERVER",
"CLOSE": "CLOSE",
"TEST_LDAP": "TEST LDAP SERVER"
"TEST_LDAP": "TEST LDAP SERVER",
"MORE_INFO": "More info...",
"YES": "YES"
},
"TOOLTIP": {
"EMAIL": "Email should be a valid email address like name@example.com",
"USER_NAME": "Can not contain \"~#$% and max length should be less than 20",
"FULL_NAME": "Max length should be less than 20",
"COMMENT": "Length of comment should be less than 20",
"CURRENT_PWD": "Current password is Required",
"PASSWORD": "Password should be at least 8 characters with 1 uppercase, 1 lower case and 1 number",
"CONFIRM_PWD": "Password input here should be same with above password",
"USER_NAME": "Can not contain \"~#$% and maxinum length should be less than 20 characters",
"FULL_NAME": "Max length should be less than 20 characters",
"COMMENT": "Length of comment should be less than 20 characters",
"CURRENT_PWD": "Current password is required",
"PASSWORD": "Password should be at least 8 characters with 1 uppercase, 1 lowercase and 1 number",
"CONFIRM_PWD": "Password should be same as the password above",
"SIGN_IN_USERNAME": "Username is required",
"SIGN_IN_PWD": "Password is required",
"SIGN_UP_MAIL": "Email is only used for resetting your password",
"SIGN_UP_REAL_NAME": "First name and last name",
"ITEM_REQUIRED": "Field is required",
"NUMBER_REQUIRED": "Filed is required and should be numbers",
"PORT_REQUIRED": "Filed is required and should be valid port number"
"NUMBER_REQUIRED": "Field is required and should be numbers",
"PORT_REQUIRED": "Field is required and should be valid port number",
"EMAIL_EXISTING": "Email address is already existing",
"USER_EXISTING": "Username is already used"
},
"PLACEHOLDER": {
"CURRENT_PWD": "Enter current password",
@ -55,14 +59,14 @@
"FULL_NAME": "Full name",
"COMMENT": "Comments",
"PASSWORD": "Password",
"SAVE_SUCCESS": "Save user profile successfully"
"SAVE_SUCCESS": "User profile saved successfully"
},
"CHANGE_PWD": {
"TITLE": "Change Password",
"CURRENT_PWD": "Current Password",
"NEW_PWD": "New Password",
"CONFIRM_PWD": "Confirm Password",
"SAVE_SUCCESS": "Change user password successfully"
"SAVE_SUCCESS": "User password changed successfully"
},
"ACCOUNT_SETTINGS": {
"PROFILE": "User Profile",
@ -97,15 +101,15 @@
"IS_ADMIN": "Yes",
"IS_NOT_ADMIN": "No",
"ADD_USER_TITLE": "Add User",
"SAVE_SUCCESS": "Add new user successfully",
"SAVE_SUCCESS": "New user added successfully",
"DELETION_TITLE": "Confirm user deletion",
"DELETION_SUMMARY": "Do you want to delete user {{param}}?",
"DELETE_SUCCESS": "Delete user successfully"
"DELETE_SUCCESS": "User deleted successfully"
},
"PROJECT": {
"PROJECTS": "Projects",
"NAME": "Project Name",
"PUBLIC_OR_PRIVATE": "Public/Private",
"PUBLIC_OR_PRIVATE": "Public",
"REPO_COUNT": "Repositories Count",
"CREATION_TIME": "Creation Time",
"DESCRIPTION": "Description",
@ -116,16 +120,18 @@
"DELETE": "Delete",
"MY_PROJECTS": "My Projects",
"PUBLIC_PROJECTS": "Public Projects",
"PROJECT": "Project",
"NEW_PROJECT": "New Project",
"NAME_IS_REQUIRED": "Project name is required.",
"NAME_MINIMUM_LENGTH": "Project name is too short, it should be greater than 2 characters.",
"NAME_ALREADY_EXISTS": "Project name already exists.",
"NAME_IS_ILLEGAL": "Project name is illegal.",
"UNKNOWN_ERROR": "Unknown error occurred while creating project.",
"NAME_IS_ILLEGAL": "Project name is invalid.",
"UNKNOWN_ERROR": "An unknown error occurred while creating the project.",
"ITEMS": "item(s)",
"DELETION_TITLE": "Confirm project deletion",
"DELETION_SUMMARY": "Do you want to delete project {{param}}?",
"FILTER_PLACEHOLDER": "Filter Projects"
"FILTER_PLACEHOLDER": "Filter Projects",
"REPLICATION_RULE": "Replication Rule"
},
"PROJECT_DETAIL": {
"REPOSITORIES": "Repositories",
@ -136,6 +142,7 @@
},
"MEMBER": {
"NEW_MEMBER": "New Member",
"MEMBER": "Member",
"NAME": "Name",
"ROLE": "Role",
"SYS_ADMIN": "System Admin",
@ -157,6 +164,7 @@
"REPOSITORY_NAME": "Repository Name",
"TAGS": "Tags",
"OPERATION": "Operation",
"OPERATIONS": "Operations",
"TIMESTAMP": "Timestamp",
"ALL_OPERATIONS": "All Operations",
"PULL": "Pull",
@ -170,7 +178,7 @@
"FILTER_PLACEHOLDER": "Filter Logs"
},
"REPLICATION": {
"REPLICATION_RULE": "Rules",
"REPLICATION_RULE": "Replication Rule",
"NEW_REPLICATION_RULE": "New Replication Rule",
"ENDPOINTS": "Endpoints",
"FILTER_POLICIES_PLACEHOLDER": "Filter Policies",
@ -180,8 +188,8 @@
"FILTER_TARGETS_PLACEHOLDER": "Filter Targets",
"DELETION_TITLE_TARGET": "Confirm Target Deletion",
"DELETION_SUMMARY_TARGET": "Do you want to delete target {{param}}?",
"ADD_POLICY": "Add Policy",
"EDIT_POLICY": "Edit Policy",
"ADD_POLICY": "New Replication Rule",
"EDIT_POLICY": "Edit Replication Rule",
"DELETE_POLICY": "Delete Policy",
"TEST_CONNECTION": "Test Connection",
"TESTING_CONNECTION": "Testing Connection...",
@ -225,6 +233,7 @@
},
"DESTINATION": {
"NEW_ENDPOINT": "New Endpoint",
"ENDPOINT": "Endpoint",
"NAME": "Destination Name",
"NAME_IS_REQUIRED": "Destination name is required.",
"URL": "Endpoint URL",
@ -259,10 +268,10 @@
"DELETION_TITLE_TAG": "Confirm Tag Deletion",
"DELETION_SUMMARY_TAG": "Do you want to delete tag {{param}}?",
"DELETION_TITLE_TAG_DENIED": "Signed Tag can't be deleted",
"DELETION_SUMMARY_TAG_DENIED": "The tag must be removed from Notary before they can be deleted.",
"DELETION_SUMMARY_TAG_DENIED": "The tag must be removed from the Notary before it can be deleted.",
"FILTER_FOR_REPOSITORIES": "Filter for repositories",
"TAG": "Tag",
"VERIFIED": "Verified",
"SIGNED": "Signed",
"AUTHOR": "Author",
"CREATED": "Creation Time",
"DOCKER_VERSION": "Docker Version",
@ -270,10 +279,11 @@
"OS": "OS",
"SHOW_DETAILS": "Show Details",
"REPOSITORIES": "Repositories",
"ITEMS": "item(s)"
"ITEMS": "item(s)",
"POP_REPOS": "Popular Repositories"
},
"ALERT": {
"FORM_CHANGE_CONFIRMATION": "Form value changed, confirm to cancel?"
"FORM_CHANGE_CONFIRMATION": "Some changes are not saved yet, do you really want to cancel?"
},
"RESET_PWD": {
"TITLE": "Reset Password",
@ -281,7 +291,7 @@
"EMAIL": "Email",
"SUCCESS": "Mail of resetting password is successfully send to your mail box",
"CAPTION2": "Enter your new password",
"RESET_OK": "Password is successfully reset, click OK button to login with new password"
"RESET_OK": "Password has been successfully reset. Click OK to login with new password"
},
"RECENT_LOG": {
"SUB_TITLE": "Show recent",
@ -294,8 +304,8 @@
"EMAIL": "Email",
"SYSTEM": "System Settings",
"CONFIRM_TITLE": "Confirm to cancel",
"CONFIRM_SUMMARY": "Some changes happend, confirm to cancel?",
"SAVE_SUCCESS": "Configurations are successfully saved",
"CONFIRM_SUMMARY": "Some changes are not saved yet, do you really want to leave?",
"SAVE_SUCCESS": "Configurations have been successfully saved",
"MAIL_SERVER": "Email Server",
"MAIL_SERVER_PORT": "Email Server Port",
"MAIL_USERNAME": "Email Username",
@ -317,14 +327,14 @@
"PRO_CREATION_ADMIN": "Admin Only",
"TOOLTIP": {
"SELF_REGISTRATION": "Enable sign up",
"VERIFY_REMOTE_CERT": "Determine whether the image replication should verify the certificate of a remote Habor registry. Uncheck this box when the remote registry uses a self -signed or untrusted certificate.",
"AUTH_MODE": "By default the auth mode is db_auth, i.e. the credentials are stored in a local database.Set it to ldap_auth if you want to verify a user's credentials against an LDAP server.",
"LDAP_SEARCH_DN": "A user's DN who has the permission to search the LDAP/AD server.If your LDAP/AD server does not support anonymous search, you should configure this DN and ldap_search_pwd.",
"VERIFY_REMOTE_CERT": "Determine whether the image replication should verify the certificate of a remote Habor registry. Uncheck this box when the remote registry uses a self-signed or untrusted certificate.",
"AUTH_MODE": "By default the auth mode is db_auth, i.e. the credentials are stored in a local database. Set it to ldap_auth if you want to verify a user's credentials against an LDAP server.",
"LDAP_SEARCH_DN": "A user's DN who has the permission to search the LDAP/AD server. If your LDAP/AD server does not support anonymous search, you should configure this DN and ldap_search_pwd.",
"LDAP_BASE_DN": "The base DN from which to look up a user in LDAP/AD",
"LDAP_UID": "The attribute used in a search to match a user, it could be uid, cn, email, sAMAccountName or other attributes depending on your LDAP/AD",
"LDAP_UID": "The attribute used in a search to match a user. It could be uid, cn, email, sAMAccountName or other attributes depending on your LDAP/AD",
"LDAP_SCOPE": "The scope to search for users",
"TOKEN_EXPIRATION": "The expiration time (in minute) of token created by token service, default is 30 minutes",
"PRO_CREATION_RESTRICTION": "The flag to control what users have permission to create projects,Be default everyone can create a project, set to 'adminonly' such that only admin can create project."
"TOKEN_EXPIRATION": "The expiration time (in minutes) of a token created by the token service. Default is 30 minutes",
"PRO_CREATION_RESTRICTION": "The flag to control what users have permission to create projects. By default everyone can create a project. Set to 'adminonly' so only an admin can create a project."
},
"LDAP": {
"URL": "LDAP URL",
@ -333,27 +343,29 @@
"BASE_DN": "LDAP Base DN",
"FILTER": "LDAP Filter",
"UID": "LDAP UID",
"SCOPE": "lDAP Scope"
"SCOPE": "LDAP Scope"
},
"TEST_MAIL_SUCCESS": "Connection to mail server is verified",
"TEST_LDAP_SUCCESS": "Connection to ldap server is verified"
"TEST_LDAP_SUCCESS": "Connection to LDAP server is verified",
"LEAVING_CONFIRMATION_TITLE": "Confirm to leave",
"LEAVING_CONFIRMATION_SUMMARY": "Changes have not been saved yet, do you really want to leave currnet page?"
},
"PAGE_NOT_FOUND": {
"MAIN_TITLE": "Page not found",
"SUB_TITLE": "Redirect to harbor home in",
"SUB_TITLE": "Redirect to Harbor page in",
"UNIT": "seconds..."
},
"ABOUT": {
"VERSION": "Version",
"BUILD": "Build",
"COPYRIGHT": "Copyright 1998-2016 VMware. Inc. All rights reserved. This product is protected by U.S. and international property laws. VMware products are covered by one or more patents listed at",
"TRADEMARK": "Vmware is a registered trademark or trademark of VMware. Inc. in the United States and other jurisdictions. All other marks and names mentioned herein may be trademark of their respective companies.",
"TRADEMARK": "VMware is a registered trademark or trademark of VMware. Inc. in the United States and other jurisdictions. All other marks and names mentioned herein may be trademark of their respective companies.",
"END_USER_LICENSE": "End User License Agreement",
"OPEN_SOURCE_LICENSE": "Open Source/Third Party License"
},
"START_PAGE": {
"GETTING_START": "Project Harbor is an enterprise-class registry server that stores and distributes Docker images. Harbor extends the open source Docker Distribution by adding the functionalities usually required by an enterprise, such as security, identity and management. As an enterprise private registry, Harbor offers better performance and security.",
"GETTING_START_TITLE": "Getting Start"
"GETTING_START_TITLE": "Getting Started"
},
"TOP_REPO": "Popular Repositories",
"STATISTICS": {
@ -364,7 +376,11 @@
"INDEX_PUB": "PUBLIC",
"INDEX_TOTAL": "TOTAL"
},
"UNKNOWN_ERROR": "There are some unknown errors occurred, please try later",
"UNAUTHORIZED_ERROR": "Session is invalid or expired, you need to sign in to continue the operation",
"FORBIDDEN_ERROR": "You are not allowed to trigger the operation"
"SEARCH": {
"IN_PROGRESS": "Search...",
"BACK": "Back"
},
"UNKNOWN_ERROR": "Some unknown errors HAVE occurred. Please try again later",
"UNAUTHORIZED_ERROR": "Your session is invalid or has expired. You need to sign in to continue the operation",
"FORBIDDEN_ERROR": "You are not allowed to perform this operation"
}

View File

@ -20,7 +20,9 @@
"SAVE": "保存",
"TEST_MAIL": "测试邮件服务器",
"CLOSE": "关闭",
"TEST_LDAP": "测试LDAP服务器"
"TEST_LDAP": "测试LDAP服务器",
"MORE_INFO": "更多信息...",
"YES": "确定"
},
"TOOLTIP": {
"EMAIL": "请使用正确的邮箱地址比如name@example.com",
@ -36,7 +38,9 @@
"SIGN_UP_REAL_NAME": "全名",
"ITEM_REQUIRED": "此项必需",
"NUMBER_REQUIRED": "此项必需且为数字",
"PORT_REQUIRED": "此项必需且为合理端口号"
"PORT_REQUIRED": "此项必需且为合理端口号",
"EMAIL_EXISTING": "邮件地址已经存在",
"USER_EXISTING": "用户名已经存在"
},
"PLACEHOLDER": {
"CURRENT_PWD": "输入当前密码",
@ -105,7 +109,7 @@
"PROJECT": {
"PROJECTS": "项目",
"NAME": "项目名称",
"PUBLIC_OR_PRIVATE": "公开/私有",
"PUBLIC_OR_PRIVATE": "公开",
"REPO_COUNT": "镜像仓库数",
"CREATION_TIME": "创建时间",
"DESCRIPTION": "描述",
@ -116,6 +120,7 @@
"DELETE": "删除",
"MY_PROJECTS": "我的项目",
"PUBLIC_PROJECTS": "公开项目",
"PROJECT": "项目",
"NEW_PROJECT": "新建项目",
"NAME_IS_REQUIRED": "项目名称为必填项",
"NAME_MINIMUM_LENGTH": "项目名称长度过短至少多于2个字符。",
@ -125,7 +130,8 @@
"ITEMS": "条记录",
"DELETION_TITLE": "删除项目确认",
"DELETION_SUMMARY": "你确认删除项目 {{param}}",
"FILTER_PLACEHOLDER": "过滤项目"
"FILTER_PLACEHOLDER": "过滤项目",
"REPLICATION_RULE": "复制策略"
},
"PROJECT_DETAIL": {
"REPOSITORIES": "镜像仓库",
@ -136,6 +142,7 @@
},
"MEMBER": {
"NEW_MEMBER": "新建成员",
"MEMBER": "成员",
"NAME": "姓名",
"ROLE": "角色",
"SYS_ADMIN": "系统管理员",
@ -157,6 +164,7 @@
"REPOSITORY_NAME": "镜像名称",
"TAGS": "标签",
"OPERATION": "操作",
"OPERATIONS": "操作",
"TIMESTAMP": "时间戳",
"ALL_OPERATIONS": "所有操作",
"PULL": "Pull",
@ -225,6 +233,7 @@
},
"DESTINATION": {
"NEW_ENDPOINT": "新建目标",
"ENDPOINT": "目标",
"NAME": "目标名",
"NAME_IS_REQUIRED": "目标名为必填项。",
"URL": "目标URL",
@ -262,7 +271,7 @@
"DELETION_SUMMARY_TAG_DENIED": "要删除此镜像标签必须首先从Notary中删除。",
"FILTER_FOR_REPOSITORIES": "过滤镜像仓库",
"TAG": "标签",
"VERIFIED": "已验证",
"SIGNED": "已签名",
"AUTHOR": "作者",
"CREATED": "创建时间",
"DOCKER_VERSION": "Docker版本",
@ -270,7 +279,8 @@
"OS": "操作系统",
"SHOW_DETAILS": "显示详细",
"REPOSITORIES": "镜像仓库",
"ITEMS": "条记录"
"ITEMS": "条记录",
"POP_REPOS": "受欢迎的镜像库"
},
"ALERT": {
"FORM_CHANGE_CONFIRMATION": "表单内容改变,确认取消?"
@ -336,7 +346,9 @@
"SCOPE": "lDAP范围"
},
"TEST_MAIL_SUCCESS": "邮件服务器的连通正常",
"TEST_LDAP_SUCCESS": "LDAP服务器的连通正常"
"TEST_LDAP_SUCCESS": "LDAP服务器的连通正常",
"LEAVING_CONFIRMATION_TITLE": "确定离开?",
"LEAVING_CONFIRMATION_SUMMARY": "存在未保存的配置更改, 确认离开当前配置页?"
},
"PAGE_NOT_FOUND": {
"MAIN_TITLE": "页面不存在",
@ -364,6 +376,10 @@
"INDEX_PUB": "公开的",
"INDEX_TOTAL": "总计"
},
"SEARCH": {
"IN_PROGRESS": "搜索中...",
"BACK": "返回"
},
"UNKNOWN_ERROR": "发生未知错误,请稍后再试",
"UNAUTHORIZED_ERROR": "会话无效或者已经过期, 请重新登录以继续",
"FORBIDDEN_ERROR": "当前操作被禁止,请确认你有合法的权限"

View File

@ -1,16 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Harbor</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico?v=2">
</head>
<body>
<harbor-app>Loading...</harbor-app>
<script type="text/javascript" src="inline.bundle.js"></script><script type="text/javascript" src="scripts.bundle.js"></script><script type="text/javascript" src="styles.bundle.js"></script><script type="text/javascript" src="vendor.bundle.js"></script><script type="text/javascript" src="main.bundle.js"></script></body>
</html>

View File

@ -1,146 +0,0 @@
/******/ (function(modules) { // webpackBootstrap
/******/ // install a JSONP callback for chunk loading
/******/ var parentJsonpFunction = window["webpackJsonp"];
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0, resolves = [], result;
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(installedChunks[chunkId])
/******/ resolves.push(installedChunks[chunkId][0]);
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ for(moduleId in moreModules) {
/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ modules[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);
/******/ while(resolves.length)
/******/ resolves.shift()();
/******/ if(executeModules) {
/******/ for(i=0; i < executeModules.length; i++) {
/******/ result = __webpack_require__(__webpack_require__.s = executeModules[i]);
/******/ }
/******/ }
/******/ return result;
/******/ };
/******/
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // objects to store loaded and loading chunks
/******/ var installedChunks = {
/******/ 4: 0
/******/ };
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/ // This file contains only the entry chunk.
/******/ // The chunk loading function for additional chunks
/******/ __webpack_require__.e = function requireEnsure(chunkId) {
/******/ if(installedChunks[chunkId] === 0)
/******/ return Promise.resolve();
/******/
/******/ // an Promise means "currently loading".
/******/ if(installedChunks[chunkId]) {
/******/ return installedChunks[chunkId][2];
/******/ }
/******/ // start chunk loading
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.async = true;
/******/ script.timeout = 120000;
/******/
/******/ if (__webpack_require__.nc) {
/******/ script.setAttribute("nonce", __webpack_require__.nc);
/******/ }
/******/ script.src = __webpack_require__.p + "" + chunkId + ".chunk.js";
/******/ var timeout = setTimeout(onScriptComplete, 120000);
/******/ script.onerror = script.onload = onScriptComplete;
/******/ function onScriptComplete() {
/******/ // avoid mem leaks in IE.
/******/ script.onerror = script.onload = null;
/******/ clearTimeout(timeout);
/******/ var chunk = installedChunks[chunkId];
/******/ if(chunk !== 0) {
/******/ if(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));
/******/ installedChunks[chunkId] = undefined;
/******/ }
/******/ };
/******/
/******/ var promise = new Promise(function(resolve, reject) {
/******/ installedChunks[chunkId] = [resolve, reject];
/******/ });
/******/ installedChunks[chunkId][2] = promise;
/******/
/******/ head.appendChild(script);
/******/ return promise;
/******/ };
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // on error function for async loading
/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };
/******/ })
/************************************************************************/
/******/ ([]);
//# sourceMappingURL=inline.bundle.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -30,28 +30,4 @@
<clr-dg-footer>{{ (members ? members.length : 0) }} {{'MEMBER.ITEMS' | translate}}</clr-dg-footer>
</clr-datagrid>
</div>
</div>
<div class="col-lg-12 col-md-12 datagrid-margin-top">
<clr-datagrid>
<clr-dg-column>{{'MEMBER.NAME' | translate}}</clr-dg-column>
<clr-dg-column>{{'MEMBER.ROLE' | translate}}</clr-dg-column>
<clr-dg-column style="width: 12px;" class="datagrid-column-ext"></clr-dg-column>
<clr-dg-row *ngFor="let u of members">
<clr-dg-cell>{{u.username}}</clr-dg-cell>
<clr-dg-cell>
{{roleInfo[u.role_id] | translate}}
</clr-dg-cell>
<clr-dg-cell>
<harbor-action-overflow [hidden]="u.user_id === currentUser.user_id" class="habor-action-pos">
<a href="javascript:void(0)" class="dropdown-item" (click)="changeRole(u.user_id, 1)">{{'MEMBER.PROJECT_ADMIN' | translate}}</a>
<a href="javascript:void(0)" class="dropdown-item" (click)="changeRole(u.user_id, 2)">{{'MEMBER.DEVELOPER' | translate}}</a>
<a href="javascript:void(0)" class="dropdown-item" (click)="changeRole(u.user_id, 3)">{{'MEMBER.GUEST' | translate}}</a>
<div class="dropdown-divider"></div>
<a href="javascript:void(0)" class="dropdown-item" (click)="deleteMember(u.user_id)">{{'MEMBER.DELETE' | translate}}</a>
</harbor-action-overflow>
</clr-dg-cell>
</clr-dg-row>
<clr-dg-footer>{{ (members ? members.length : 0) }} {{'MEMBER.ITEMS' | translate}}</clr-dg-footer>
</clr-datagrid>
</div>
</div>