rsanchez
2017-06-07 89a0646d18da6f3290a883121e38f4086a6fb37e
#3531 fea - Added acces to packs from license type, organizatins and
applications listing
16 files modified
changed files
securis/src/main/java/net/curisit/securis/services/PackResource.java patch | view | blame | history
securis/src/main/webapp/sql_update.sql patch | view | blame | history
securis/src/main/webapp/src/app/forms/license.form.component.ts patch | view | blame | history
securis/src/main/webapp/src/app/forms/license.form.html patch | view | blame | history
securis/src/main/webapp/src/app/listing/application.list.component.html patch | view | blame | history
securis/src/main/webapp/src/app/listing/application.list.component.ts patch | view | blame | history
securis/src/main/webapp/src/app/listing/license.list.component.html patch | view | blame | history
securis/src/main/webapp/src/app/listing/license.list.component.ts patch | view | blame | history
securis/src/main/webapp/src/app/listing/licensetype.list.component.html patch | view | blame | history
securis/src/main/webapp/src/app/listing/licensetype.list.component.ts patch | view | blame | history
securis/src/main/webapp/src/app/listing/organization.list.component.html patch | view | blame | history
securis/src/main/webapp/src/app/listing/organization.list.component.ts patch | view | blame | history
securis/src/main/webapp/src/app/listing/pack.list.component.html patch | view | blame | history
securis/src/main/webapp/src/app/listing/pack.list.component.ts patch | view | blame | history
securis/src/main/webapp/src/app/resources/base.ts patch | view | blame | history
securis/src/main/webapp/src/app/resources/packs.ts patch | view | blame | history
securis/src/main/java/net/curisit/securis/services/PackResource.java
....@@ -1,6 +1,7 @@
11 package net.curisit.securis.services;
22
33 import java.security.Principal;
4
+import java.util.ArrayList;
45 import java.util.Date;
56 import java.util.HashSet;
67 import java.util.List;
....@@ -21,8 +22,10 @@
2122 import javax.ws.rs.Produces;
2223 import javax.ws.rs.core.Context;
2324 import javax.ws.rs.core.MediaType;
25
+import javax.ws.rs.core.MultivaluedMap;
2426 import javax.ws.rs.core.Response;
2527 import javax.ws.rs.core.Response.Status;
28
+import javax.ws.rs.core.UriInfo;
2629
2730 import org.apache.logging.log4j.LogManager;
2831 import org.apache.logging.log4j.Logger;
....@@ -80,33 +83,63 @@
8083 @Path("/")
8184 @Securable
8285 @Produces({ MediaType.APPLICATION_JSON })
83
- public Response index(@Context BasicSecurityContext bsc) {
86
+ public Response index(@Context UriInfo uriInfo, @Context BasicSecurityContext bsc) {
8487 LOG.info("Getting packs list ");
88
+ MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
8589
8690 // EntityManager em = emProvider.get();
8791 em.clear();
8892
93
+ TypedQuery<Pack> q = createQuery(queryParams, bsc);
94
+ if (q == null) {
95
+ return Response.ok().build();
96
+ }
97
+
98
+ List<Pack> list = q.getResultList();
99
+
100
+ return Response.ok(list).build();
101
+ }
102
+
103
+ private String generateWhereFromParams(boolean addWhere, MultivaluedMap<String, String> queryParams) {
104
+ List<String> conditions = new ArrayList<>();
105
+ if (queryParams.containsKey("organizationId")) {
106
+ conditions.add(String.format("pa.organization.id = %s", queryParams.getFirst("organizationId")));
107
+ }
108
+ if (queryParams.containsKey("applicationId")) {
109
+ conditions.add(String.format("pa.licenseType.application.id = %s", queryParams.getFirst("applicationId")));
110
+ }
111
+ if (queryParams.containsKey("licenseTypeId")) {
112
+ conditions.add(String.format("pa.licenseType.id = %s", queryParams.getFirst("licenseTypeId")));
113
+ }
114
+ String connector = addWhere ? " where " : " and ";
115
+ return (conditions.isEmpty() ? "" : connector) + String.join(" and ", conditions);
116
+ }
117
+
118
+ private TypedQuery<Pack> createQuery(MultivaluedMap<String, String> queryParams, BasicSecurityContext bsc) {
89119 TypedQuery<Pack> q;
120
+ String hql = "SELECT pa FROM Pack pa";
90121 if (bsc.isUserInRole(BasicSecurityContext.ROL_ADMIN)) {
91
- LOG.info("Getting all packs for user: " + bsc.getUserPrincipal());
92
- q = em.createNamedQuery("list-packs", Pack.class);
122
+ hql += generateWhereFromParams(true, queryParams);
123
+ q = em.createQuery(hql, Pack.class);
93124 } else {
94125 if (bsc.getApplicationsIds() == null || bsc.getApplicationsIds().isEmpty()) {
95
- return Response.ok().build();
126
+ return null;
96127 }
97128 if (bsc.getOrganizationsIds() == null || bsc.getOrganizationsIds().isEmpty()) {
98
- q = em.createNamedQuery("list-packs-by-apps", Pack.class);
129
+ hql += " where pa.licenseType.application.id in :list_ids_app ";
99130 } else {
100
- q = em.createNamedQuery("list-packs-by-orgs-apps", Pack.class);
131
+ hql += " where pa.organization.id in :list_ids_org and pa.licenseType.application.id in :list_ids_app ";
132
+ }
133
+ hql += generateWhereFromParams(false, queryParams);
134
+ q = em.createQuery(hql, Pack.class);
135
+ if (hql.contains("list_ids_org")) {
101136 q.setParameter("list_ids_org", bsc.getOrganizationsIds());
102137 }
103138 q.setParameter("list_ids_app", bsc.getApplicationsIds());
104139 LOG.info("Getting packs from orgs: {} and apps: {}", bsc.getOrganizationsIds(), bsc.getApplicationsIds());
105140 }
106141
107
- List<Pack> list = q.getResultList();
108
-
109
- return Response.ok(list).build();
142
+ return q;
110143 }
111144
112145 private Response generateErrorUnathorizedAccess(Pack pack, Principal user) {
securis/src/main/webapp/sql_update.sql
....@@ -7,4 +7,5 @@
77 application_id INT NOT NULL,
88 PRIMARY KEY (username, application_id));
99
10
+update user set roles = 128 where username = '_client';
1011
securis/src/main/webapp/src/app/forms/license.form.component.ts
....@@ -111,6 +111,9 @@
111111 this.router.navigate([`packs/${this.pack.id}/licenses`]);
112112 }
113113
114
+ editPack(): void {
115
+ this.router.navigate([`packs/edit/${this.pack.id}`]);
116
+ }
114117
115118 ngAfterViewInit(): void {
116119 this.init();
securis/src/main/webapp/src/app/forms/license.form.html
....@@ -8,7 +8,8 @@
88 <button md-icon-button (click)="save()"><md-icon>save</md-icon></button>
99 <md-toolbar-row class="inner-padding" *ngIf="!!pack" >
1010 <div>
11
- <span i18n>Pack</span>: {{pack.code}}
11
+ <span i18n>Pack</span>: {{pack.code}}
12
+ <button md-icon-button (click)="editPack()"><md-icon>edit</md-icon></button>
1213 </div>
1314 <div class="inner-padding" flex="70" style="margin-left: 10px;" layout-align="start center" layout="row">
1415 <md-chip selected [mdTooltip]="$L.get('field.application_name')" color="primary">{{pack.application_name}} </md-chip>
securis/src/main/webapp/src/app/listing/application.list.component.html
....@@ -26,6 +26,9 @@
2626 <ng-template tdDataTableTemplate="menu" let-row="row" let-index="index">
2727 <div layout="row" layout-align="end center">
2828 <button md-icon-button (click)="edit(row.id)" color="primary"><md-icon>edit</md-icon></button>
29
+ <button md-icon-button (click)="showRelatedPacks(row)" color="accent" [mdTooltip]="$L.get('Show related packs')">
30
+ <md-icon>arrow_forward</md-icon>
31
+ </button>
2932 </div>
3033 </ng-template>
3134 </td-data-table>
securis/src/main/webapp/src/app/listing/application.list.component.ts
....@@ -69,8 +69,8 @@
6969 }
7070
7171
72
- packAction(action: any) {
73
- console.log(action.command);
72
+ showRelatedPacks(app : any) : void {
73
+ this.router.navigate(['packs/'], {queryParams: {applicationId: app.id, name: app.name}});
7474 }
7575
7676 isActionAvailable(pack : any) : boolean {
securis/src/main/webapp/src/app/listing/license.list.component.html
....@@ -5,6 +5,7 @@
55 <md-icon>arrow_back</md-icon>
66 </button>
77 <span class="md-title" i18n>Licenses for pack</span>: {{pack?.code}}
8
+ <button md-icon-button (click)="editPack()"><md-icon>edit</md-icon></button>
89 </span>
910 <span class="push-left-sm" *ngIf="filteredItems < data.length">
1011 <span class="md-body-1">{{filteredItems}} of {{data.length}} packs filtered</span>
securis/src/main/webapp/src/app/listing/license.list.component.ts
....@@ -111,8 +111,13 @@
111111
112112 goBack() : void {
113113 this.router.navigate([`packs`]);
114
+ }
115
+
116
+ editPack(): void {
117
+ this.router.navigate([`packs/edit/${this.pack.id}`]);
114118 }
115119
120
+
116121 isLicenseExpired(lic: any): boolean {
117122 return lic.expiration_date < (new Date().getTime());
118123 }
securis/src/main/webapp/src/app/listing/licensetype.list.component.html
....@@ -26,6 +26,9 @@
2626 <ng-template tdDataTableTemplate="menu" let-row="row" let-index="index">
2727 <div layout="row" layout-align="end center">
2828 <button md-icon-button (click)="edit(row.id)" color="primary"><md-icon>edit</md-icon></button>
29
+ <button md-icon-button (click)="showRelatedPacks(row)" color="accent" [mdTooltip]="$L.get('Show related packs')">
30
+ <md-icon>arrow_forward</md-icon>
31
+ </button>
2932 </div>
3033 </ng-template>
3134 </td-data-table>
securis/src/main/webapp/src/app/listing/licensetype.list.component.ts
....@@ -66,8 +66,8 @@
6666 }
6767
6868
69
- packAction(action: any) {
70
- console.log(action.command);
69
+ showRelatedPacks(lt : any) : void {
70
+ this.router.navigate(['packs/'], {queryParams: {licenseTypeId: lt.id, name: lt.name}});
7171 }
7272
7373 isActionAvailable(pack : any) : boolean {
securis/src/main/webapp/src/app/listing/organization.list.component.html
....@@ -26,6 +26,9 @@
2626 <ng-template tdDataTableTemplate="menu" let-row="row" let-index="index">
2727 <div layout="row" layout-align="end center">
2828 <button md-icon-button (click)="edit(row.id)" color="primary"><md-icon>edit</md-icon></button>
29
+ <button md-icon-button (click)="showRelatedPacks(row)" color="accent" [mdTooltip]="$L.get('Show related packs')">
30
+ <md-icon>arrow_forward</md-icon>
31
+ </button>
2932 </div>
3033 </ng-template>
3134 </td-data-table>
securis/src/main/webapp/src/app/listing/organization.list.component.ts
....@@ -64,12 +64,11 @@
6464 );
6565 }
6666
67
-
68
- packAction(action: any) {
69
- console.log(action.command);
67
+ showRelatedPacks(org : any) : void {
68
+ this.router.navigate(['packs/'], {queryParams: {organizationId: org.id, name: org.name}});
7069 }
7170
72
- isActionAvailable(pack : any) : boolean {
71
+ isActionAvailable(org : any) : boolean {
7372 return true;
7473 }
7574
securis/src/main/webapp/src/app/listing/pack.list.component.html
....@@ -1,5 +1,8 @@
11 <td-layout-card-over cardWidth="90">
22 <md-toolbar role="toolbar" class="mat-secondary">
3
+ <button *ngIf="!!prevUrl" md-icon-button (click)="goBack()" color="accent">
4
+ <md-icon>arrow_back</md-icon>
5
+ </button>
36 <span class="push-left-sm">
47 <span class="md-title" i18n>Packs</span>
58 </span>
....@@ -11,6 +14,15 @@
1114 <button md-mini-fab color="accent" (click)="create()" [mdTooltip]="$L.get('Create a new pack')">
1215 <md-icon>add</md-icon>
1316 </button>
17
+ <md-toolbar-row *ngIf="!!filter_description">
18
+ <md-chip-list>
19
+ <md-chip selected color="accent">{{filter_description}} </md-chip>
20
+ </md-chip-list>
21
+ <button md-icon-button (click)="reload()" >
22
+ <md-icon>cancel</md-icon>
23
+ </button>
24
+ <span flex></span>
25
+ </md-toolbar-row>
1426 </md-toolbar>
1527 <div flex="84" layout-align="center end" layout="column">
1628 <td-data-table
securis/src/main/webapp/src/app/listing/pack.list.component.ts
....@@ -1,4 +1,5 @@
11 import { Router, ActivatedRoute } from '@angular/router';
2
+import { Location } from '@angular/common';
23 import { ToastsManager } from 'ng2-toastr/ng2-toastr';
34 import { MdDialog, MdDialogConfig } from '@angular/material';
45 import {
....@@ -11,12 +12,12 @@
1112 import { IPageChangeEvent } from '@covalent/core';
1213 import { Component, ViewChild, AfterViewInit } from '@angular/core';
1314 import { TdMediaService } from '@covalent/core';
14
-import { PacksService, PACK_ACTIONS } from '../resources/packs';
15
+import { PacksService, PACK_ACTIONS, PacksFilter } from '../resources/packs';
1516 import { PackFormComponent } from '../forms/pack.form.component';
1617 import { LocaleService } from '../common/i18n';
1718 import { ListingBase } from './base';
1819
19
-
20
+/**
2021 var pack_example = {
2122 id: 7,
2223 code: 'DX250000',
....@@ -45,7 +46,7 @@
4546 preactivation_valid_period: 70,
4647 renew_valid_period: 0,
4748 }
48
-
49
+*/
4950 @Component({
5051 selector: 'pack-list',
5152 templateUrl: 'src/app/listing/pack.list.component.html'
....@@ -63,6 +64,8 @@
6364 ];
6465
6566 pack_menu_options = PACK_ACTIONS;
67
+ filter_description : string;
68
+ prevUrl : string = null;
6669
6770 constructor(_dataTableService: TdDataTableService,
6871 private media: TdMediaService,
....@@ -76,14 +79,42 @@
7679 super(_dataTableService);
7780 }
7881
79
- reload() : void {
80
- this.packs.get().subscribe(
82
+ reload(filter?: PacksFilter) : void {
83
+ this.prepareFilteredBehavior(filter);
84
+ this.packs.get(filter).subscribe(
8185 (list : any[]) => {
8286 this.data = list;
8387 this.refresh();
8488 },
8589 (err: any) => console.error(err)
8690 );
91
+ }
92
+
93
+ goBack() : void {
94
+ if (this.prevUrl) {
95
+ this.router.navigate([this.prevUrl]);
96
+ }
97
+ }
98
+
99
+ prepareFilteredBehavior(filter: PacksFilter) {
100
+ if (!filter) {
101
+ this.filter_description = '';
102
+ this.prevUrl = null;
103
+ } else {
104
+ if (!!filter.applicationId) {
105
+ this.filter_description = `Application: ${filter.name}`;
106
+ this.prevUrl = 'applications';
107
+ } else if (!!filter.organizationId) {
108
+ this.filter_description = `Organization: ${filter.name}`;
109
+ this.prevUrl = 'organizations';
110
+ } else if (!!filter.licenseTypeId) {
111
+ this.filter_description = `License type: ${filter.name}`;
112
+ this.prevUrl = 'licensetypes';
113
+ } else {
114
+ this.filter_description = '';
115
+ this.prevUrl = null;
116
+ }
117
+ }
87118 }
88119
89120 packAction(action: string, pack: any) {
....@@ -113,10 +144,13 @@
113144 this.sortOrder = sortEvent.order;
114145 this.refresh();
115146 }
116
-
147
+
117148 ngAfterViewInit(): void {
118
- this.reload();
119149 this.media.broadcast();
150
+ this.route.queryParams.subscribe(params => {
151
+ let filter = params as PacksFilter;
152
+ this.reload(filter);
153
+ });
120154 }
121155 }
122
-
156
+
securis/src/main/webapp/src/app/resources/base.ts
....@@ -3,8 +3,8 @@
33 import { Observable } from 'rxjs/Observable';
44 import { Http, RequestOptionsArgs, URLSearchParams } from '@angular/http';
55
6
-class MySearchParams extends URLSearchParams {
7
- constructor(obj : any) {
6
+export class MySearchParams extends URLSearchParams {
7
+ constructor(obj : any = {}) {
88 var searchQuery = Object.keys(obj).map(key => `${key}=${encodeURIComponent(obj[key])}`).join('&');
99 super(searchQuery);
1010 }
securis/src/main/webapp/src/app/resources/packs.ts
....@@ -1,7 +1,7 @@
11 import { Observable } from 'rxjs/Rx';
22 import { Injectable } from '@angular/core';
33 import { Http, RequestOptions } from '@angular/http';
4
-import { SeCurisResourceServices } from './base';
4
+import { SeCurisResourceServices, MySearchParams } from './base';
55 import { LocaleService } from '../common/i18n';
66
77 var pack_example = {
....@@ -31,6 +31,13 @@
3131 organization_name: 'CurisTec',
3232 preactivation_valid_period: 70,
3333 renew_valid_period: 0,
34
+}
35
+
36
+export type PacksFilter = {
37
+ licenseTypeId?: number;
38
+ organizationId?: number;
39
+ applicationId?: number;
40
+ name?: string;
3441 }
3542
3643 export const PACK_STATUS = {
....@@ -79,6 +86,13 @@
7986 super($L, http, 'pack');
8087 }
8188
89
+ public get(filter?: PacksFilter) {
90
+ let searchParams = new MySearchParams(filter);
91
+ let url = `${this.resource}/?${searchParams}`;
92
+ console.log(`url: ${url}`);
93
+ return this.http.get(url).map(response => response.json()).catch(err => super.processErrorResponse(err));
94
+ }
95
+
8296 public activate(id: number) {
8397 return super.action(id, "activate");
8498 }