Browse Source

Use languages state

pull/282/head
Sebastian Stehle 9 years ago
parent
commit
7546c5a84a
  1. 6
      src/Squidex/app/features/content/module.ts
  2. 5
      src/Squidex/app/features/content/pages/content/content-field.component.ts
  3. 22
      src/Squidex/app/features/content/pages/content/content-page.component.ts
  4. 2
      src/Squidex/app/features/content/pages/contents/contents-page.component.html
  5. 21
      src/Squidex/app/features/content/pages/contents/contents-page.component.ts
  6. 2
      src/Squidex/app/features/content/shared/references-editor.component.ts
  7. 38
      src/Squidex/app/shared/guards/load-languages.guard.spec.ts
  8. 24
      src/Squidex/app/shared/guards/load-languages.guard.ts
  9. 42
      src/Squidex/app/shared/guards/resolve-app-languages.guard.ts
  10. 2
      src/Squidex/app/shared/internal.ts
  11. 4
      src/Squidex/app/shared/module.ts

6
src/Squidex/app/features/content/module.ts

@ -11,7 +11,7 @@ import { DndModule } from 'ng2-dnd';
import { import {
CanDeactivateGuard, CanDeactivateGuard,
ResolveAppLanguagesGuard, LoadLanguagesGuard,
ResolveContentGuard, ResolveContentGuard,
SchemaMustExistPublishedGuard, SchemaMustExistPublishedGuard,
SqxFrameworkModule, SqxFrameworkModule,
@ -35,6 +35,7 @@ const routes: Routes = [
{ {
path: '', path: '',
component: SchemasPageComponent, component: SchemasPageComponent,
canActivate: [LoadLanguagesGuard],
children: [ children: [
{ {
path: '' path: ''
@ -42,9 +43,6 @@ const routes: Routes = [
{ {
path: ':schemaName', path: ':schemaName',
canActivate: [SchemaMustExistPublishedGuard], canActivate: [SchemaMustExistPublishedGuard],
resolve: {
appLanguages: ResolveAppLanguagesGuard
},
children: [ children: [
{ {
path: '', path: '',

5
src/Squidex/app/features/content/pages/content/content-field.component.ts

@ -11,7 +11,8 @@ import { AbstractControl, FormGroup } from '@angular/forms';
import { import {
AppLanguageDto, AppLanguageDto,
FieldDto, FieldDto,
fieldInvariant fieldInvariant,
ImmutableArray
} from '@app/shared'; } from '@app/shared';
@Component({ @Component({
@ -30,7 +31,7 @@ export class ContentFieldComponent implements OnInit {
public language: AppLanguageDto; public language: AppLanguageDto;
@Input() @Input()
public languages: AppLanguageDto[]; public languages: ImmutableArray<AppLanguageDto>;
@Input() @Input()
public contentFormSubmitted: boolean; public contentFormSubmitted: boolean;

22
src/Squidex/app/features/content/pages/content/content-page.component.ts

@ -20,6 +20,8 @@ import {
ContentDto, ContentDto,
ContentsService, ContentsService,
fieldInvariant, fieldInvariant,
ImmutableArray,
LanguagesState,
SchemaDetailsDto, SchemaDetailsDto,
SchemasState, SchemasState,
Version Version
@ -35,6 +37,7 @@ import {
}) })
export class ContentPageComponent implements CanComponentDeactivate, OnDestroy, OnInit { export class ContentPageComponent implements CanComponentDeactivate, OnDestroy, OnInit {
private contentVersionSelectedSubscription: Subscription; private contentVersionSelectedSubscription: Subscription;
private languagesSubscription: Subscription;
private selectedSchemaSubscription: Subscription; private selectedSchemaSubscription: Subscription;
public schema: SchemaDetailsDto; public schema: SchemaDetailsDto;
@ -46,9 +49,11 @@ export class ContentPageComponent implements CanComponentDeactivate, OnDestroy,
public isNewMode = true; public isNewMode = true;
public languages: AppLanguageDto[] = []; public languages: ImmutableArray<AppLanguageDto>;
constructor(public readonly ctx: AppContext, constructor(
public readonly ctx: AppContext,
public readonly languagesState: LanguagesState,
private readonly contentsService: ContentsService, private readonly contentsService: ContentsService,
private readonly router: Router, private readonly router: Router,
private readonly schemasState: SchemasState private readonly schemasState: SchemasState
@ -57,6 +62,7 @@ export class ContentPageComponent implements CanComponentDeactivate, OnDestroy,
public ngOnDestroy() { public ngOnDestroy() {
this.contentVersionSelectedSubscription.unsubscribe(); this.contentVersionSelectedSubscription.unsubscribe();
this.languagesSubscription.unsubscribe();
this.selectedSchemaSubscription.unsubscribe(); this.selectedSchemaSubscription.unsubscribe();
} }
@ -67,6 +73,12 @@ export class ContentPageComponent implements CanComponentDeactivate, OnDestroy,
this.loadVersion(message.version); this.loadVersion(message.version);
}); });
this.languagesSubscription =
this.languagesState.languages
.subscribe(languages => {
this.languages = languages.map(x => x.language);
});
this.selectedSchemaSubscription = this.selectedSchemaSubscription =
this.schemasState.selectedSchema this.schemasState.selectedSchema
.subscribe(schema => { .subscribe(schema => {
@ -206,7 +218,7 @@ export class ContentPageComponent implements CanComponentDeactivate, OnDestroy,
const fieldForm = new FormGroup({}); const fieldForm = new FormGroup({});
if (field.isLocalizable) { if (field.isLocalizable) {
for (let language of this.languages) { for (let language of this.languages.values) {
fieldForm.setControl(language.iso2Code, new FormControl(undefined, field.createValidators(language.isOptional))); fieldForm.setControl(language.iso2Code, new FormControl(undefined, field.createValidators(language.isOptional)));
} }
} else { } else {
@ -233,7 +245,7 @@ export class ContentPageComponent implements CanComponentDeactivate, OnDestroy,
const fieldForm = <FormGroup>this.contentForm.controls[field.name]; const fieldForm = <FormGroup>this.contentForm.controls[field.name];
if (field.isLocalizable) { if (field.isLocalizable) {
for (let language of this.languages) { for (let language of this.languages.values) {
fieldForm.controls[language.iso2Code].setValue(fieldValue[language.iso2Code]); fieldForm.controls[language.iso2Code].setValue(fieldValue[language.iso2Code]);
} }
} else { } else {
@ -251,7 +263,7 @@ export class ContentPageComponent implements CanComponentDeactivate, OnDestroy,
const fieldForm = <FormGroup>this.contentForm.controls[field.name]; const fieldForm = <FormGroup>this.contentForm.controls[field.name];
if (field.isLocalizable) { if (field.isLocalizable) {
for (let language of this.languages) { for (let language of this.languages.values) {
fieldForm.controls[language.iso2Code].setValue(defaultValue); fieldForm.controls[language.iso2Code].setValue(defaultValue);
} }
} else { } else {

2
src/Squidex/app/features/content/pages/contents/contents-page.component.html

@ -87,7 +87,7 @@
<tbody> <tbody>
<ng-template ngFor let-content [ngForOf]="contentItems" [ngForTrackBy]="trackByContent"> <ng-template ngFor let-content [ngForOf]="contentItems" [ngForTrackBy]="trackByContent">
<tr [sqxContent]="content" [routerLink]="[content.id]" routerLinkActive="active" <tr [sqxContent]="content" [routerLink]="[content.id]" routerLinkActive="active"
[language]="languageSelected" [language]="language"
[schema]="schema" [schema]="schema"
[selected]="isItemSelected(content)" [selected]="isItemSelected(content)"
(selectedChange)="selectItem(content, $event)" (selectedChange)="selectItem(content, $event)"

21
src/Squidex/app/features/content/pages/contents/contents-page.component.ts

@ -9,13 +9,13 @@ import { Component, OnDestroy, OnInit } from '@angular/core';
import { Observable, Subscription } from 'rxjs'; import { Observable, Subscription } from 'rxjs';
import { import {
allData,
AppContext, AppContext,
AppLanguageDto, AppLanguageDto,
ContentDto, ContentDto,
ContentsService, ContentsService,
DateTime, DateTime,
ImmutableArray, ImmutableArray,
LanguagesState,
ModalView, ModalView,
Pager, Pager,
SchemaDetailsDto, SchemaDetailsDto,
@ -33,6 +33,7 @@ import {
}) })
export class ContentsPageComponent implements OnDestroy, OnInit { export class ContentsPageComponent implements OnDestroy, OnInit {
private selectedSchemaSubscription: Subscription; private selectedSchemaSubscription: Subscription;
private languagesSubscription: Subscription;
public schema: SchemaDetailsDto; public schema: SchemaDetailsDto;
@ -54,20 +55,22 @@ export class ContentsPageComponent implements OnDestroy, OnInit {
public canUnpublish = false; public canUnpublish = false;
public canPublish = false; public canPublish = false;
public languages: AppLanguageDto[] = []; public language: AppLanguageDto;
public languageSelected: AppLanguageDto; public languages: ImmutableArray<AppLanguageDto>;
public languageParameter: string; public languageParameter: string;
public isAllSelected = false; public isAllSelected = false;
public isArchive = false; public isArchive = false;
constructor(public readonly ctx: AppContext, constructor(public readonly ctx: AppContext,
private readonly languagesState: LanguagesState,
private readonly contentsService: ContentsService, private readonly contentsService: ContentsService,
private readonly schemasState: SchemasState private readonly schemasState: SchemasState
) { ) {
} }
public ngOnDestroy() { public ngOnDestroy() {
this.languagesSubscription.unsubscribe();
this.selectedSchemaSubscription.unsubscribe(); this.selectedSchemaSubscription.unsubscribe();
} }
@ -81,10 +84,12 @@ export class ContentsPageComponent implements OnDestroy, OnInit {
this.load(); this.load();
}); });
const routeData = allData(this.ctx.route); this.languagesSubscription =
this.languagesState.languages
this.languages = routeData.appLanguages; .subscribe(languages => {
this.languageSelected = this.languages[0]; this.languages = languages.map(x => x.language);
this.language = this.languages.at(0);
});
} }
public publishContent(content: ContentDto) { public publishContent(content: ContentDto) {
@ -301,7 +306,7 @@ export class ContentsPageComponent implements OnDestroy, OnInit {
} }
public selectLanguage(language: AppLanguageDto) { public selectLanguage(language: AppLanguageDto) {
this.languageSelected = language; this.language = language;
} }
public trackByContent(content: ContentDto): string { public trackByContent(content: ContentDto): string {

2
src/Squidex/app/features/content/shared/references-editor.component.ts

@ -45,7 +45,7 @@ export class ReferencesEditorComponent implements ControlValueAccessor, OnInit {
public language: AppLanguageDto; public language: AppLanguageDto;
@Input() @Input()
public languages: AppLanguageDto[]; public languages: ImmutableArray<AppLanguageDto>;
public isModalVisibible = false; public isModalVisibible = false;

38
src/Squidex/app/shared/guards/load-languages.guard.spec.ts

@ -0,0 +1,38 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Observable } from 'rxjs';
import { IMock, Mock, Times } from 'typemoq';
import { LanguagesState } from '@app/shared';
import { LoadLanguagesGuard } from './load-languages.guard';
describe('LoadLanguagesGuard', () => {
let languagesState: IMock<LanguagesState>;
let languageGuard: LoadLanguagesGuard;
beforeEach(() => {
languagesState = Mock.ofType<LanguagesState>();
languageGuard = new LoadLanguagesGuard(languagesState.object);
});
it('should load languages', () => {
languagesState.setup(x => x.load())
.returns(() => Observable.of(null));
let result = false;
languageGuard.canActivate().subscribe(value => {
result = value;
});
expect(result).toBeTruthy();
languagesState.verify(x => x.load(), Times.once());
});
});

24
src/Squidex/app/shared/guards/load-languages.guard.ts

@ -0,0 +1,24 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { Observable } from 'rxjs';
import { LanguagesState } from './../state/languages.state';
@Injectable()
export class LoadLanguagesGuard implements CanActivate {
constructor(
private readonly languagesState: LanguagesState
) {
}
public canActivate(): Observable<boolean> {
return this.languagesState.load().map(a => true);
}
}

42
src/Squidex/app/shared/guards/resolve-app-languages.guard.ts

@ -1,42 +0,0 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, Router } from '@angular/router';
import { Observable } from 'rxjs';
import { allParams } from '@app/framework';
import { AppLanguageDto, AppLanguagesService } from './../services/app-languages.service';
@Injectable()
export class ResolveAppLanguagesGuard implements Resolve<AppLanguageDto[] | null> {
constructor(
private readonly appLanguagesService: AppLanguagesService,
private readonly router: Router
) {
}
public resolve(route: ActivatedRouteSnapshot): Observable<AppLanguageDto[] | null> {
const appName = allParams(route)['appName'];
const result =
this.appLanguagesService.getLanguages(appName).map(d => d.languages)
.do(dto => {
if (!dto) {
this.router.navigate(['/404']);
}
})
.catch(error => {
this.router.navigate(['/404']);
return Observable.of(null);
});
return result;
}
}

2
src/Squidex/app/shared/internal.ts

@ -7,9 +7,9 @@
export * from './guards/app-must-exist.guard'; export * from './guards/app-must-exist.guard';
export * from './guards/load-apps.guard'; export * from './guards/load-apps.guard';
export * from './guards/load-languages.guard';
export * from './guards/must-be-authenticated.guard'; export * from './guards/must-be-authenticated.guard';
export * from './guards/must-be-not-authenticated.guard'; export * from './guards/must-be-not-authenticated.guard';
export * from './guards/resolve-app-languages.guard';
export * from './guards/resolve-content.guard'; export * from './guards/resolve-content.guard';
export * from './guards/schema-must-exist-published.guard'; export * from './guards/schema-must-exist-published.guard';
export * from './guards/schema-must-exist.guard'; export * from './guards/schema-must-exist.guard';

4
src/Squidex/app/shared/module.ts

@ -47,13 +47,13 @@ import {
LanguagesService, LanguagesService,
LanguagesState, LanguagesState,
LoadAppsGuard, LoadAppsGuard,
LoadLanguagesGuard,
MarkdownEditorComponent, MarkdownEditorComponent,
MustBeAuthenticatedGuard, MustBeAuthenticatedGuard,
MustBeNotAuthenticatedGuard, MustBeNotAuthenticatedGuard,
PatternsState, PatternsState,
PlansService, PlansService,
PlansState, PlansState,
ResolveAppLanguagesGuard,
ResolveContentGuard, ResolveContentGuard,
RichEditorComponent, RichEditorComponent,
RulesService, RulesService,
@ -154,12 +154,12 @@ export class SqxSharedModule {
LanguagesService, LanguagesService,
LanguagesState, LanguagesState,
LoadAppsGuard, LoadAppsGuard,
LoadLanguagesGuard,
MustBeAuthenticatedGuard, MustBeAuthenticatedGuard,
MustBeNotAuthenticatedGuard, MustBeNotAuthenticatedGuard,
PatternsState, PatternsState,
PlansService, PlansService,
PlansState, PlansState,
ResolveAppLanguagesGuard,
ResolveContentGuard, ResolveContentGuard,
RulesService, RulesService,
RulesState, RulesState,

Loading…
Cancel
Save