From: Martin Stockhammer Date: Thu, 3 Dec 2020 20:26:22 +0000 (+0100) Subject: Adding role edit form X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=83ee92094142f542b02b9a7b6180c52809ccd401;p=archiva.git Adding role edit form --- diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/app-routing.module.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/app-routing.module.ts index 877e4ac2a..be8b0a5f7 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/app-routing.module.ts +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/app-routing.module.ts @@ -27,9 +27,9 @@ import {LoginComponent} from "./modules/shared/login/login.component"; import {SearchComponent} from './modules/repo/search/search.component'; import {BrowseComponent} from "./modules/repo/browse/browse.component"; import {UploadComponent} from "./modules/repo/upload/upload.component"; -import {ManageRolesComponent} from "./modules/user/manage-roles/manage-roles.component"; +import {ManageRolesComponent} from "./modules/security/manage-roles/manage-roles.component"; import {RoutingGuardService as Guard} from "./services/routing-guard.service"; -import {SecurityConfigurationComponent} from "./modules/user/security-configuration/security-configuration.component"; +import {SecurityConfigurationComponent} from "./modules/security/security-configuration/security-configuration.component"; /** * You can use Guard (RoutingGuardService) for permission checking. The service needs data with one parameter 'perm', @@ -48,9 +48,9 @@ const routes: Routes = [ }, { - path: 'user', component: HomeComponent,canActivate:[Guard],data:{perm: 'menu.user.section'}, + path: 'security', component: HomeComponent,canActivate:[Guard],data:{perm: 'menu.user.section'}, children: [ - {path: 'users', loadChildren: () => import('./modules/user/user.module').then(m => m.UserModule)}, + {path: 'users', loadChildren: () => import('./modules/security/user.module').then(m => m.UserModule)}, {path: 'roles', component: ManageRolesComponent}, {path: 'config', component: SecurityConfigurationComponent}, ] diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/app.module.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/app.module.ts index 91332a446..d31202377 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/app.module.ts +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/app.module.ts @@ -35,7 +35,7 @@ import {NavSubgroupDirective} from './directives/nav-subgroup.directive'; import {SearchComponent} from './modules/repo/search/search.component'; import {BrowseComponent} from './modules/repo/browse/browse.component'; import {UploadComponent} from './modules/repo/upload/upload.component'; -import {SecurityConfigurationComponent} from './modules/user/security-configuration/security-configuration.component'; +import {SecurityConfigurationComponent} from './modules/security/security-configuration/security-configuration.component'; import {CoreModule} from "./modules/core/core.module"; import {httpTranslateLoader, SharedModule} from "./modules/shared/shared.module"; import {TranslateCompiler, TranslateLoader, TranslateModule} from "@ngx-translate/core"; diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/application.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/application.spec.ts new file mode 100644 index 000000000..a77257168 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/application.spec.ts @@ -0,0 +1,7 @@ +import { Application } from './application'; + +describe('Application', () => { + it('should create an instance', () => { + expect(new Application()).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/application.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/application.ts new file mode 100644 index 000000000..857d080a8 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/application.ts @@ -0,0 +1,2 @@ +export class Application { +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-template.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-template.spec.ts new file mode 100644 index 000000000..c95251c79 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-template.spec.ts @@ -0,0 +1,7 @@ +import { RoleTemplate } from './role-template'; + +describe('RoleTemplate', () => { + it('should create an instance', () => { + expect(new RoleTemplate()).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-template.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-template.ts new file mode 100644 index 000000000..82363d3a0 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-template.ts @@ -0,0 +1,9 @@ +export class RoleTemplate { + id:string + name:string + description:string + application_id:string + assignable:boolean + permanent:boolean + +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-tree.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-tree.spec.ts new file mode 100644 index 000000000..63de023a8 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-tree.spec.ts @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { RoleTree } from './role-tree'; + +describe('RoleTree', () => { + it('should create an instance', () => { + expect(new RoleTree()).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-tree.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-tree.ts new file mode 100644 index 000000000..166b7003b --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role-tree.ts @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from './role'; +import {Application} from "@app/model/application"; + +export class RoleTree { + userid: string + applications: Map + root_roles: Array +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role.spec.ts new file mode 100644 index 000000000..7be0a054d --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role.spec.ts @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from './role'; + +describe('Role', () => { + it('should create an instance', () => { + expect(new Role()).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role.ts new file mode 100644 index 000000000..b2b9bd527 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/model/role.ts @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export class Role { + id: string + name: string + description: string + assignable: boolean + permanent: boolean + child: boolean + assigned: boolean + template_instance: boolean + application_id:string + model_id:string + resource:string + + children: Array + + // Web Internal attributes + enabled: boolean = true + level:number = -1 + +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.html b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.html new file mode 100644 index 000000000..1611de7c1 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.html @@ -0,0 +1,20 @@ + + +

manage-roles works!

diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.scss b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.scss new file mode 100644 index 000000000..573c9ef45 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.scss @@ -0,0 +1,19 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.spec.ts new file mode 100644 index 000000000..f3d2b6407 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.spec.ts @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManageRolesComponent } from './manage-roles.component'; + +describe('ManageRolesComponent', () => { + let component: ManageRolesComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ManageRolesComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ManageRolesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.ts new file mode 100644 index 000000000..5109a872a --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/manage-roles/manage-roles.component.ts @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-manage-roles', + templateUrl: './manage-roles.component.html', + styleUrls: ['./manage-roles.component.scss'] +}) +export class ManageRolesComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.html b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.html new file mode 100644 index 000000000..8ace87c6f --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.html @@ -0,0 +1,20 @@ + + +

security-configuration works!

diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.scss b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.scss new file mode 100644 index 000000000..573c9ef45 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.scss @@ -0,0 +1,19 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.spec.ts new file mode 100644 index 000000000..d6ce62fce --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.spec.ts @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SecurityConfigurationComponent } from './security-configuration.component'; + +describe('SecurityConfigurationComponent', () => { + let component: SecurityConfigurationComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ SecurityConfigurationComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(SecurityConfigurationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.ts new file mode 100644 index 000000000..b97a1bcd2 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/security-configuration/security-configuration.component.ts @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-security-configuration', + templateUrl: './security-configuration.component.html', + styleUrls: ['./security-configuration.component.scss'] +}) +export class SecurityConfigurationComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/user-routing.module.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/user-routing.module.ts new file mode 100644 index 000000000..abb3a5e5a --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/user-routing.module.ts @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { ManageUsersComponent } from './users/manage-users/manage-users.component'; +import { ManageUsersListComponent } from './users/manage-users-list/manage-users-list.component'; +import { ManageUsersAddComponent } from './users/manage-users-add/manage-users-add.component'; +import { ManageUsersEditComponent } from './users/manage-users-edit/manage-users-edit.component'; +import { ManageUsersDeleteComponent } from './users/manage-users-delete/manage-users-delete.component'; +import {ManageUsersRolesComponent} from "./users/manage-users-roles/manage-users-roles.component"; +import {RoutingGuardService as Guard} from "@app/services/routing-guard.service"; + + +/** + * You can use Guard (RoutingGuardService) for permission checking. The service needs data with one parameter 'perm', + * that gives the path of the uiPermission map of the user service. + */ + +const routes: Routes = [ + { path: '', component: ManageUsersComponent,canActivate:[Guard], + data: { perm: 'menu.user.manage' }, + children: [ + {path: 'list', component: ManageUsersListComponent}, + {path: 'add', component: ManageUsersAddComponent}, + {path: 'edit/:userid', component: ManageUsersEditComponent}, + {path: 'edit', redirectTo:'edit/guest' }, + {path: 'delete/:userid', component: ManageUsersDeleteComponent}, + {path: 'roles', component:ManageUsersRolesComponent}, + {path: 'roles/:userid', component:ManageUsersRolesComponent}, + {path: '', redirectTo:'list',pathMatch:'full'} + ] + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [], + declarations: [] +}) +export class UserRoutingModule { } + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/user.module.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/user.module.ts new file mode 100644 index 000000000..8cef8606a --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/user.module.ts @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {ManageUsersComponent} from "./users/manage-users/manage-users.component"; +import {ManageUsersListComponent} from "./users/manage-users-list/manage-users-list.component"; +import {ManageUsersAddComponent} from "./users/manage-users-add/manage-users-add.component"; +import {ManageUsersEditComponent} from "./users/manage-users-edit/manage-users-edit.component"; +import {SharedModule} from "../shared/shared.module"; +import {FormsModule, ReactiveFormsModule} from "@angular/forms"; +import {ManageUsersDeleteComponent} from './users/manage-users-delete/manage-users-delete.component'; +import {UserRoutingModule} from "./user-routing.module"; +import { ManageUsersRolesComponent } from './users/manage-users-roles/manage-users-roles.component'; +import {RoutingGuardService} from "../../services/routing-guard.service"; + + +@NgModule({ + declarations: [ + ManageUsersComponent, + ManageUsersListComponent, + ManageUsersAddComponent, + ManageUsersEditComponent, + ManageUsersDeleteComponent, + ManageUsersRolesComponent + ], + exports: [ + ManageUsersComponent, + ManageUsersListComponent, + ManageUsersAddComponent, + ManageUsersEditComponent + ], + imports: [ + CommonModule, + SharedModule, + FormsModule, + ReactiveFormsModule, + UserRoutingModule + ] +}) +export class UserModule { +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.html b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.html new file mode 100644 index 000000000..4f95595af --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.html @@ -0,0 +1,103 @@ + + +
+
+ + + {{'users.input.small.user_id'|translate:{'minSize':this.minUserIdSize} }} +
+
+ {{'form.error.required'|translate}} +
+
+ {{'form.error.containsWhitespace'|translate}} +
+
+ {{'form.error.userexists'|translate}} +
+
+ +
+
+ + + {{'users.input.small.full_name'|translate}} +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+ + + + +
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.scss b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.scss new file mode 100644 index 000000000..573c9ef45 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.scss @@ -0,0 +1,19 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.spec.ts new file mode 100644 index 000000000..71ff4cb03 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.spec.ts @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManageUsersAddComponent } from './manage-users-add.component'; + +describe('ManageUsersAddComponent', () => { + let component: ManageUsersAddComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ManageUsersAddComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ManageUsersAddComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.ts new file mode 100644 index 000000000..658881391 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-add/manage-users-add.component.ts @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {Component, OnInit} from '@angular/core'; +import {AbstractControl, FormBuilder, FormControl, FormGroup, ValidationErrors, ValidatorFn} from '@angular/forms'; +import {UserService} from "../../../../services/user.service"; +import {ErrorResult} from "../../../../model/error-result"; +import {catchError} from "rxjs/operators"; +import {UserInfo} from "../../../../model/user-info"; +import {ManageUsersBaseComponent} from "../manage-users-base.component"; + +@Component({ + selector: 'app-manage-users-add', + templateUrl: './manage-users-add.component.html', + styleUrls: ['./manage-users-add.component.scss'] +}) +export class ManageUsersAddComponent extends ManageUsersBaseComponent implements OnInit { + + constructor(userService: UserService, fb: FormBuilder) { + super(userService, fb); + + } + + ngOnInit(): void { + } + + onSubmit() { + // Process checkout data here + this.result = null; + if (this.userForm.valid) { + let user = this.copyFromForm(this.editProperties); + console.info('Adding user ' + user); + this.userService.addUser(user).pipe(catchError((error: ErrorResult) => { + // console.log("Error " + error + " - " + typeof (error) + " - " + JSON.stringify(error)); + if (error.status == 422) { + // console.warn("Validation error"); + let pwdErrors = {}; + for (let message of error.error_messages) { + if (message.error_key.startsWith('user.password.violation')) { + pwdErrors[message.error_key] = message.message; + } + } + this.userForm.get('password').setErrors(pwdErrors); + + } + this.errorResult = error; + this.success = false; + this.error = true; + return []; + // return throwError(error); + })).subscribe((user: UserInfo) => { + this.result = user; + this.success = true; + this.error = false; + this.userForm.reset(this.formInitialValues); + }); + } + } + + + + + +} + + + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-base.component.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-base.component.ts new file mode 100644 index 000000000..42a27e8d9 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-base.component.ts @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {environment} from "../../../../environments/environment"; +import {ErrorResult} from "../../../model/error-result"; +import {UserInfo} from "../../../model/user-info"; +import { + AbstractControl, + FormControl, + ValidatorFn, + Validators, + FormBuilder, + ValidationErrors, + FormGroup +} from "@angular/forms"; +import {User} from "../../../model/user"; +import {of, timer} from "rxjs"; +import {catchError, map, switchMap} from "rxjs/operators"; +import { UserService } from 'src/app/services/user.service'; + +export class ManageUsersBaseComponent { + + editProperties = ['user_id', 'full_name', 'email', 'locked', 'password_change_required', + 'password', 'confirm_password', 'validated']; + minUserIdSize = environment.application.minUserIdLength; + success: boolean = false; + error: boolean = false; + errorResult: ErrorResult; + result: UserInfo; + user: string; + formInitialValues; + + userForm = this.fb.group({ + user_id: ['', [Validators.required, Validators.minLength(this.minUserIdSize), whitespaceValidator()], this.userUidExistsValidator()], + full_name: ['', Validators.required], + email: ['', [Validators.required, Validators.email]], + locked: [false], + password_change_required: [true], + password: [''], + confirm_password: [''], + validated: [true] + }, { + validator: MustMatch('password', 'confirm_password') + }) + + constructor(public userService: UserService, public fb: FormBuilder) { + this.formInitialValues=this.userForm.value + } + + + public copyFromForm(properties: string[]): User { + let user: any = new User(); + for (let prop of properties) { + user[prop] = this.userForm.get(prop).value; + } + console.log("User " + user); + return user; + } + + public copyToForm(properties: string[], user: User): void { + let propMap = {}; + for (let prop of properties) { + let propValue = user[prop] == null ? '' : user[prop]; + propMap[prop] = propValue; + } + this.userForm.patchValue(propMap); + console.log("User " + user); + } + + + valid(field: string): string[] { + let formField = this.userForm.get(field); + if (formField.dirty || formField.touched) { + if (formField.valid) { + return ['is-valid'] + } else { + return ['is-invalid'] + } + } else { + return [''] + } + } + + /** + * Async validator with debounce time + * @constructor + */ + userUidExistsValidator() { + + return (ctrl: FormControl) => { + // debounceTimer() does not work here, as the observable is created with each keystroke + // but angular does unsubscribe on previous started async observables. + return timer(500).pipe( + switchMap((userid) => this.userService.userExists(ctrl.value)), + catchError(() => of(null)), + map(exists => (exists ? {userexists: true} : null)) + ); + } + } + + forbiddenNameValidator(nameRe: RegExp): ValidatorFn { + return (control: AbstractControl): { [key: string]: any } | null => { + const forbidden = nameRe.test(control.value); + return forbidden ? {forbiddenName: {value: control.value}} : null; + }; + } + + getAllErrors(formGroup: FormGroup, errors: string[] = []) : string[] { + Object.keys(formGroup.controls).forEach(field => { + const control = formGroup.get(field); + if (control instanceof FormControl && control.errors != null) { + let keys = Object.keys(control.errors).map(errorKey=>field+'.'+errorKey); + errors = errors.concat(keys); + } else if (control instanceof FormGroup) { + errors = errors.concat(this.getAllErrors(control)); + } + }); + return errors; + } + + getAttributeErrors(control:string):string[] { + return Object.keys(this.userForm.get(control).errors); + } +} + +export function whitespaceValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const hasWhitespace = /\s/g.test(control.value); + return hasWhitespace ? {containsWhitespace: {value: control.value}} : null; + }; +} +export function MustMatch(controlName: string, matchingControlName: string) : ValidatorFn { + return (formGroup: FormGroup): ValidationErrors | null => { + const control = formGroup.controls[controlName]; + const matchingControl = formGroup.controls[matchingControlName]; + + if (matchingControl.errors && !matchingControl.errors.mustMatch) { + // return if another validator has already found an error on the matchingControl + return; + } + + // set error on matchingControl if validation fails + if (control.value !== matchingControl.value) { + matchingControl.setErrors({mustMatch: true}); + } else { + matchingControl.setErrors(null); + } + } +} \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.html b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.html new file mode 100644 index 000000000..23e4177dd --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.html @@ -0,0 +1,35 @@ + + + + + + + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.scss b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.scss new file mode 100644 index 000000000..343c3b1c0 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.scss @@ -0,0 +1,18 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.spec.ts new file mode 100644 index 000000000..d51fdaacf --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.spec.ts @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManageUsersDeleteComponent } from './manage-users-delete.component'; + +describe('ManageUsersDeleteComponent', () => { + let component: ManageUsersDeleteComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ManageUsersDeleteComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ManageUsersDeleteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.ts new file mode 100644 index 000000000..d646e203c --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.ts @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {AfterViewInit, Component, Input, OnInit, ViewChild} from '@angular/core'; +import {ActivatedRoute, Router} from "@angular/router"; +import {NgbModal} from "@ng-bootstrap/ng-bootstrap"; +import {UserService} from "../../../../services/user.service"; + +@Component({ + selector: 'app-manage-users-delete', + templateUrl: './manage-users-delete.component.html', + styleUrls: ['./manage-users-delete.component.scss'] +}) +export class ManageUsersDeleteComponent implements OnInit, AfterViewInit { + + @ViewChild('userdelete') askModal; + + user_id: string; + + constructor(private route: ActivatedRoute, private modal: NgbModal, + private userService: UserService, private router : Router) { + this.route.params.subscribe((params)=>{ + if (params.userid) { + this.user_id = params.userid; + } + }) + } + + ngOnInit(): void { + + } + + private runModal() { + if (this.user_id!=null && this.user_id!='') { + let modalInstance = this.modal.open(this.askModal).result.then((result) => { + console.log("Result: " + result); + let userId = this.user_id; + if (result=='YES' && userId!=null && userId!='') { + let deleted = this.userService.deleteUser(userId).subscribe(); + if (deleted) { + this.router.navigate(['/security','users','list']); + } + } else if (result=='NO') { + this.router.navigate(['/security','users','list']); + } + }, (reason) => { + console.log("Reason: " + reason); + }); + } + } + + ngAfterViewInit(): void { + if (this.user_id!=null) { + this.runModal(); + } + } + +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.html b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.html new file mode 100644 index 000000000..ba8becf38 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.html @@ -0,0 +1,142 @@ + + +
+
+
Edit
+
+ +
+
+
+ +
+ +
+
+
+ +
+ + {{'users.input.small.full_name'|translate}} +
+
+
+ +
+ +
+
+
+ +
+ + {{'users.edit.small.password'|translate}} +
+
+
+ +
+ +
+
+
+
Flags
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ + + + + +
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.scss b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.scss new file mode 100644 index 000000000..343c3b1c0 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.scss @@ -0,0 +1,18 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.spec.ts new file mode 100644 index 000000000..f21a49f32 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.spec.ts @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManageUsersEditComponent } from './manage-users-edit.component'; + +describe('ManageUsersEditComponent', () => { + let component: ManageUsersEditComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ManageUsersEditComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ManageUsersEditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.ts new file mode 100644 index 000000000..288b5522b --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-edit/manage-users-edit.component.ts @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {Component, OnInit} from '@angular/core'; +import {ActivatedRoute} from '@angular/router'; +import {UserService} from "../../../../services/user.service"; +import {FormBuilder, FormControl} from "@angular/forms"; +import {catchError, map, switchMap, tap} from 'rxjs/operators'; +import {ManageUsersBaseComponent} from "../manage-users-base.component"; +import {ErrorResult} from "../../../../model/error-result"; + +@Component({ + selector: 'app-manage-users-edit', + templateUrl: './manage-users-edit.component.html', + styleUrls: ['./manage-users-edit.component.scss'] +}) +export class ManageUsersEditComponent extends ManageUsersBaseComponent implements OnInit { + + editProperties = ['user_id', 'full_name', 'email', 'locked', 'password_change_required', + 'password', 'confirm_password', 'validated']; + editUser; + originUser; + editMode: boolean; + minUserIdSize = 0; + + constructor(private route: ActivatedRoute, public userService: UserService, public fb: FormBuilder) { + super(userService, fb); + this.editMode=false; + this.route.queryParams.subscribe((params)=>{ + if (params.editmode) { + this.editMode=true; + } + }) + this.editUser = this.route.params.pipe( + map(params => params.userid), switchMap(userid => userService.getUser(userid))).subscribe(user => { + this.editUser = user; + this.originUser = user; + this.copyToForm(this.editProperties, this.editUser); + }); + } + + ngOnInit(): void { + // This resets the validators of the base class + this.userForm.get('user_id').clearValidators(); + this.userForm.get('user_id').clearAsyncValidators(); + } + + valid(field: string): string[] { + if (this.editMode) { + let classArr = super.valid(field); + return classArr.concat('form-control') + } else { + return ['form-control-plaintext']; + } + } + + + onSubmit() { + let user = this.copyFromForm(this.editProperties); + this.userService.updateUser(user).pipe( + catchError((err: ErrorResult) => { + this.error = true; + this.success = false; + this.errorResult = err; + return []; + }) + ).subscribe(userInfo=>{ + this.error=false; + this.success=true; + this.errorResult=null; + this.result = userInfo; + this.editMode = false; + }); + + } + + +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.html b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.html new file mode 100644 index 000000000..77251b72c --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.html @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Action
{{user.user_id}}{{user.full_name}}{{user.email}}{{user.timestamp_last_login | date:'yyyy-MM-ddTHH:mm:ss'}}{{user.timestamp_account_creation | date : 'yyyy-MM-ddTHH:mm:ss'}}{{user.timestamp_last_password_change| date : 'yyyy-MM-ddTHH:mm:ss'}} + +    +    + +
+ +
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.scss b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.scss new file mode 100644 index 000000000..573c9ef45 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.scss @@ -0,0 +1,19 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.spec.ts new file mode 100644 index 000000000..c32bd39c3 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.spec.ts @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManageUsersListComponent } from './manage-users-list.component'; + +describe('ManageUsersListComponent', () => { + let component: ManageUsersListComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ManageUsersListComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ManageUsersListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.ts new file mode 100644 index 000000000..7c9d7b107 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.ts @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {Component, OnInit, Input, OnDestroy} from '@angular/core'; +import {TranslateService} from "@ngx-translate/core"; +import {UserService} from "../../../../services/user.service"; +import {UserInfo} from "../../../../model/user-info"; +import {EntityService} from "../../../../model/entity-service"; +import {Observable, of} from "rxjs"; +import {PagedResult} from "../../../../model/paged-result"; + +@Component({ + selector: 'app-manage-users-list', + templateUrl: './manage-users-list.component.html', + styleUrls: ['./manage-users-list.component.scss'] +}) +export class ManageUsersListComponent implements OnInit { + + @Input() heads: any; + service : EntityService; + sortField = ["user_id"]; + sortOrder = "asc"; + + + constructor(private translator: TranslateService, private userService : UserService) { + this.service = function (searchTerm: string, offset: number, limit: number, orderBy: string[], order: string) : Observable> { + console.log("Retrieving data " + searchTerm + "," + offset + "," + limit + "," + orderBy + "," + order); + return userService.query(searchTerm, offset, limit, orderBy, order); + } + + } + + ngOnInit(): void { + this.heads = {}; + // We need to wait for the translator initialization and use the init key as step in. + this.translator.get('init').subscribe(() => { + // Only table headings for small columns that use icons + for (let suffix of ['validated', 'locked', 'password_change_required']) { + this.heads[suffix] = this.translator.instant('users.attributes.' + suffix); + } + }); + } + + + changeSortOrder(order:string) { + if (this.sortOrder!=order) { + this.sortOrder = order; + } + } + + private compareArrays(a1: string[], a2: string[]) { + let i = a1.length; + while (i--) { + if (a1[i] !== a2[i]) return false; + } + return true + } + + sortCheck(fieldArray:string[]) { + return this.compareArrays(this.sortField, fieldArray); + } + + isAscending() : boolean { + return this.sortOrder == "asc"; + } + + + + + + + + + +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.html b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.html new file mode 100644 index 000000000..6cc327424 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.html @@ -0,0 +1,50 @@ +

Roles

+ + + + + + + + + + + + + + + +
RoleScopeAssign
+ {{baseRole.application_id}} + +
+
+
+ + +

Repository Roles

+ + + + + + + + + + + + + + +
Repository{{templateRole.name}}
{{res.key}} +
+ +
+
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.scss b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.spec.ts new file mode 100644 index 000000000..b53258463 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManageUsersRolesComponent } from './manage-users-roles.component'; + +describe('ManageUsersRolesComponent', () => { + let component: ManageUsersRolesComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ManageUsersRolesComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ManageUsersRolesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.ts new file mode 100644 index 000000000..26de0d8e9 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.ts @@ -0,0 +1,155 @@ +import { Component, OnInit } from '@angular/core'; +import { Role } from '@app/model/role'; +import {UserService} from "@app/services/user.service"; +import {ActivatedRoute} from "@angular/router"; +import {filter, map, switchMap} from "rxjs/operators"; +import {RoleTree} from "@app/model/role-tree"; +import {RoleService} from "@app/services/role.service"; +import {RoleTemplate} from "@app/model/role-template"; +import {Observable} from "rxjs"; +import {Util} from "@app/modules/shared/shared.module"; + +@Component({ + selector: 'app-manage-users-roles', + templateUrl: './manage-users-roles.component.html', + styleUrls: ['./manage-users-roles.component.scss'] +}) +export class ManageUsersRolesComponent implements OnInit { + + baseRoles : Array + guest: Role + registered: Role + // Map of (resource, [roles]) + templateRoleInstances: Map> + templateRoles$: Observable; + + constructor(private route : ActivatedRoute, private userService : UserService, private roleService : RoleService) { + this.route.params.pipe( + map(params => params.userid), filter(userid => userid!=null), switchMap(userid => userService.userRoleTree(userid))).subscribe(roleTree => { + this.parseRoleTree(roleTree); + }); + + } + + ngOnInit(): void { + this.templateRoles$ = this.roleService.getTemplates(); + } + + private parseRoleTree(roleTree:RoleTree): void { + let roleTable = []; + for(let rootRole of roleTree.root_roles) { + roleTable = this.recurseRoleTree(rootRole, roleTable, 0); + } + this.baseRoles = roleTable; + let templateMap : Map> = new Map>(); + for (let rootRole of roleTree.root_roles) { + templateMap = this.recurseTemplates(rootRole, templateMap, 0); + } + this.templateRoleInstances = templateMap; + } + + private recurseRoleTree(role:Role, roles : Array, level:number) : Array { + if (role.id=='guest') { + this.guest = role; + } else if (role.id=='registered-user') { + this.registered = role; + } + role.enabled=true; + let newLevel; + if (!role.template_instance && role.assignable) { + role.level=level + roles.push(role); + newLevel = level+1; + } else { + newLevel = level; + } + for(let childRole of role.children) { + roles = this.recurseRoleTree(childRole, roles, newLevel); + } + return roles; + } + + private recurseTemplates(role:Role, roles : Map>, level:number) : Map> { + role.enabled=true; + if (role.template_instance && role.assignable) { + role.level=level + let roleList = roles.get(role.resource) + if (roleList==null) { + roleList = [] + } + roleList.push(role); + roles.set(role.resource, roleList); + } + for(let childRole of role.children) { + roles = this.recurseTemplates(childRole, roles, level+1); + } + return roles; + } + + getRoleContent(role:Role) : string { + let level = role.level + let result = ""; + for(let _i=0; _i "; + } + if (role.child) { + return result + role.name; + } else { + return ""+result+role.name+"" + } + } + + changeBaseAssignment(role : Role, event) { + let cLevel=-1 + let assignStatus; + if (role.id==this.guest.id) { + if (role.assigned) { + for (let cRole of this.baseRoles) { + if (cRole.id != this.guest.id) { + cRole.assigned = false; + cRole.enabled=true; + } + } + role.enabled = false; + } + } else { + this.guest.enabled = true; + for (let cRole of this.baseRoles) { + if (cRole.id == role.id) { + console.log("Value: " + cRole.assigned); + cLevel = cRole.level; + assignStatus = cRole.assigned; + if (assignStatus) { + this.guest.assigned = false; + } else { + if (!this.baseRoles.find(role=>role.assigned)) { + this.guest.assigned=true; + } + } + } else { + console.log("Level " + cLevel); + if (cLevel >= 0 && cLevel < cRole.level) { + if (assignStatus) { + cRole.assigned = true; + cRole.enabled = false; + } else { + cRole.enabled = true; + } + } else if (cLevel >= 0) { + break; + } + } + } + } + } + + changeInstAssignment(role : Role, event) { + console.log("Change " + role.id); + console.log("Assignment changed "+JSON.stringify(event)); + console.log("Event target "+event.target); + } + + getInstanceContent(template:RoleTemplate, roles:Array) : Role { + return roles.find(role=>role.model_id==template.id) + } +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.html b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.html new file mode 100644 index 000000000..d5c5b420c --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.html @@ -0,0 +1,35 @@ + + + + + \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.scss b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.scss new file mode 100644 index 000000000..573c9ef45 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.scss @@ -0,0 +1,19 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.spec.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.spec.ts new file mode 100644 index 000000000..9e991b454 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.spec.ts @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManageUsersComponent } from './manage-users.component'; + +describe('ManageUsersComponent', () => { + let component: ManageUsersComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ManageUsersComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ManageUsersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.ts new file mode 100644 index 000000000..dd72616bb --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.ts @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-manage-users', + templateUrl: './manage-users.component.html', + styleUrls: ['./manage-users.component.scss'] +}) +export class ManageUsersComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/shared.module.ts b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/shared.module.ts index cf7ef71f7..0ff9025b3 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/shared.module.ts +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/shared.module.ts @@ -16,8 +16,8 @@ * under the License. */ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; import {PaginatedEntitiesComponent} from "./paginated-entities/paginated-entities.component"; import {SortedTableHeaderComponent} from "./sorted-table-header/sorted-table-header.component"; import {SortedTableHeaderRowComponent} from "./sorted-table-header-row/sorted-table-header-row.component"; @@ -29,42 +29,62 @@ import {TranslateHttpLoader} from "@ngx-translate/http-loader"; import {RouterModule} from "@angular/router"; - @NgModule({ - declarations: [ - PaginatedEntitiesComponent, - SortedTableHeaderComponent, - SortedTableHeaderRowComponent - ], - exports: [ - CommonModule, - RouterModule, - TranslateModule, - NgbPaginationModule, - NgbTooltipModule, - PaginatedEntitiesComponent, - SortedTableHeaderComponent, - SortedTableHeaderRowComponent - ], - imports: [ - CommonModule, - RouterModule, - NgbPaginationModule, - NgbTooltipModule, - TranslateModule.forChild({ - compiler: { - provide: TranslateCompiler, - useClass: TranslateMessageFormatCompiler - }, - loader: { - provide: TranslateLoader, - useFactory: httpTranslateLoader, - deps: [HttpClient] - } - }), - ] + declarations: [ + PaginatedEntitiesComponent, + SortedTableHeaderComponent, + SortedTableHeaderRowComponent + ], + exports: [ + CommonModule, + RouterModule, + TranslateModule, + NgbPaginationModule, + NgbTooltipModule, + PaginatedEntitiesComponent, + SortedTableHeaderComponent, + SortedTableHeaderRowComponent + ], + imports: [ + CommonModule, + RouterModule, + NgbPaginationModule, + NgbTooltipModule, + TranslateModule.forChild({ + compiler: { + provide: TranslateCompiler, + useClass: TranslateMessageFormatCompiler + }, + loader: { + provide: TranslateLoader, + useFactory: httpTranslateLoader, + deps: [HttpClient] + } + }), + ] }) -export class SharedModule { } +export class SharedModule { +} + export function httpTranslateLoader(http: HttpClient) { - return new TranslateHttpLoader(http); + return new TranslateHttpLoader(http); +} + +export const Util = { + deepCopy(src: Object, dst: Object) { + Object.keys(src).forEach((key, idx) => { + let srcEl = src[key]; + if (typeof (srcEl) == 'object') { + let dstEl; + if (!dst.hasOwnProperty(key)) { + dst[key] = {} + } + dstEl = dst[key]; + this.deepCopy(srcEl, dstEl); + } else { + // console.debug("setting " + key + " = " + srcEl); + dst[key] = srcEl; + } + }); + } } \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/sidemenu/sidemenu.component.html b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/sidemenu/sidemenu.component.html index c312cfc38..e147479c5 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/sidemenu/sidemenu.component.html +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/sidemenu/sidemenu.component.html @@ -56,11 +56,11 @@