@@ -0,0 +1,12 @@ | |||||
{ | |||||
"Version": "2012-10-17", | |||||
"Statement": [ | |||||
{ | |||||
"Effect": "Allow", | |||||
"Principal": { | |||||
"Service": "eks.amazonaws.com" | |||||
}, | |||||
"Action": "sts:AssumeRole" | |||||
} | |||||
] | |||||
} |
@@ -0,0 +1,14 @@ | |||||
apiVersion: v1 | |||||
kind: Service | |||||
metadata: | |||||
name: eks-br2s-linux-service | |||||
namespace: eks-br2s-app | |||||
labels: | |||||
app: eks-br2s-linux-app | |||||
spec: | |||||
selector: | |||||
app: eks-br2s-linux-app | |||||
ports: | |||||
- protocol: TCP | |||||
port: 80 | |||||
targetPort: 80 |
@@ -0,0 +1,13 @@ | |||||
apiVersion: v1 | |||||
kind: Service | |||||
metadata: | |||||
name: br2s-poc-loadbalancer | |||||
namespace: eks-br2s-app | |||||
spec: | |||||
type: LoadBalancer | |||||
selector: | |||||
app: eks-br2s-linux-app | |||||
ports: | |||||
- protocol: TCP | |||||
port: 80 | |||||
targetPort: 80 |
@@ -0,0 +1,36 @@ | |||||
apiVersion: apps/v1 | |||||
kind: Deployment | |||||
metadata: | |||||
name: eks-br2s-linux-deployment | |||||
namespace: eks-br2s-app | |||||
labels: | |||||
app: eks-br2s-linux-app | |||||
spec: | |||||
replicas: 3 | |||||
selector: | |||||
matchLabels: | |||||
app: eks-br2s-linux-app | |||||
template: | |||||
metadata: | |||||
labels: | |||||
app: eks-br2s-linux-app | |||||
spec: | |||||
affinity: | |||||
nodeAffinity: | |||||
requiredDuringSchedulingIgnoredDuringExecution: | |||||
nodeSelectorTerms: | |||||
- matchExpressions: | |||||
- key: kubernetes.io/arch | |||||
operator: In | |||||
values: | |||||
- amd64 | |||||
- arm64 | |||||
containers: | |||||
- name: br2s-front-end | |||||
image: 834628752744.dkr.ecr.ap-southeast-1.amazonaws.com/acra/br2s-front-end:latest | |||||
ports: | |||||
- name: http | |||||
containerPort: 80 | |||||
imagePullPolicy: Always | |||||
nodeSelector: | |||||
kubernetes.io/os: linux |
@@ -2,6 +2,7 @@ events{} | |||||
http { | http { | ||||
include /etc/nginx/mime.types; | include /etc/nginx/mime.types; | ||||
server { | server { | ||||
listen 80; | listen 80; | ||||
# listen 443; | # listen 443; | ||||
@@ -12,6 +13,27 @@ http { | |||||
server_name localhost; | server_name localhost; | ||||
root /usr/share/nginx/html; | root /usr/share/nginx/html; | ||||
index index.html; | index index.html; | ||||
location /api/registration-name-check/ { | |||||
proxy_pass http://eks-br2s-registration-name-check-service/; | |||||
} | |||||
location /api/registration-name-register/ { | |||||
proxy_pass http://eks-br2s-registration-name-register-service/; | |||||
} | |||||
location /api/registration-payment/ { | |||||
proxy_pass http://eks-br2s-registration-payment-service/; | |||||
} | |||||
location /api/compliance-data-aggregation/ { | |||||
proxy_pass http://eks-br2s-compliance-data-aggregation-service/; | |||||
} | |||||
location /api/compliance-panel/ { | |||||
proxy_pass http://eks-br2s-compliance-panel-service/; | |||||
} | |||||
location / { | location / { | ||||
try_files $uri $uri/ /index.html; | try_files $uri $uri/ /index.html; | ||||
} | } | ||||
@@ -0,0 +1,12 @@ | |||||
{ | |||||
"Version": "2012-10-17", | |||||
"Statement": [ | |||||
{ | |||||
"Effect": "Allow", | |||||
"Principal": { | |||||
"Service": "ec2.amazonaws.com" | |||||
}, | |||||
"Action": "sts:AssumeRole" | |||||
} | |||||
] | |||||
} |
@@ -8,15 +8,17 @@ | |||||
"watch": "ng build --watch --configuration development", | "watch": "ng build --watch --configuration development", | ||||
"test": "ng test", | "test": "ng test", | ||||
"docker-build": "docker build -t b2rs-front-end-image .", | |||||
"docker-tag": "docker tag b2rs-front-end-image:latest 834628752744.dkr.ecr.ap-southeast-1.amazonaws.com/b2rs-front-end-image:latest", | |||||
"docker-push": "docker push 834628752744.dkr.ecr.ap-southeast-1.amazonaws.com/b2rs-front-end-image:latest", | |||||
"docker-build": "docker build -t acra/br2s-front-end .", | |||||
"docker-tag": "docker tag acra/br2s-front-end:latest 834628752744.dkr.ecr.ap-southeast-1.amazonaws.com/acra/br2s-front-end:latest", | |||||
"docker-login": "aws ecr get-login-password | docker login --username AWS --password-stdin 834628752744.dkr.ecr.ap-southeast-1.amazonaws.com", | |||||
"docker-push": "docker push 834628752744.dkr.ecr.ap-southeast-1.amazonaws.com/acra/br2s-front-end:latest", | |||||
"docker-create": "docker run --name b2rs-app-container -d -p 80:80 b2rs-front-end-image", | |||||
"docker-destroy": "docker container rm b2rs-app-container", | |||||
"docker-create": "docker run --name br2s-app-container -d -p 80:80 acra/br2s-front-end", | |||||
"docker-destroy": "docker container rm br2s-app-container", | |||||
"docker-purge": "docker image rm acra/br2s-front-end", | |||||
"docker-start": "docker start b2rs-app-container", | |||||
"docker-stop": "docker stop b2rs-app-container" | |||||
"docker-start": "docker start br2s-app-container", | |||||
"docker-stop": "docker stop br2s-app-container" | |||||
}, | }, | ||||
"private": true, | "private": true, | ||||
"dependencies": { | "dependencies": { | ||||
@@ -1,2 +1,2 @@ | |||||
<app-view-case-details></app-view-case-details> | <app-view-case-details></app-view-case-details> | ||||
<app-select-entities></app-select-entities> | |||||
<app-select-entities *ngIf="panelCandidates.length > 0" [entities]="panelCandidates" (onSelectChange)="toggleSelectedCandidate($event)"></app-select-entities> |
@@ -1,4 +1,6 @@ | |||||
import { Component, OnInit } from '@angular/core'; | |||||
import { Component, EventEmitter, Output, OnInit } from '@angular/core'; | |||||
import { InvestigateBuinessEntityAndIndividualService } from 'src/app/services/investigate-buiness-entity-and-individual.service'; | |||||
import { SelectableEntity } from 'src/app/widgets/select-entities/select-entities.component'; | |||||
@Component({ | @Component({ | ||||
selector: 'app-assign-panel', | selector: 'app-assign-panel', | ||||
@@ -6,10 +8,26 @@ import { Component, OnInit } from '@angular/core'; | |||||
styleUrls: ['./assign-panel.component.scss'] | styleUrls: ['./assign-panel.component.scss'] | ||||
}) | }) | ||||
export class AssignPanelComponent implements OnInit { | export class AssignPanelComponent implements OnInit { | ||||
panelCandidates: Array<SelectableEntity> = []; | |||||
constructor() { } | |||||
@Output() onSelectedCandidatesUpdate: EventEmitter<Array<string>> = new EventEmitter(); | |||||
ngOnInit(): void { | |||||
} | |||||
constructor(investigateBuinessEntityAndIndividualService: InvestigateBuinessEntityAndIndividualService) { | |||||
investigateBuinessEntityAndIndividualService.getPanelCandidates().then(panelCandidates => this.panelCandidates = panelCandidates); | |||||
} | |||||
ngOnInit(): void { | |||||
} | |||||
toggleSelectedCandidate(candidate: SelectableEntity) { | |||||
const selectedCandidate = this.panelCandidates.find(panelCandidate => candidate.id === panelCandidate.id); | |||||
if (selectedCandidate) { | |||||
selectedCandidate.isSelected = candidate.isSelected; | |||||
} | |||||
const selectedIds = this.panelCandidates.filter(candidate => candidate.isSelected).map(candidate => String(candidate.id)); | |||||
this.onSelectedCandidatesUpdate.emit(selectedIds); | |||||
} | |||||
} | } |
@@ -33,6 +33,7 @@ | |||||
<app-assign-panel | <app-assign-panel | ||||
*ngIf="state === 'ASSIGN COMMITTEE'" | *ngIf="state === 'ASSIGN COMMITTEE'" | ||||
(onSelectedCandidatesUpdate)="handleSelectedCandidates($event)" | |||||
></app-assign-panel> | ></app-assign-panel> | ||||
<app-review-non-compliance | <app-review-non-compliance | ||||
@@ -1,4 +1,5 @@ | |||||
import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||
import { InvestigateBuinessEntityAndIndividualService } from 'src/app/services/investigate-buiness-entity-and-individual.service'; | |||||
type State = 'VIEW INITIAL DETAILS'|'ENTER MORE DETAILS'|'ASSIGN COMMITTEE'|'REVIEW NON COMPLIANCE'|'CONCUR COMPLIANCE REVIEW'|'CLOSING REMARKS'|'PREPARE PRELIMINARY LETTER'|'RESPOND TO PRELIMINARY LETTER'; | type State = 'VIEW INITIAL DETAILS'|'ENTER MORE DETAILS'|'ASSIGN COMMITTEE'|'REVIEW NON COMPLIANCE'|'CONCUR COMPLIANCE REVIEW'|'CLOSING REMARKS'|'PREPARE PRELIMINARY LETTER'|'RESPOND TO PRELIMINARY LETTER'; | ||||
type Role = 'Investigator'|'Hod'|'Panel'|'Customer'|'Officer'; | type Role = 'Investigator'|'Hod'|'Panel'|'Customer'|'Officer'; | ||||
@@ -17,6 +18,7 @@ export class InvestigateBusinessEntitiesAndIndividualsComponent implements OnIni | |||||
state: State; | state: State; | ||||
stateHistory: Array<State> = []; | stateHistory: Array<State> = []; | ||||
selectedCandidateIds: Array<string> = []; | |||||
loginRole: Role; | loginRole: Role; | ||||
@@ -24,7 +26,7 @@ export class InvestigateBusinessEntitiesAndIndividualsComponent implements OnIni | |||||
executingRole: Role; | executingRole: Role; | ||||
constructor() { | |||||
constructor(private investigationServie: InvestigateBuinessEntityAndIndividualService) { | |||||
const panelRemarks = localStorage.getItem('panelRemarks'); | const panelRemarks = localStorage.getItem('panelRemarks'); | ||||
if (panelRemarks) { | if (panelRemarks) { | ||||
@@ -96,7 +98,11 @@ export class InvestigateBusinessEntitiesAndIndividualsComponent implements OnIni | |||||
localStorage.setItem('panelRemarks', remarks); | localStorage.setItem('panelRemarks', remarks); | ||||
} | } | ||||
proceed() { | |||||
handleSelectedCandidates(selectedCandidateIds: Array<string>) { | |||||
this.selectedCandidateIds = selectedCandidateIds; | |||||
} | |||||
async proceed() { | |||||
this.stateHistory.push(this.state); | this.stateHistory.push(this.state); | ||||
switch (this.state) { | switch (this.state) { | ||||
@@ -114,6 +120,7 @@ export class InvestigateBusinessEntitiesAndIndividualsComponent implements OnIni | |||||
this.executingRole = 'Hod'; | this.executingRole = 'Hod'; | ||||
break; | break; | ||||
case 'ASSIGN COMMITTEE': | case 'ASSIGN COMMITTEE': | ||||
await this.investigationServie.selectPanelMembers(this.selectedCandidateIds); | |||||
this.state = 'REVIEW NON COMPLIANCE'; | this.state = 'REVIEW NON COMPLIANCE'; | ||||
this.executingRole = 'Investigator'; | this.executingRole = 'Investigator'; | ||||
break; | break; | ||||
@@ -1,4 +1,5 @@ | |||||
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; | import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; | ||||
import { InvestigateBuinessEntityAndIndividualService } from 'src/app/services/investigate-buiness-entity-and-individual.service'; | |||||
import { KeyValue } from 'src/app/widgets/key-value-holder/key-value-holder.component'; | import { KeyValue } from 'src/app/widgets/key-value-holder/key-value-holder.component'; | ||||
@Component({ | @Component({ | ||||
@@ -40,7 +41,7 @@ export class ViewCaseDetailsComponent implements OnInit { | |||||
] | ] | ||||
] | ] | ||||
constructor() { } | |||||
constructor(private investigationServie: InvestigateBuinessEntityAndIndividualService) { } | |||||
toggleHasData(toggle: boolean) { | toggleHasData(toggle: boolean) { | ||||
this.hasEnoughData = toggle; | this.hasEnoughData = toggle; | ||||
@@ -48,6 +49,13 @@ export class ViewCaseDetailsComponent implements OnInit { | |||||
} | } | ||||
ngOnInit(): void { | ngOnInit(): void { | ||||
this.investigationServie.getCaseDetails().then(caseDetails => { | |||||
this.companyDetails = caseDetails; | |||||
}); | |||||
this.investigationServie.getBoardDetails().then(boardDetails => { | |||||
this.boardDirectorData = boardDetails; | |||||
}) | |||||
} | } | ||||
} | } |
@@ -0,0 +1,16 @@ | |||||
import { TestBed } from '@angular/core/testing'; | |||||
import { InvestigateBuinessEntityAndIndividualService } from './investigate-buiness-entity-and-individual.service'; | |||||
describe('InvestigateBuinessEntityAndIndividualService', () => { | |||||
let service: InvestigateBuinessEntityAndIndividualService; | |||||
beforeEach(() => { | |||||
TestBed.configureTestingModule({}); | |||||
service = TestBed.inject(InvestigateBuinessEntityAndIndividualService); | |||||
}); | |||||
it('should be created', () => { | |||||
expect(service).toBeTruthy(); | |||||
}); | |||||
}); |
@@ -0,0 +1,67 @@ | |||||
import { Injectable } from '@angular/core'; | |||||
import { HttpClient } from '@angular/common/http'; | |||||
import { KeyValue } from '../widgets/key-value-holder/key-value-holder.component'; | |||||
import { HARDCODED_USERS, SelectableEntity } from '../widgets/select-entities/select-entities.component'; | |||||
export interface StatusResponse { | |||||
status: string; | |||||
} | |||||
@Injectable({ | |||||
providedIn: 'root' | |||||
}) | |||||
export class InvestigateBuinessEntityAndIndividualService { | |||||
constructor(private http: HttpClient) { | |||||
} | |||||
getCaseDetails() { | |||||
return this.http.get<Array<KeyValue>>('/api/compliance-data-aggregation/case-details/').toPromise(); | |||||
return new Promise<Array<KeyValue>>((resolve, reject) => resolve([{ | |||||
key: 'Business Name', | |||||
value: 'Entity Corp.', | |||||
}, { | |||||
key: 'Company ID', | |||||
value: 'ARN2021110294038', | |||||
}, { | |||||
key: 'Source of complaint', | |||||
value: 'Automatic', | |||||
}, { | |||||
key: 'Reason for complaint', | |||||
value: 'Unusual financial activity', | |||||
}])); | |||||
} | |||||
getBoardDetails() { | |||||
return this.http.get<Array<Array<string>>>('/api/compliance-data-aggregation/board-details/').toPromise(); | |||||
return new Promise<Array<Array<string>>>((resolve, reject) => resolve([ | |||||
[ | |||||
'Rose E. Arthur', | |||||
'July 26, 2010', | |||||
], [ | |||||
'David A. Bryant', | |||||
'July 26, 2008', | |||||
] | |||||
])); | |||||
} | |||||
getPanelCandidates() { | |||||
return this.http.get<Array<SelectableEntity>>('/api/compliance-panel/get-panel-candidates/').toPromise(); | |||||
return new Promise<Array<SelectableEntity>>((resolve, reject) => resolve(HARDCODED_USERS)); | |||||
} | |||||
selectPanelMembers(selectedPanelMembers: Array<string>) { | |||||
const selectPanelRequestBody = { | |||||
names: selectedPanelMembers, | |||||
} | |||||
return this.http.post<StatusResponse>('/api/compliance-panel/select-panel/', selectPanelRequestBody).toPromise(); | |||||
return new Promise<StatusResponse>((resolve, reject) => resolve({status: 'success'})); | |||||
} | |||||
} |
@@ -1,7 +1,5 @@ | |||||
import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||
import { HttpClient, HttpHeaders } from '@angular/common/http'; | |||||
import { Observable, throwError } from 'rxjs'; | |||||
import { catchError, retry } from 'rxjs/operators'; | |||||
import { HttpClient } from '@angular/common/http'; | |||||
import { AcknowledgementRow, ReceiptRow } from '../pages/register-business/register-business.component'; | import { AcknowledgementRow, ReceiptRow } from '../pages/register-business/register-business.component'; | ||||
export interface NameCheckRequest { | export interface NameCheckRequest { | ||||
@@ -38,9 +36,9 @@ export class RegisterBusinessNameService { | |||||
name, | name, | ||||
}; | }; | ||||
return new Promise<NameCheckResponse>((resolve, reject) => resolve({status: 'success'})); | |||||
return this.http.post<NameCheckResponse>('/api/registration-name-check/name-check', nameCheckRequest).toPromise(); | |||||
return this.http.post<NameCheckResponse>('http://localhost:10000/name-check/', nameCheckRequest).toPromise(); | |||||
return new Promise<NameCheckResponse>((resolve, reject) => resolve({status: 'success'})); | |||||
} | } | ||||
registerName( | registerName( | ||||
@@ -58,20 +56,21 @@ export class RegisterBusinessNameService { | |||||
dropSuffix, | dropSuffix, | ||||
}; | }; | ||||
return new Promise<NameCheckResponse>((resolve, reject) => resolve({status: 'success'})); | |||||
return this.http.post<NameCheckResponse>('/api/registration-name-register/name-register', nameRegisterRequest).toPromise(); | |||||
return this.http.post<NameRegisterResponse>('http://localhost:8080/name-register/', nameRegisterRequest).toPromise(); | |||||
return new Promise<NameCheckResponse>((resolve, reject) => resolve({status: 'success'})); | |||||
} | } | ||||
getAcknowledgement() { | getAcknowledgement() { | ||||
return this.http.get<Array<AcknowledgementRow>>('/api/registration-payment/acknowledgement/').toPromise(); | |||||
return new Promise<Array<AcknowledgementRow>>((resolve, reject) => resolve([])); | return new Promise<Array<AcknowledgementRow>>((resolve, reject) => resolve([])); | ||||
return this.http.get<Array<AcknowledgementRow>>('http://localhost:8080/acknowledgement/').toPromise(); | |||||
} | } | ||||
getReceipt() { | getReceipt() { | ||||
return this.http.get<Array<ReceiptRow>>('/api/registration-payment/receipt/').toPromise(); | |||||
return new Promise<Array<ReceiptRow>>((resolve, reject) => resolve([])); | return new Promise<Array<ReceiptRow>>((resolve, reject) => resolve([])); | ||||
return this.http.get<Array<ReceiptRow>>('http://localhost:8080/receipt/').toPromise(); | |||||
} | } | ||||
} | } |
@@ -1,4 +1,4 @@ | |||||
import { Component, Input, OnInit } from '@angular/core'; | |||||
import { Component, Input, OnChanges, OnInit, Output, EventEmitter, SimpleChanges } from '@angular/core'; | |||||
export interface SelectableEntity { | export interface SelectableEntity { | ||||
id: string|number; | id: string|number; | ||||
@@ -8,56 +8,56 @@ export interface SelectableEntity { | |||||
isSelected: boolean, | isSelected: boolean, | ||||
}; | }; | ||||
const HARDCODED_USERS: Array<SelectableEntity> = [{ | |||||
export const HARDCODED_USERS: Array<SelectableEntity> = [{ | |||||
id: 0, | id: 0, | ||||
name: "Alfred E. Kaplan", | name: "Alfred E. Kaplan", | ||||
avatar: '../../assets/avatars/1.jpg', | avatar: '../../assets/avatars/1.jpg', | ||||
subTitle: 'Analyst', | subTitle: 'Analyst', | ||||
isSelected: false | isSelected: false | ||||
}, { | }, { | ||||
id: 0, | |||||
id: 1, | |||||
name: "Ernest L. Hall", | name: "Ernest L. Hall", | ||||
avatar: '../../assets/avatars/2.jpg', | avatar: '../../assets/avatars/2.jpg', | ||||
subTitle: 'Investigator', | subTitle: 'Investigator', | ||||
isSelected: false | isSelected: false | ||||
}, { | }, { | ||||
id: 0, | |||||
id: 2, | |||||
name: "Leslie L. Barber", | name: "Leslie L. Barber", | ||||
avatar: '../../assets/avatars/3.jpg', | avatar: '../../assets/avatars/3.jpg', | ||||
subTitle: 'Analyst', | subTitle: 'Analyst', | ||||
isSelected: false | isSelected: false | ||||
}, { | }, { | ||||
id: 0, | |||||
id: 3, | |||||
name: "Todd K. Carrico", | name: "Todd K. Carrico", | ||||
avatar: '../../assets/avatars/4.jpg', | avatar: '../../assets/avatars/4.jpg', | ||||
subTitle: 'Analyst', | subTitle: 'Analyst', | ||||
isSelected: false | isSelected: false | ||||
}, { | }, { | ||||
id: 0, | |||||
id: 4, | |||||
name: "Louise K. Parker", | name: "Louise K. Parker", | ||||
avatar: '../../assets/avatars/5.jpg', | avatar: '../../assets/avatars/5.jpg', | ||||
subTitle: 'Investigator', | subTitle: 'Investigator', | ||||
isSelected: false | isSelected: false | ||||
}, { | }, { | ||||
id: 0, | |||||
id: 5, | |||||
name: "Jessica R. Folger", | name: "Jessica R. Folger", | ||||
avatar: '../../assets/avatars/6.jpg', | avatar: '../../assets/avatars/6.jpg', | ||||
subTitle: 'Analyst', | subTitle: 'Analyst', | ||||
isSelected: false | isSelected: false | ||||
}, { | }, { | ||||
id: 0, | |||||
id: 6, | |||||
name: "Charles M. Pollard", | name: "Charles M. Pollard", | ||||
avatar: '../../assets/avatars/7.jpg', | avatar: '../../assets/avatars/7.jpg', | ||||
subTitle: 'Analyst', | subTitle: 'Analyst', | ||||
isSelected: false | isSelected: false | ||||
}, { | }, { | ||||
id: 0, | |||||
id: 7, | |||||
name: "David B. Boaz", | name: "David B. Boaz", | ||||
avatar: '../../assets/avatars/8.jpg', | avatar: '../../assets/avatars/8.jpg', | ||||
subTitle: 'Investigator', | subTitle: 'Investigator', | ||||
isSelected: false | isSelected: false | ||||
}, { | }, { | ||||
id: 0, | |||||
id: 8, | |||||
name: "Julia R. Bedwell", | name: "Julia R. Bedwell", | ||||
avatar: '../../assets/avatars/9.jpg', | avatar: '../../assets/avatars/9.jpg', | ||||
subTitle: 'Analyst', | subTitle: 'Analyst', | ||||
@@ -69,16 +69,24 @@ const HARDCODED_USERS: Array<SelectableEntity> = [{ | |||||
templateUrl: './select-entities.component.html', | templateUrl: './select-entities.component.html', | ||||
styleUrls: ['./select-entities.component.scss'] | styleUrls: ['./select-entities.component.scss'] | ||||
}) | }) | ||||
export class SelectEntitiesComponent implements OnInit { | |||||
@Input() entities: Array<SelectableEntity> = HARDCODED_USERS; | |||||
export class SelectEntitiesComponent implements OnInit, OnChanges { | |||||
@Input() entities: Array<SelectableEntity> = []; | |||||
@Output() onSelectChange: EventEmitter<SelectableEntity> = new EventEmitter(); | |||||
constructor() { } | constructor() { } | ||||
ngOnInit(): void { | ngOnInit(): void { | ||||
} | } | ||||
ngOnChanges(changes: SimpleChanges): void { | |||||
if (changes.entities.currentValue !== changes.entities.previousValue) { | |||||
this.entities = changes.entities.currentValue; | |||||
} | |||||
} | |||||
selectEntity(entity: SelectableEntity) { | selectEntity(entity: SelectableEntity) { | ||||
entity.isSelected = !entity.isSelected; | entity.isSelected = !entity.isSelected; | ||||
this.onSelectChange.emit(entity); | |||||
} | } | ||||
} | } |