],
"scripts": [
"node_modules/jquery/dist/jquery.js",
+ "node_modules/popper.js/dist/umd/popper.min.js",
"node_modules/bootstrap/dist/js/bootstrap.js",
"src/assets/params/js/index.js"
]
"ts-pnp": "^1.1.6"
}
},
+ "popper.js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
+ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="
+ },
"portfinder": {
"version": "1.0.28",
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
"bootstrap": "^4.5.0",
"flag-icon-css": "^3.5.0",
"jquery": "^3.5.1",
+ "popper.js": "^1.16.1",
"rxjs": "~6.6.3",
"service": "^0.1.4",
"tslib": "^2.0.0",
{ path: 'users', component: ManageUsersComponent,
children: [
{path: 'list', component: ManageUsersListComponent},
- {path: 'add', component: ManageUsersAddComponent}
+ {path: 'add', component: ManageUsersAddComponent},
+ {path: '', redirectTo:'list', pathMatch:'full'}
]
},
{ path: 'roles', component: ManageRolesComponent },
{ path: 'config', component: SecurityConfigurationComponent},
- { path: '', component: ManageUsersComponent }
]
},
{ path: 'contact', component: ContactComponent },
import { SecurityConfigurationComponent } from './modules/user/security-configuration/security-configuration.component';
import { ManageUsersListComponent } from './modules/user/users/manage-users-list/manage-users-list.component';
import { ManageUsersAddComponent } from './modules/user/users/manage-users-add/manage-users-add.component';
+import { EnableTooltipDirective } from './directives/enable-tooltip.directive';
@NgModule({
SecurityConfigurationComponent,
ManageUsersListComponent,
ManageUsersAddComponent,
+ EnableTooltipDirective,
],
--- /dev/null
+/*
+ * 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 { EnableTooltipDirective } from './enable-tooltip.directive';
+
+describe('EnableTooltipDirective', () => {
+ it('should create an instance', () => {
+ const directive = new EnableTooltipDirective();
+ expect(directive).toBeTruthy();
+ });
+});
--- /dev/null
+/*
+ * 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 {AfterViewChecked, AfterViewInit, Directive, ElementRef, OnInit} from '@angular/core';
+
+declare var jQuery:any;
+@Directive({
+ selector: '[appEnableTooltip]'
+})
+export class EnableTooltipDirective implements AfterViewInit {
+
+
+ constructor() { }
+
+ ngAfterViewInit(): void {
+ jQuery('[data-toggle="tooltip"]').tooltip({container: 'body', html: true});
+ }
+}
-->
<nav class="nav flex-column nav-pills " role="tablist" aria-orientation="vertical">
- <div class="nav flex-column nav-pills" appNavSubgroup role="tablist" aria-orientation="vertical"
+ <div class="nav flex-column nav-pills" role="tablist" aria-orientation="vertical"
[appViewPermission]="perms.menu.repo.section">
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">{{'sidemenu.repo.section'|translate}}</a>
role="tab" aria-controls="v-pills-browse" aria-selected="false"
[appViewPermission]="perms.menu.repo.upload">{{'sidemenu.repo.upload'|translate}}</a>
</div>
- <div class="nav flex-column nav-pills" appNavSubgroup aria-orientation="vertical" role="tablist"
+ <div class="nav flex-column nav-pills" aria-orientation="vertical" role="tablist"
[appViewPermission]="perms.menu.admin.section">
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true"
role="tab" aria-controls="v-pills-home" aria-selected="false">{{'sidemenu.admin.section'|translate}}</a>
- <a class="nav-link my-0 py-0" id="admin-repos" routerLink="/admin/repositories" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="admin-repos" routerLink="/admin/repositories" routerLinkActive="active" data-toggle="pill"
[appViewPermission]="perms.menu.admin.config" role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.admin.repositories'|translate}}</a>
- <a class="nav-link my-0 py-0" id="admin-groups" routerLink="/admin/repositorygroups" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="admin-groups" routerLink="/admin/repositorygroups" routerLinkActive="active" data-toggle="pill"
[appViewPermission]="perms.menu.admin.config" role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.admin.repositorygroups'|translate}}</a>
- <a class="nav-link my-0 py-0" id="admin-proxy-conn" routerLink="/admin/proxy" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="admin-proxy-conn" routerLink="/admin/proxy" routerLinkActive="active" data-toggle="pill"
[appViewPermission]="perms.menu.admin.config" role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.admin.proxy'|translate}}</a>
- <a class="nav-link my-0 py-0" id="admin-network-proxy" routerLink="/admin/network" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="admin-network-proxy" routerLink="/admin/network" routerLinkActive="active" data-toggle="pill"
[appViewPermission]="perms.menu.admin.config" role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.admin.network'|translate}}</a>
- <a class="nav-link my-0 py-0" id="admin-repo-scan" routerLink="/admin/scanning" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="admin-repo-scan" routerLink="/admin/scanning" routerLinkActive="active" data-toggle="pill"
[appViewPermission]="perms.menu.admin.config" role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.admin.scanning'|translate}}</a>
- <a class="nav-link my-0 py-0" id="admin-runtime-configuration" routerLink="/admin/runtimeconfig" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="admin-runtime-configuration" routerLink="/admin/runtimeconfig" routerLinkActive="active" data-toggle="pill"
[appViewPermission]="perms.menu.admin.config" role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.admin.runtimeconfig'|translate}}</a>
- <a class="nav-link my-0 py-0" id="admin-status" routerLink="/admin/status" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="admin-status" routerLink="/admin/status" routerLinkActive="active" data-toggle="pill"
[appViewPermission]="perms.menu.admin.status" role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.admin.status'|translate}}</a>
- <a class="nav-link my-0 py-0" id="admin-reports" routerLink="/admin/reports" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="admin-reports" routerLink="/admin/reports" routerLinkActive="active" data-toggle="pill"
[appViewPermission]="perms.menu.admin.reports" role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.admin.reports'|translate}}</a>
</div>
- <div class="nav flex-column nav-pills" appNavSubgroup [appViewPermission]="perms.menu.user.section">
+ <div class="nav flex-column nav-pills" [appViewPermission]="perms.menu.user.section">
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true" data-toggle="pill"
role="tab" aria-controls="v-pills-home" aria-selected="false">{{'sidemenu.user.section'|translate}}</a>
- <a class="nav-link my-0 py-0" id="users-manage" routerLink="/user/users" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="users-manage" routerLink="/user/users" routerLinkActive="active" data-toggle="pill"
role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.user.users'|translate}}</a>
- <a class="nav-link my-0 py-0" id="users-roles" routerLink="/user/roles" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="users-roles" routerLink="/user/roles" routerLinkActive="active" data-toggle="pill"
role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.user.roles'|translate}}</a>
- <a class="nav-link my-0 py-0" id="users-configuration" routerLink="/user/config" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="users-configuration" routerLink="/user/config" routerLinkActive="active" data-toggle="pill"
role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.user.config'|translate}}</a>
</div>
- <div class="nav flex-column nav-pills" appNavSubgroup>
+ <div class="nav flex-column nav-pills" >
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true" data-toggle="pill"
role="tab" aria-controls="v-pills-home" aria-selected="false">{{'sidemenu.doc.section'|translate}}</a>
- <a class="nav-link my-0 py-0" id="doc-userdoc" routerLink="/doc/userguide" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="doc-userdoc" routerLink="/doc/userguide" routerLinkActive="active" data-toggle="pill"
role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.doc.userguide'|translate}}</a>
- <a class="nav-link my-0 py-0" id="doc-rest-api" routerLink="/user/restapi" data-toggle="pill"
+ <a class="nav-link my-0 py-0" id="doc-rest-api" routerLink="/user/restapi" routerLinkActive="active" data-toggle="pill"
role="tab" aria-controls="v-pills-browse" aria-selected="false">{{'sidemenu.doc.restapi'|translate}}</a>
</div>
</nav>
<ul class="nav nav-tabs">
<li class="nav-item">
- <a class="nav-link" routerLink="/user/users/list" href="#">{{'users.list.head' | translate}}</a>
+ <a class="nav-link" routerLink="/user/users/list" routerLinkActive="active" href="#">{{'users.list.head' | translate}}</a>
</li>
<li class="nav-item">
- <a class="nav-link" routerLink="/user/users/add" href="#">{{'users.add.head' |translate }}</a>
+ <a class="nav-link" routerLink="/user/users/add" routerLinkActive="active" href="#">{{'users.add.head' |translate }}</a>
</li>
</ul>
~ under the License.
-->
-<p>manage-users-list works!</p>
+<form class="mt-3 mb-3">
+ <div class="form-row align-items-center">
+ <div class="col-lg-4 col-md-2 col-sm-1">
+ <label class="sr-only" for="searchQuery">{{'users.list.search' |translate}}</label>
+ <input type="text" class="form-control" id="searchQuery" placeholder="Search" data-toggle="tooltip"
+ data-placement="top" title="SEARCHHH">
+ </div>
+ <div class="col-auto">
+ <button type="submit" class="btn btn-primary">{{'search.button'|translate}}</button>
+ </div>
+ </div>
+
+
+</form>
+
+<table class="table" appEnableTooltip>
+ <thead class="thead-light">
+ <tr>
+ <th scope="col">{{'users.list.table.head.id' | translate}}</th>
+ <th scope="col">{{'users.list.table.head.user_id' | translate}}</th>
+ <th scope="col">{{'users.list.table.head.fullName' | translate}}</th>
+ <th scope="col">{{'users.list.table.head.email' | translate}}</th>
+ <th scope="col"><span class="fas fa-check" data-toggle="tooltip" data-placement="top"
+ [attr.data-original-title]="heads.validated" [attr.aria-label]="heads.validated"></span>
+ </th>
+ <th scope="col"><span class="fas fa-lock" data-toggle="tooltip" data-placement="top"
+ [attr.data-original-title]="heads.locked" [attr.aria-label]="heads.locked"></span></th>
+ <th scope="col"><span class="fa fa-chevron-circle-right" data-toggle="tooltip" data-placement="top"
+ [attr.data-original-title]="heads.pwchange" [attr.aria-label]="heads.pwchange"></span>
+ </th>
+ <th scope="col">{{'users.list.table.head.lastLogin' | translate}}</th>
+ <th scope="col">{{'users.list.table.head.created' | translate}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>
+</table>
* under the License.
*/
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, Input } from '@angular/core';
+import {TranslateService} from "@ngx-translate/core";
+import {AppComponent} from "../../../../app.component";
+import {UserService} from "../../../../services/user.service";
@Component({
selector: 'app-manage-users-list',
styleUrls: ['./manage-users-list.component.scss']
})
export class ManageUsersListComponent implements OnInit {
+ @Input() heads: any;
- constructor() { }
+ constructor(private translator: TranslateService, private userService : UserService) { }
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', 'pwchange']) {
+ this.heads[suffix] = this.translator.instant('users.list.table.head.' + suffix);
+ }
+ });
}
}
{
+ "init": "Initalize",
"login": {
"title": "Login to Archiva",
"password": "Password",
},
"api" : {
"rb.auth.invalid_credentials": "Invalid credentials given"
+ },
+ "users": {
+ "list": {
+ "head": "List Users",
+ "table":{
+ "head": {
+ "id": "ID",
+ "user_id": "User Identifier",
+ "email": "Email",
+ "fullName": "Name",
+ "validated": "User Validated",
+ "locked": "User Locked",
+ "pwchange": "Password Change Required",
+ "lastLogin": "Last Login",
+ "created": "Created"
+ }
+ }
+ },
+ "add": {
+ "head": "Add User"
+ }
+ },
+ "search": {
+ "button": "Search"
}
}
\ No newline at end of file