Browse Source

Merge branch 'dev' of https://github.com/abpframework/abp into refactor/general

pull/1584/head
mehmet-erim 7 years ago
parent
commit
cd242330ee
  1. 6
      npm/ng-packs/packages/account/src/lib/components/tenant-box/tenant-box.component.html
  2. 70
      npm/ng-packs/packages/account/src/lib/components/tenant-box/tenant-box.component.ts
  3. 8
      npm/ng-packs/packages/account/src/lib/models/tenant.ts
  4. 6
      npm/ng-packs/packages/account/src/lib/services/account.service.ts
  5. 8
      npm/ng-packs/packages/core/src/lib/actions/session.actions.ts
  6. 5
      npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts
  7. 4
      npm/ng-packs/packages/core/src/lib/models/session.ts
  8. 5
      npm/ng-packs/packages/core/src/lib/states/config.state.ts
  9. 14
      npm/ng-packs/packages/core/src/lib/states/session.state.ts

6
npm/ng-packs/packages/account/src/lib/components/tenant-box/tenant-box.component.html

@ -4,7 +4,7 @@
> >
<span style="color: #666;">{{ 'AbpUiMultiTenancy::Tenant' | abpLocalization }}: </span> <span style="color: #666;">{{ 'AbpUiMultiTenancy::Tenant' | abpLocalization }}: </span>
<strong> <strong>
<i>{{ selected?.name ? selected.name : ('AbpUiMultiTenancy::NotSelected' | abpLocalization) }}</i> <i>{{ tenantName || ('AbpUiMultiTenancy::NotSelected' | abpLocalization) }}</i>
</strong> </strong>
(<a id="abp-tenant-switch-link" style="color: #333; cursor: pointer" (click)="onSwitch()">{{ (<a id="abp-tenant-switch-link" style="color: #333; cursor: pointer" (click)="onSwitch()">{{
'AbpUiMultiTenancy::Switch' | abpLocalization 'AbpUiMultiTenancy::Switch' | abpLocalization
@ -17,11 +17,11 @@
<h5>Switch Tenant</h5> <h5>Switch Tenant</h5>
</ng-template> </ng-template>
<ng-template #abpBody> <ng-template #abpBody>
<form> <form (ngSubmit)="save()">
<div class="mt-2"> <div class="mt-2">
<div class="form-group"> <div class="form-group">
<label for="name">{{ 'AbpUiMultiTenancy::Name' | abpLocalization }}</label> <label for="name">{{ 'AbpUiMultiTenancy::Name' | abpLocalization }}</label>
<input [(ngModel)]="selected.name" type="text" id="name" name="tenant" class="form-control" autofocus /> <input [(ngModel)]="tenant.name" type="text" id="name" name="tenant" class="form-control" autofocus />
</div> </div>
<p>{{ 'AbpUiMultiTenancy::SwitchTenantHint' | abpLocalization }}</p> <p>{{ 'AbpUiMultiTenancy::SwitchTenantHint' | abpLocalization }}</p>
</div> </div>

70
npm/ng-packs/packages/account/src/lib/components/tenant-box/tenant-box.component.ts

@ -1,6 +1,6 @@
import { ABP, SessionSetTenantId } from '@abp/ng.core'; import { ABP, SessionSetTenant, SessionState } from '@abp/ng.core';
import { ToasterService } from '@abp/ng.theme.shared'; import { ToasterService } from '@abp/ng.theme.shared';
import { Component, TemplateRef, ViewChild } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Store } from '@ngxs/store'; import { Store } from '@ngxs/store';
import { throwError } from 'rxjs'; import { throwError } from 'rxjs';
import { catchError, take } from 'rxjs/operators'; import { catchError, take } from 'rxjs/operators';
@ -11,40 +11,58 @@ import { AccountService } from '../../services/account.service';
selector: 'abp-tenant-box', selector: 'abp-tenant-box',
templateUrl: './tenant-box.component.html', templateUrl: './tenant-box.component.html',
}) })
export class TenantBoxComponent { export class TenantBoxComponent implements OnInit {
constructor(private store: Store, private toasterService: ToasterService, private accountService: AccountService) {} constructor(private store: Store, private toasterService: ToasterService, private accountService: AccountService) {}
selected = {} as ABP.BasicItem; tenant = {} as ABP.BasicItem;
tenantName: string;
isModalVisible: boolean; isModalVisible: boolean;
@ViewChild('modalContent', { static: false }) ngOnInit() {
modalContent: TemplateRef<any>; this.tenant = this.store.selectSnapshot(SessionState.getTenant) || ({} as ABP.BasicItem);
this.tenantName = this.tenant.name || '';
}
onSwitch() { onSwitch() {
this.isModalVisible = true; this.isModalVisible = true;
} }
save() { save() {
this.selected.name = this.selected.name || ''; if (this.tenant.name) {
this.accountService
this.accountService .findTenant(this.tenant.name)
.findTenant(this.selected.name) .pipe(
.pipe( take(1),
take(1), catchError(err => {
catchError(err => { this.toasterService.error(
this.toasterService.error(snq(() => err.error.error_description, 'An error occured.'), 'Error'); snq(() => err.error.error_description, 'AbpUi::DefaultErrorMessage'),
return throwError(err); 'AbpUi::Error',
}), );
) return throwError(err);
.subscribe(({ success, tenantId }) => { }),
if (success) { )
this.isModalVisible = false; .subscribe(({ success, tenantId }) => {
} else { if (success) {
this.toasterService.error(`Given tenant is not available: ${this.selected.name}`, 'Error'); this.tenant = {
this.selected = {} as ABP.BasicItem; id: tenantId,
} name: this.tenant.name,
this.store.dispatch(new SessionSetTenantId(success ? tenantId : null)); };
}); this.tenantName = this.tenant.name;
this.isModalVisible = false;
} else {
this.toasterService.error(`AbpUiMultiTenancy::GivenTenantIsNotAvailable`, 'AbpUi::Error', {
messageLocalizationParams: [this.tenant.name],
});
this.tenant = {} as ABP.BasicItem;
}
this.store.dispatch(new SessionSetTenant(success ? this.tenant : null));
});
} else {
this.store.dispatch(new SessionSetTenant(null));
this.tenantName = null;
this.isModalVisible = false;
}
} }
} }

8
npm/ng-packs/packages/account/src/lib/models/tenant.ts

@ -1,4 +1,4 @@
export interface Tenant { export interface TenantIdResponse {
success: boolean; success: boolean;
tenantId: string; tenantId: string;
} }

6
npm/ng-packs/packages/account/src/lib/services/account.service.ts

@ -1,7 +1,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { RestService, Rest } from '@abp/ng.core'; import { RestService, Rest } from '@abp/ng.core';
import { RegisterResponse, RegisterRequest, Tenant } from '../models'; import { RegisterResponse, RegisterRequest, TenantIdResponse } from '../models';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
@ -9,13 +9,13 @@ import { RegisterResponse, RegisterRequest, Tenant } from '../models';
export class AccountService { export class AccountService {
constructor(private rest: RestService) {} constructor(private rest: RestService) {}
findTenant(tenantName: string): Observable<Tenant> { findTenant(tenantName: string): Observable<TenantIdResponse> {
const request: Rest.Request<null> = { const request: Rest.Request<null> = {
method: 'GET', method: 'GET',
url: `/api/abp/multi-tenancy/find-tenant/${tenantName}`, url: `/api/abp/multi-tenancy/find-tenant/${tenantName}`,
}; };
return this.rest.request<null, Tenant>(request); return this.rest.request<null, TenantIdResponse>(request);
} }
register(body: RegisterRequest): Observable<RegisterResponse> { register(body: RegisterRequest): Observable<RegisterResponse> {

8
npm/ng-packs/packages/core/src/lib/actions/session.actions.ts

@ -1,8 +1,10 @@
import { ABP } from '../models';
export class SessionSetLanguage { export class SessionSetLanguage {
static readonly type = '[Session] Set Language'; static readonly type = '[Session] Set Language';
constructor(public payload: string) {} constructor(public payload: string) {}
} }
export class SessionSetTenantId { export class SessionSetTenant {
static readonly type = '[Session] Set Tenant Id'; static readonly type = '[Session] Set Tenant';
constructor(public payload: string) {} constructor(public payload: ABP.BasicItem) {}
} }

5
npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts

@ -25,6 +25,11 @@ export class ApiInterceptor implements HttpInterceptor {
headers['Accept-Language'] = lang; headers['Accept-Language'] = lang;
} }
const tenant = this.store.selectSnapshot(SessionState.getTenant);
if (!request.headers.has('__tenant') && tenant) {
headers['__tenant'] = tenant.id;
}
return next return next
.handle( .handle(
request.clone({ request.clone({

4
npm/ng-packs/packages/core/src/lib/models/session.ts

@ -1,6 +1,8 @@
import { ABP } from '../models';
export namespace Session { export namespace Session {
export interface State { export interface State {
language: string; language: string;
tenantId: string; tenant: ABP.BasicItem;
} }
} }

5
npm/ng-packs/packages/core/src/lib/states/config.state.ts

@ -138,9 +138,10 @@ export class ConfigState {
return undefined; return undefined;
}, state.localization.values); }, state.localization.values);
interpolateParams = interpolateParams.filter(params => params != null);
if (copy && interpolateParams && interpolateParams.length) { if (copy && interpolateParams && interpolateParams.length) {
interpolateParams.forEach((param, index) => { interpolateParams.forEach(param => {
copy = copy.replace(`'{${index}}'`, param); copy = copy.replace(/[\'\"]?\{[\d]+\}[\'\"]?/, param);
}); });
} }

14
npm/ng-packs/packages/core/src/lib/states/session.state.ts

@ -1,6 +1,6 @@
import { Action, Selector, State, StateContext } from '@ngxs/store'; import { Action, Selector, State, StateContext } from '@ngxs/store';
import { SessionSetLanguage, SessionSetTenantId } from '../actions/session.actions'; import { SessionSetLanguage, SessionSetTenant } from '../actions/session.actions';
import { Session } from '../models/session'; import { ABP, Session } from '../models';
@State<Session.State>({ @State<Session.State>({
name: 'SessionState', name: 'SessionState',
@ -13,8 +13,8 @@ export class SessionState {
} }
@Selector() @Selector()
static getSelectedTenantId({ tenantId }: Session.State): string { static getTenant({ tenant }: Session.State): ABP.BasicItem {
return tenantId; return tenant;
} }
constructor() {} constructor() {}
@ -26,10 +26,10 @@ export class SessionState {
}); });
} }
@Action(SessionSetTenantId) @Action(SessionSetTenant)
sessionSetTenantId({ patchState }: StateContext<Session.State>, { payload }: SessionSetTenantId) { sessionSetTenantId({ patchState }: StateContext<Session.State>, { payload }: SessionSetTenant) {
patchState({ patchState({
tenantId: payload, tenant: payload,
}); });
} }
} }

Loading…
Cancel
Save