diff --git a/src/ui_ng/src/app/project/project.component.html b/src/ui_ng/src/app/project/project.component.html
index ddc4aed0c..18760312c 100644
--- a/src/ui_ng/src/app/project/project.component.html
+++ b/src/ui_ng/src/app/project/project.component.html
@@ -13,9 +13,10 @@
-
diff --git a/src/ui_ng/src/app/project/project.component.ts b/src/ui_ng/src/app/project/project.component.ts
index fcb4b668d..048781ed0 100644
--- a/src/ui_ng/src/app/project/project.component.ts
+++ b/src/ui_ng/src/app/project/project.component.ts
@@ -56,13 +56,11 @@ export class ProjectComponent implements OnInit, OnDestroy {
@ViewChild(ListProjectComponent)
listProject: ListProjectComponent;
- currentFilteredType: number = 0;
+ currentFilteredType: number = -1;//all projects
+ projectName: string = "";
subscription: Subscription;
- projectName: string;
- isPublic: number;
-
constructor(
private projectService: ProjectService,
private messageHandlerService: MessageHandlerService,
@@ -83,23 +81,20 @@ export class ProjectComponent implements OnInit, OnDestroy {
this.retrieve();
this.statisticHandler.refresh();
},
- error =>{
- if(error && error.status === 412) {
+ error => {
+ if (error && error.status === 412) {
this.messageHandlerService.showError('PROJECT.FAILED_TO_DELETE_PROJECT', '');
} else {
this.messageHandlerService.handleError(error);
}
}
- );
+ );
}
});
-
+
}
ngOnInit(): void {
- this.projectName = '';
- this.isPublic = 0;
-
}
ngOnDestroy(): void {
@@ -110,26 +105,31 @@ export class ProjectComponent implements OnInit, OnDestroy {
get projectCreationRestriction(): boolean {
let account = this.sessionService.getCurrentUser();
- if(account) {
- switch(this.appConfigService.getConfig().project_creation_restriction) {
- case 'adminonly':
- return (account.has_admin_role === 1);
- case 'everyone':
- return true;
- }
+ if (account) {
+ switch (this.appConfigService.getConfig().project_creation_restriction) {
+ case 'adminonly':
+ return (account.has_admin_role === 1);
+ case 'everyone':
+ return true;
+ }
}
return false;
}
retrieve(state?: State): void {
+ this.projectName = "";
+ this.getProjects();
+ }
+
+ getProjects(name?: string, isPublic?: number, page?: number, pageSize?: number): void {
this.projectService
- .listProjects(this.projectName, this.isPublic)
+ .listProjects(name, isPublic, page, pageSize)
.subscribe(
response => {
this.changedProjects = response.json();
},
error => this.messageHandlerService.handleError(error)
- );
+ );
}
openModal(): void {
@@ -138,7 +138,6 @@ export class ProjectComponent implements OnInit, OnDestroy {
createProject(created: boolean) {
if (created) {
- this.projectName = '';
this.retrieve();
this.statisticHandler.refresh();
}
@@ -146,14 +145,26 @@ export class ProjectComponent implements OnInit, OnDestroy {
doSearchProjects(projectName: string): void {
this.projectName = projectName;
- this.retrieve();
+ if (projectName === "") {
+ if (this.currentFilteredType === -1) {
+ this.getProjects();
+ } else {
+ this.getProjects(projectName, this.currentFilteredType);
+ }
+ } else {
+ this.getProjects(projectName);
+ }
}
doFilterProjects($event: any): void {
if ($event && $event.target && $event.target["value"]) {
- this.currentFilteredType = $event.target["value"];
- this.isPublic = this.currentFilteredType;
- this.retrieve();
+ this.projectName = "";
+ this.currentFilteredType = +$event.target["value"];
+ if (this.currentFilteredType === -1) {
+ this.getProjects();
+ } else {
+ this.getProjects("", this.currentFilteredType);
+ }
}
}
@@ -166,6 +177,7 @@ export class ProjectComponent implements OnInit, OnDestroy {
response => {
this.messageHandlerService.showSuccess('PROJECT.TOGGLED_SUCCESS');
this.statisticHandler.refresh();
+ this.getProjects("", this.currentFilteredType);
},
error => this.messageHandlerService.handleError(error)
);
@@ -185,6 +197,7 @@ export class ProjectComponent implements OnInit, OnDestroy {
}
refresh(): void {
+ this.currentFilteredType = -1;
this.retrieve();
this.statisticHandler.refresh();
}
diff --git a/src/ui_ng/src/app/project/project.service.ts b/src/ui_ng/src/app/project/project.service.ts
index 3d5e9a55d..408c0d552 100644
--- a/src/ui_ng/src/app/project/project.service.ts
+++ b/src/ui_ng/src/app/project/project.service.ts
@@ -46,8 +46,14 @@ export class ProjectService {
params.set('page', page + '');
params.set('page_size', pageSize + '');
}
+ if(name && name.trim() !== ""){
+ params.set('name', name);
+ }
+ if(isPublic !== undefined){
+ params.set('public', ''+isPublic);
+ }
return this.http
- .get(`/api/projects?project_name=${name}&is_public=${isPublic}`, {search: params})
+ .get(`/api/projects`, {search: params})
.map(response=>response)
.catch(error=>Observable.throw(error));
}
diff --git a/src/ui_ng/src/app/shared/shared.const.ts b/src/ui_ng/src/app/shared/shared.const.ts
index 52c032baf..4073d4958 100644
--- a/src/ui_ng/src/app/shared/shared.const.ts
+++ b/src/ui_ng/src/app/shared/shared.const.ts
@@ -28,15 +28,15 @@ export const httpStatusCode = {
"Forbidden": 403
};
export const enum ConfirmationTargets {
- EMPTY,
- PROJECT,
- PROJECT_MEMBER,
- USER,
- POLICY,
+ EMPTY,
+ PROJECT,
+ PROJECT_MEMBER,
+ USER,
+ POLICY,
TOGGLE_CONFIRM,
- TARGET,
- REPOSITORY,
- TAG,
+ TARGET,
+ REPOSITORY,
+ TAG,
CONFIG,
CONFIG_ROUTE,
CONFIG_TAB
@@ -71,6 +71,6 @@ export const enum ConfirmationButtons {
CONFIRM_CANCEL, YES_NO, DELETE_CANCEL, CLOSE
}
-export const ProjectTypes = { 0: 'PROJECT.MY_PROJECTS', 1: 'PROJECT.PUBLIC_PROJECTS' };
+export const ProjectTypes = { 0: 'PROJECT.ALL_PROJECTS', 1: 'PROJECT.PRIVATE_PROJECTS', 2: 'PROJECT.PUBLIC_PROJECTS' };
export const RoleInfo = { 1: 'MEMBER.PROJECT_ADMIN', 2: 'MEMBER.DEVELOPER', 3: 'MEMBER.GUEST' };
export const RoleMapping = { 'projectAdmin': 'MEMBER.PROJECT_ADMIN', 'developer': 'MEMBER.DEVELOPER', 'guest': 'MEMBER.GUEST' };
diff --git a/src/ui_ng/src/app/shared/statictics/statistics-panel.component.html b/src/ui_ng/src/app/shared/statictics/statistics-panel.component.html
index a9ab0a2d5..425d80741 100644
--- a/src/ui_ng/src/app/shared/statictics/statistics-panel.component.html
+++ b/src/ui_ng/src/app/shared/statictics/statistics-panel.component.html
@@ -12,10 +12,10 @@
diff --git a/src/ui_ng/src/i18n/lang/en-us-lang.json b/src/ui_ng/src/i18n/lang/en-us-lang.json
index 12e5167dc..3bf74e077 100644
--- a/src/ui_ng/src/i18n/lang/en-us-lang.json
+++ b/src/ui_ng/src/i18n/lang/en-us-lang.json
@@ -132,7 +132,8 @@
"MAKE": "Make",
"NEW_POLICY": "New Replication Rule",
"DELETE": "Delete",
- "MY_PROJECTS": "All Projects",
+ "ALL_PROJECTS": "All Projects",
+ "PRIVATE_PROJECTS": "Private Projects",
"PUBLIC_PROJECTS": "Public Projects",
"PROJECT": "Project",
"NEW_PROJECT": "New Project",
@@ -269,7 +270,9 @@
"POLICY_ALREADY_EXISTS": "Replication rule already exists.",
"FAILED_TO_DELETE_POLICY_ENABLED": "Cannot delete rule: rule has unfinished job(s) or rule is enabled.",
"FOUND_ERROR_IN_JOBS": "Found errors in the replication job(s), please check.",
- "INVALID_DATE": "Invalid date."
+ "INVALID_DATE": "Invalid date.",
+ "PLACEHOLDER": "We couldn't find any replication rules!",
+ "JOB_PLACEHOLDER": "We couldn't find any replication jobs!"
},
"DESTINATION": {
"NEW_ENDPOINT": "New Endpoint",
@@ -297,7 +300,8 @@
"DELETED_SUCCESS": "Deleted endpoint successfully.",
"DELETED_FAILED": "Deleted endpoint failed.",
"CANNOT_EDIT": "Endpoint cannot be changed while the replication rule is enabled.",
- "FAILED_TO_DELETE_TARGET_IN_USED": "Failed to delete the endpoint in use."
+ "FAILED_TO_DELETE_TARGET_IN_USED": "Failed to delete the endpoint in use.",
+ "PLACEHOLDER": "We couldn't find any endpoints!"
},
"REPOSITORY": {
"COPY_DIGEST_ID": "Copy Digest ID",
@@ -329,7 +333,8 @@
"DELETED_REPO_SUCCESS": "Deleted repository successfully.",
"DELETED_TAG_SUCCESS": "Deleted tag successfully.",
"COPY": "Copy",
- "NOTARY_IS_UNDETERMINED": "Cannot determine the signature of this tag."
+ "NOTARY_IS_UNDETERMINED": "Cannot determine the signature of this tag.",
+ "PLACEHOLDER": "We couldn't find any repositories!"
},
"ALERT": {
"FORM_CHANGE_CONFIRMATION": "Some changes are not saved yet. Do you want to cancel?"
@@ -424,7 +429,7 @@
"TITLE": "STATISTICS",
"PRO_ITEM": "PROJECTS",
"REPO_ITEM": "REPOSITORIES",
- "INDEX_MY": "MY",
+ "INDEX_PRIVATE": "PRIVATE",
"INDEX_MY_PROJECTS": "MY PROJECTS",
"INDEX_MY_REPOSITORIES": "MY REPOSITORIES",
"INDEX_PUB": "PUBLIC",
@@ -467,7 +472,8 @@
"NONE": "None"
},
"SINGULAR": "Vulnerability",
- "PLURAL": "Vulnerabilities"
+ "PLURAL": "Vulnerabilities",
+ "PLACEHOLDER": "Filter Vulnerabilities"
},
"PUSH_IMAGE": {
"TITLE": "Push Image",
@@ -483,7 +489,8 @@
"ARCHITECTURE": "Architecture",
"OS": "OS",
"SCAN_COMPLETION_TIME": "Scan Completed",
- "IMAGE_VULNERABILITIES": "Image Vulnerabilities"
+ "IMAGE_VULNERABILITIES": "Image Vulnerabilities",
+ "PLACEHOLDER": "We couldn't find any tags!"
},
"UNKNOWN_ERROR": "Unknown errors have occurred. Please try again later.",
"UNAUTHORIZED_ERROR": "Your session is invalid or has expired. You need to sign in to continue your action.",
diff --git a/src/ui_ng/src/i18n/lang/es-es-lang.json b/src/ui_ng/src/i18n/lang/es-es-lang.json
index e065d22c3..d8ca73816 100644
--- a/src/ui_ng/src/i18n/lang/es-es-lang.json
+++ b/src/ui_ng/src/i18n/lang/es-es-lang.json
@@ -132,8 +132,9 @@
"MAKE": "Hacer",
"NEW_POLICY": "Nueva regla de replicación",
"DELETE": "Eliminar",
- "MY_PROJECTS": "Todos los proyectos",
- "PUBLIC_PROJECTS": "Proyectos Públicos",
+ "ALL_PROJECTS": "All Projects",
+ "PRIVATE_PROJECTS": "Private Projects",
+ "PUBLIC_PROJECTS": "Public Projects",
"PROJECT": "Proyecto",
"NEW_PROJECT": "Nuevo proyecto",
"NAME_TOOLTIP": "Project name should be at least 2 characters long with lower case characters, numbers and ._- and must be start with characters or numbers.",
@@ -269,7 +270,9 @@
"POLICY_ALREADY_EXISTS": "La regla de replicación ya existe.",
"FAILED_TO_DELETE_POLICY_ENABLED": "No se puede eliminar la regla: tiene trabajo(s) sin finalizar o está activa.",
"FOUND_ERROR_IN_JOBS": "Se han encontrado errores en el trabajo de replicación. Por favor, compruébelos.",
- "INVALID_DATE": "Fecha invalida."
+ "INVALID_DATE": "Fecha invalida.",
+ "PLACEHOLDER": "We couldn't find any replication rules!",
+ "JOB_PLACEHOLDER": "We couldn't find any replication jobs!"
},
"DESTINATION": {
"NEW_ENDPOINT": "Nuevo Endpoint",
@@ -297,7 +300,8 @@
"DELETED_SUCCESS": "Endpoint eliminado satisfactoriamente.",
"DELETED_FAILED": "Ha fallado la eliminación del endpoint.",
"CANNOT_EDIT": "El endpoint no puede ser cambiado mientras la regla de replicación está activa.",
- "FAILED_TO_DELETE_TARGET_IN_USED": "Fallo al eliminar el endpoint en uso."
+ "FAILED_TO_DELETE_TARGET_IN_USED": "Fallo al eliminar el endpoint en uso.",
+ "PLACEHOLDER": "We couldn't find any endpoints!"
},
"REPOSITORY": {
"COPY_ID": "Copiar ID",
@@ -329,7 +333,9 @@
"POP_REPOS": "Repositorios Populares",
"DELETED_REPO_SUCCESS": "Repositorio eliminado satisfactoriamente.",
"DELETED_TAG_SUCCESS": "Etiqueta eliminada satisfactoriamente.",
- "COPY": "Copiar"
+ "COPY": "Copiar",
+ "NOTARY_IS_UNDETERMINED": "Cannot determine the signature of this tag.",
+ "PLACEHOLDER": "We couldn't find any repositories!"
},
"ALERT": {
"FORM_CHANGE_CONFIRMATION": "Algunos cambios no se han guardado aún. ¿Quiere cancelar?"
@@ -424,7 +430,7 @@
"TITLE": "ESTADÍSTICAS",
"PRO_ITEM": "PROYECTOS",
"REPO_ITEM": "REPOSITORIOS",
- "INDEX_MY": "MI",
+ "INDEX_PRIVATE": "PRIVADO",
"INDEX_PUB": "PÚBLICO",
"INDEX_TOTAL": "TOTAL",
"STORAGE": "ALMACENAMIENTO",
@@ -465,7 +471,8 @@
"NONE": "None"
},
"SINGULAR": "Vulnerability",
- "PLURAL": "Vulnerabilities"
+ "PLURAL": "Vulnerabilities",
+ "PLACEHOLDER": "Filter Vulnerabilities"
},
"PUSH_IMAGE": {
"TITLE": "Push Image",
@@ -481,7 +488,8 @@
"ARCHITECTURE": "Architecture",
"OS": "OS",
"SCAN_COMPLETION_TIME": "Scan Completed",
- "IMAGE_VULNERABILITIES": "Image Vulnerabilities"
+ "IMAGE_VULNERABILITIES": "Image Vulnerabilities",
+ "PLACEHOLDER": "We couldn't find any tags!"
},
"UNKNOWN_ERROR": "Ha ocurrido un error desconocido. Por favor, inténtelo de nuevo más tarde.",
"UNAUTHORIZED_ERROR": "La sesión no es válida o ha caducado. Necesita identificarse de nuevo para llevar a cabo esa acción.",
diff --git a/src/ui_ng/src/i18n/lang/zh-cn-lang.json b/src/ui_ng/src/i18n/lang/zh-cn-lang.json
index 1144383e5..748ac0f5f 100644
--- a/src/ui_ng/src/i18n/lang/zh-cn-lang.json
+++ b/src/ui_ng/src/i18n/lang/zh-cn-lang.json
@@ -132,7 +132,8 @@
"MAKE": "设为",
"NEW_POLICY": "新建规则",
"DELETE": "删除",
- "MY_PROJECTS": "所有项目",
+ "ALL_PROJECTS": "所有项目",
+ "PRIVATE_PROJECTS": "私有项目",
"PUBLIC_PROJECTS": "公开项目",
"PROJECT": "项目",
"NEW_PROJECT": "新建项目",
@@ -269,7 +270,9 @@
"POLICY_ALREADY_EXISTS": "规则已存在。",
"FAILED_TO_DELETE_POLICY_ENABLED": "删除复制规则失败: 仍有未完成的任务或规则未停用。",
"FOUND_ERROR_IN_JOBS": "复制任务中包含错误,请检查。",
- "INVALID_DATE": "无效日期。"
+ "INVALID_DATE": "无效日期。",
+ "PLACEHOLDER": "未发现任何复制规则!",
+ "JOB_PLACEHOLDER": "未发现任何复制任务!"
},
"DESTINATION": {
"NEW_ENDPOINT": "新建目标",
@@ -297,7 +300,8 @@
"DELETED_SUCCESS": "成功删除目标。",
"DELETED_FAILED": "删除目标失败。",
"CANNOT_EDIT": "当复制规则启用时目标无法修改。",
- "FAILED_TO_DELETE_TARGET_IN_USED": "无法删除正在使用的目标。"
+ "FAILED_TO_DELETE_TARGET_IN_USED": "无法删除正在使用的目标。",
+ "PLACEHOLDER": "未发现任何复制目标!"
},
"REPOSITORY": {
"COPY_DIGEST_ID": "复制摘要ID",
@@ -329,7 +333,8 @@
"DELETED_REPO_SUCCESS": "成功删除镜像仓库。",
"DELETED_TAG_SUCCESS": "成功删除镜像标签。",
"COPY": "复制",
- "NOTARY_IS_UNDETERMINED": "无法确定镜像标签签名。"
+ "NOTARY_IS_UNDETERMINED": "无法确定镜像标签签名。",
+ "PLACEHOLDER": "未发现任何镜像库!"
},
"ALERT": {
"FORM_CHANGE_CONFIRMATION": "表单内容改变,确认是否取消?"
@@ -424,7 +429,7 @@
"TITLE": "统计",
"PRO_ITEM": "项目",
"REPO_ITEM": "镜像仓库",
- "INDEX_MY": "私有",
+ "INDEX_PRIVATE": "私有",
"INDEX_MY_PROJECTS": "我的项目",
"INDEX_MY_REPOSITORIES": "我的镜像仓库",
"INDEX_PUB": "公开",
@@ -467,7 +472,8 @@
"NONE": "无"
},
"SINGULAR": "缺陷",
- "PLURAL": "缺陷"
+ "PLURAL": "缺陷",
+ "PLACEHOLDER": "过滤缺陷"
},
"PUSH_IMAGE": {
"TITLE": "推送镜像",
@@ -483,7 +489,8 @@
"ARCHITECTURE": "架构",
"OS": "操作系统",
"SCAN_COMPLETION_TIME": "扫描完成时间",
- "IMAGE_VULNERABILITIES": "镜像缺陷"
+ "IMAGE_VULNERABILITIES": "镜像缺陷",
+ "PLACEHOLDER": "未发现任何标签!"
},
"UNKNOWN_ERROR": "发生未知错误,请稍后再试。",
"UNAUTHORIZED_ERROR": "会话无效或者已经过期, 请重新登录以继续。",