Skip to content
This repository has been archived by the owner on Mar 25, 2023. It is now read-only.

Commit

Permalink
feat(select account) - use ngrx for selected account (#607)
Browse files Browse the repository at this point in the history
  • Loading branch information
ksendart committed Oct 27, 2017
1 parent f1b34fc commit 5d81359
Show file tree
Hide file tree
Showing 55 changed files with 1,071 additions and 313 deletions.
107 changes: 107 additions & 0 deletions src/app/account/account-container/account-details.container.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import {
Component,
OnInit
} from '@angular/core';
import { State } from '../../reducers/index';
import { Store } from '@ngrx/store';
import * as configurationAction from '../../reducers/configuration/redux/configurations.actions';
import * as resourceLimitAction from '../../reducers/resource-limit/redux/resource-limits.actions';
import * as resourceCountAction from '../../reducers/resource-count/redux/resource-counts.actions';
import * as fromAccounts from '../../reducers/accounts/redux/accounts.reducers';
import * as fromConfigurations from '../../reducers/configuration/redux/configurations.reducers';
import * as fromResourceLimits from '../../reducers/resource-limit/redux/resource-limits.reducers';
import * as fromResourceCounts from '../../reducers/resource-count/redux/resource-counts.reducers';
import { WithUnsubscribe } from '../../utils/mixins/with-unsubscribe';
import { AuthService } from '../../shared/services/auth.service';
import { Account } from '../../shared/models/account.model';

@Component({
selector: 'cs-account-page-container',
template: `
<cs-account-detail
[account]="account$ | async"
></cs-account-detail>
<cs-account-settings
*ngIf="isAdmin()"
[account]="account$ | async"
[configurations]="configurations$ | async"
(onConfigurationEdit)="onConfigurationEdit($event)"
>
</cs-account-settings>
<cs-account-limits
[limits]="limits$ | async"
[isAdmin]="isAdmin()"
(onLimitsEdit)="onLimitsEdit($event)"
></cs-account-limits>
<cs-account-statistics
*ngIf="isAdmin()"
[stats]="stats$ | async"
(onStatsUpdate)="onStatsUpdate($event)"
></cs-account-statistics>`
})
export class AccountDetailsContainerComponent extends WithUnsubscribe() implements OnInit {

readonly account$ = this.store.select(fromAccounts.getSelectedAccount);
readonly configurations$ = this.store.select(fromConfigurations.selectAll);
readonly limits$ = this.store.select(fromResourceLimits.selectAll);
readonly stats$ = this.store.select(fromResourceCounts.selectAll);

public account: Account;


constructor(
private store: Store<State>,
private authService: AuthService
) {
super();
}

public onConfigurationEdit(configuration) {
this.store.dispatch(new configurationAction.UpdateConfigurationRequest({
configuration,
account: this.account
}));
}

public onLimitsEdit(limits) {
this.store.dispatch(new resourceLimitAction.UpdateResourceLimitsRequest({
limits,
account: this.account
}));
}

public onStatsUpdate(stats) {
this.store.dispatch(new resourceCountAction.LoadResourceCountsRequest({
account: this.account.name,
domainid: this.account.domainid
}));
}

public ngOnInit() {
this.account$
.takeUntil(this.unsubscribe$)
.subscribe(account => {
if (account) {
this.account = account;
this.store.dispatch(new resourceLimitAction.LoadResourceLimitsRequest({
account: account.name,
domainid: account.domainid
}));

if (this.isAdmin()) {
this.store.dispatch(new configurationAction.LoadConfigurationsRequest({ accountid: account.id }));
this.store.dispatch(new resourceCountAction.LoadResourceCountsRequest({
account: account.name,
domainid: account.domainid
}));
}
}
});
}


public isAdmin() {
return this.authService.isAdmin();
}

}
38 changes: 38 additions & 0 deletions src/app/account/account-container/account-sidebar.container.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import {
Component,
OnInit
} from '@angular/core';
import { State } from '../../reducers/index';
import { Store } from '@ngrx/store';
import * as accountEvent from '../../reducers/accounts/redux/accounts.actions';
import { ActivatedRoute } from '@angular/router';
import * as fromAccounts from '../../reducers/accounts/redux/accounts.reducers';

@Component({
selector: 'cs-account-page-container',
template: `
<cs-account-sidebar
[entity]="account$ | async"
(onAccountChanged)="onAccountChange($event)"
></cs-account-sidebar>`
})
export class AccountSidebarContainerComponent implements OnInit {

readonly account$ = this.store.select(fromAccounts.getSelectedAccount);


constructor(
private store: Store<State>,
private activatedRoute: ActivatedRoute
) { }

public onAccountChange(id) {
this.store.dispatch(new accountEvent.LoadAccountsRequest());
}

public ngOnInit() {
const params = this.activatedRoute.snapshot.params;
this.store.dispatch(new accountEvent.LoadSelectedAccount(params['id']));
}

}
57 changes: 35 additions & 22 deletions src/app/account/account-container/account.container.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,24 @@ import {
} from '@angular/core';
import { State } from '../../reducers/index';
import { Store } from '@ngrx/store';
import * as accountActions from '../redux/accounts.actions';
import * as domainActions from '../../domains/redux/domains.actions';
import * as roleActions from '../../roles/redux/roles.actions';
import * as accountActions from '../../reducers/accounts/redux/accounts.actions';
import * as domainActions from '../../reducers/domains/redux/domains.actions';
import * as roleActions from '../../reducers/roles/redux/roles.actions';
import { FilterService } from '../../shared/services/filter.service';
import {
ActivatedRoute,
Router
} from '@angular/router';
import { SessionStorageService } from '../../shared/services/session-storage.service';
import * as fromAccounts from '../redux/accounts.reducers';
import * as fromDomains from '../../domains/redux/domains.reducers';
import * as fromRoles from '../../roles/redux/roles.reducers';
import * as fromAccounts from '../../reducers/accounts/redux/accounts.reducers';
import * as fromDomains from '../../reducers/domains/redux/domains.reducers';
import * as fromRoles from '../../reducers/roles/redux/roles.reducers';
import { WithUnsubscribe } from '../../utils/mixins/with-unsubscribe';
import { Account, AccountState } from '../../shared/models/account.model';
import {
Account,
AccountState
} from '../../shared/models/account.model';
import { AuthService } from '../../shared/services/auth.service';

export const stateTranslations = {
[AccountState.disabled]: 'ACCOUNT_STATE.DISABLED',
Expand Down Expand Up @@ -54,8 +58,8 @@ export class AccountPageContainerComponent extends WithUnsubscribe() implements
readonly accounts$ = this.store.select(fromAccounts.selectFilteredAccounts);
readonly loading$ = this.store.select(fromAccounts.isLoading);
readonly filters$ = this.store.select(fromAccounts.filters);
readonly domains$ = this.store.select(fromDomains.domains);
readonly roles$ = this.store.select(fromRoles.roles);
readonly domains$ = this.store.select(fromDomains.selectAll);
readonly roles$ = this.store.select(fromRoles.selectAll);
readonly roleTypes$ = this.store.select(fromRoles.roleTypes);

readonly selectedDomainIds$ = this.store.select(fromAccounts.filterSelectedDomainIds);
Expand Down Expand Up @@ -109,6 +113,7 @@ export class AccountPageContainerComponent extends WithUnsubscribe() implements

constructor(
private store: Store<State>,
private authService: AuthService,
private sessionStorage: SessionStorageService,
private activatedRoute: ActivatedRoute,
private router: Router
Expand Down Expand Up @@ -140,21 +145,29 @@ export class AccountPageContainerComponent extends WithUnsubscribe() implements
this.store.dispatch(new accountActions.AccountFilterUpdate({}));
}

public isAdmin() {
return this.authService.isAdmin();
}

public ngOnInit() {
this.store.dispatch(new domainActions.LoadDomainsRequest());
this.store.dispatch(new roleActions.LoadRolesRequest());
this.initFilters();
this.filters$
.takeUntil(this.unsubscribe$)
.subscribe(filters => {
this.filterService.update({
'domains': filters.selectedDomainIds,
'roles': filters.selectedRoleNames,
'roleTypes': filters.selectedRoleTypes,
'states': filters.selectedStates,
'groupings': filters.selectedGroupingNames
if (this.isAdmin()) {
this.store.dispatch(new domainActions.LoadDomainsRequest());
this.store.dispatch(new roleActions.LoadRolesRequest());
this.initFilters();
this.filters$
.takeUntil(this.unsubscribe$)
.subscribe(filters => {
this.filterService.update({
'domains': filters.selectedDomainIds,
'roles': filters.selectedRoleNames,
'roleTypes': filters.selectedRoleTypes,
'states': filters.selectedStates,
'groupings': filters.selectedGroupingNames
});
});
});
} else {
this.store.dispatch(new accountActions.LoadAccountsRequest());
}
}

public update(selectedGroupings) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,3 @@ <h2 class="mat-card-title-text">{{ 'ACCOUNT_PAGE.DETAILS.TITLE' | translate }}</
</mat-card-content>
</mat-card>
</ng-container>

<cs-account-settings *ngIf="account && isAdmin()" [account]="account"></cs-account-settings>
<cs-account-limits *ngIf="limits" [limits]="limits" [isAdmin]="isAdmin()" (onLimitsEdit)="updateLimits($event)"></cs-account-limits>
<cs-account-statistics *ngIf="account && isAdmin()" [account]="account"></cs-account-statistics>
Original file line number Diff line number Diff line change
@@ -1,45 +1,20 @@
import { Component } from '@angular/core';
import {
Component,
Input
} from '@angular/core';
import { Account } from '../../../shared/models/account.model';
import { ActivatedRoute } from '@angular/router';
import { AccountService } from '../../../shared/services/account.service';
import { ResourceLimit } from '../../../shared/models/resource-limit.model';
import { ResourceLimitService } from '../../../shared/services/resource-limit.service';
import { Observable } from 'rxjs/Observable';
import { AuthService } from '../../../shared/services/auth.service';

@Component({
selector: 'cs-account-detail',
templateUrl: 'account-details.component.html'
})
export class AccountDetailsComponent {
public account: Account;
public limits: Array<ResourceLimit>;
@Input() public account: Account;

constructor(
private accountService: AccountService,
private activatedRoute: ActivatedRoute,
private resourceLimitService: ResourceLimitService,
private authService: AuthService
) {
const params = this.activatedRoute.snapshot.parent.params;

this.accountService.get(params.id)
.switchMap(account => {
this.account = account;
return this.resourceLimitService.getList({
account: this.account.name,
domainid: this.account.domainid
});
}).subscribe(limits => {
this.limits = limits;
});

}

public updateLimits(limits: Array<ResourceLimit>) {
const observes = limits.map(limit => this.resourceLimitService.updateResourceLimit(limit, this.account));
Observable.forkJoin(...observes).subscribe();
}
) { }

public isAdmin() {
return this.authService.isAdmin();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,39 +8,54 @@ <h2 class="mat-card-title-text">
</mat-card-header>
<mat-card-content class="mat-card-content-with-actions">
<div class="mat-card-content-container">
<div *ngFor="let limit of limits" class="height-container">
<div class="flex-container container">
<div class="flex-container left">

<div *ngIf="!isEdit">
<div *ngFor="let limit of limits; let i = index;" class="height-container">
<div class="flex-container container">
<div class="flex-container left">
<div
class="name"
[innerHTML]="limitLabels[limit.resourcetype] | translate"
></div>
</div>
<div
class="name"
[innerHTML]="limitLabels[limit.resourceType] | translate"
ngxClipboard
class="value"
[innerHTML]="limit.max"
></div>
</div>
<div *ngIf="!isEdit"
ngxClipboard
class="value"
[innerHTML]="limit.max"
></div>
<div *ngIf="isEdit"
class="value"
><mat-form-field class="full-width-input">
<input
matInput
name="vmlimit"
[(ngModel)]="limit.max"
required
></mat-form-field>
</div>
</div>

<div *ngIf="isEdit">
<div *ngFor="let limit of localLimits; let i = index" class="height-container">
<div class="flex-container container">
<div
class="name"
[innerHTML]="limitLabels[limit.resourcetype] | translate"
></div>
<div class="value"
><mat-form-field class="full-width-input">
<input
matInput
name="{{'vmlimit'+i}}"
[(ngModel)]="localLimits[i].max"
required
></mat-form-field>

</div>
</div>
</div>
</div>

</div>
<div *ngIf="isAdmin">
<mat-card-actions *ngIf="!isEdit">
<button
mat-icon-button
[matTooltip]="'COMMON.EDIT' | translate"
matTooltipPosition="above"
(click)="isEdit=!isEdit"
(click)="editLimits()"
>
<mat-icon>edit</mat-icon>
</button>
Expand Down
Loading

0 comments on commit 5d81359

Please sign in to comment.