diff --git a/src/Squidex/app/features/administration/pages/users/user-page.component.ts b/src/Squidex/app/features/administration/pages/users/user-page.component.ts index 32a36e441..a3ddb2714 100644 --- a/src/Squidex/app/features/administration/pages/users/user-page.component.ts +++ b/src/Squidex/app/features/administration/pages/users/user-page.component.ts @@ -22,14 +22,14 @@ export class UserPageComponent implements OnDestroy, OnInit { private selectedUserSubscription: Subscription; private user?: UserDto; - public userForm: UserForm; + public userForm = new UserForm(this.formBuilder); - constructor(formBuilder: FormBuilder, + constructor( public readonly usersState: UsersState, + private readonly formBuilder: FormBuilder, private readonly route: ActivatedRoute, private readonly router: Router ) { - this.userForm = new UserForm(formBuilder); } public ngOnDestroy() { diff --git a/src/Squidex/app/features/apps/pages/apps-page.component.html b/src/Squidex/app/features/apps/pages/apps-page.component.html index b27a6d1d3..abf3e0f62 100644 --- a/src/Squidex/app/features/apps/pages/apps-page.component.html +++ b/src/Squidex/app/features/apps/pages/apps-page.component.html @@ -81,5 +81,5 @@ - + \ No newline at end of file diff --git a/src/Squidex/app/features/apps/pages/onboarding-dialog.component.html b/src/Squidex/app/features/apps/pages/onboarding-dialog.component.html index f58c2dc71..e8c29068a 100644 --- a/src/Squidex/app/features/apps/pages/onboarding-dialog.component.html +++ b/src/Squidex/app/features/apps/pages/onboarding-dialog.component.html @@ -1,6 +1,6 @@ - Skip Tour + Skip Tour
diff --git a/src/Squidex/app/features/apps/pages/onboarding-dialog.component.ts b/src/Squidex/app/features/apps/pages/onboarding-dialog.component.ts index 53fe2a8d7..fa8bde035 100644 --- a/src/Squidex/app/features/apps/pages/onboarding-dialog.component.ts +++ b/src/Squidex/app/features/apps/pages/onboarding-dialog.component.ts @@ -21,7 +21,11 @@ export class OnboardingDialogComponent { public step = 0; @Output() - public close = new EventEmitter(); + public closed = new EventEmitter(); + + public close() { + this.closed.emit(); + } public next() { this.step = this.step + 1; diff --git a/src/Squidex/app/features/schemas/pages/schema/field-wizard.component.ts b/src/Squidex/app/features/schemas/pages/schema/field-wizard.component.ts index 7f1b32832..e3d65a2a0 100644 --- a/src/Squidex/app/features/schemas/pages/schema/field-wizard.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/field-wizard.component.ts @@ -32,12 +32,12 @@ export class FieldWizardComponent { public fieldTypes = fieldTypes; - public addFieldForm: AddFieldForm; + public addFieldForm = new AddFieldForm(this.formBuilder); - constructor(formBuilder: FormBuilder, + constructor( + private readonly formBuilder: FormBuilder, private readonly schemasState: SchemasState ) { - this.addFieldForm = new AddFieldForm(formBuilder); } public complete() { diff --git a/src/Squidex/app/features/schemas/pages/schema/schema-edit-form.component.ts b/src/Squidex/app/features/schemas/pages/schema/schema-edit-form.component.ts index d84a15cdf..472171023 100644 --- a/src/Squidex/app/features/schemas/pages/schema/schema-edit-form.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/schema-edit-form.component.ts @@ -26,12 +26,12 @@ export class SchemaEditFormComponent implements OnInit { @Input() public schema: SchemaDetailsDto; - public editForm: EditSchemaForm; + public editForm = new EditSchemaForm(this.formBuilder); - constructor(formBuilder: FormBuilder, + constructor( + private readonly formBuilder: FormBuilder, private readonly schemasState: SchemasState ) { - this.editForm = new EditSchemaForm(formBuilder); } public ngOnInit() { diff --git a/src/Squidex/app/features/schemas/pages/schema/schema-scripts-form.component.ts b/src/Squidex/app/features/schemas/pages/schema/schema-scripts-form.component.ts index fe3900e63..977f9d3de 100644 --- a/src/Squidex/app/features/schemas/pages/schema/schema-scripts-form.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/schema-scripts-form.component.ts @@ -28,12 +28,12 @@ export class SchemaScriptsFormComponent implements OnInit { public selectedField = 'scriptQuery'; - public editForm: EditScriptsForm; + public editForm = new EditScriptsForm(this.formBuilder); - constructor(formBuilder: FormBuilder, + constructor( + private readonly formBuilder: FormBuilder, private readonly schemasState: SchemasState ) { - this.editForm = new EditScriptsForm(formBuilder); } public ngOnInit() { diff --git a/src/Squidex/app/features/schemas/pages/schemas/schema-form.component.ts b/src/Squidex/app/features/schemas/pages/schemas/schema-form.component.ts index 972d261ff..d4335701d 100644 --- a/src/Squidex/app/features/schemas/pages/schemas/schema-form.component.ts +++ b/src/Squidex/app/features/schemas/pages/schemas/schema-form.component.ts @@ -31,16 +31,16 @@ export class SchemaFormComponent implements OnInit { @Input() public import: any; - public createForm: CreateSchemaForm; + public createForm = new CreateSchemaForm(this.formBuilder); public showImport = false; - constructor(formBuilder: FormBuilder, + constructor( public readonly apiUrl: ApiUrlConfig, public readonly appsState: AppsState, + private readonly formBuilder: FormBuilder, private readonly schemasState: SchemasState ) { - this.createForm = new CreateSchemaForm(formBuilder); } public ngOnInit() { diff --git a/src/Squidex/app/shared/components/app-form.component.html b/src/Squidex/app/shared/components/app-form.component.html index b91f37c5d..9832efe5e 100644 --- a/src/Squidex/app/shared/components/app-form.component.html +++ b/src/Squidex/app/shared/components/app-form.component.html @@ -1,4 +1,4 @@ -
+ @@ -11,17 +11,17 @@ - +
- + - The app name becomes part of the api url,
e.g {{apiUrl.buildUrl("api/content/")}}{{appName | async}}/. + The app name becomes part of the api url,
e.g {{apiUrl.buildUrl("api/content/")}}{{createForm.appName | async}}/.
diff --git a/src/Squidex/app/shared/components/app-form.component.ts b/src/Squidex/app/shared/components/app-form.component.ts index 8de8e464e..01a2d56cf 100644 --- a/src/Squidex/app/shared/components/app-form.component.ts +++ b/src/Squidex/app/shared/components/app-form.component.ts @@ -6,17 +6,15 @@ */ import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { FormBuilder, Validators } from '@angular/forms'; +import { FormBuilder } from '@angular/forms'; import { ApiUrlConfig, AppsState, CreateAppDto, - ValidatorsEx + CreateAppForm } from '@app/shared/internal'; -const FALLBACK_NAME = 'my-app'; - @Component({ selector: 'sqx-app-form', styleUrls: ['./app-form.component.scss'], @@ -29,22 +27,7 @@ export class AppFormComponent { @Input() public template = ''; - public createFormError = ''; - public createFormSubmitted = false; - public createForm = - this.formBuilder.group({ - name: ['', - [ - Validators.required, - Validators.maxLength(40), - ValidatorsEx.pattern('[a-z0-9]+(\-[a-z0-9]+)*', 'Name can contain lower case letters (a-z), numbers and dashes (not at the end).') - ] - ] - }); - - public appName = - this.createForm.controls['name'].valueChanges.map(n => n || FALLBACK_NAME) - .startWith(FALLBACK_NAME); + public createForm = new CreateAppForm(this.formBuilder); constructor(public readonly apiUrl: ApiUrlConfig, private readonly appsStore: AppsState, @@ -57,25 +40,17 @@ export class AppFormComponent { } public createApp() { - this.createFormSubmitted = true; - - if (this.createForm.valid) { - this.createForm.disable(); + const value = this.createForm.submit(); - const request = new CreateAppDto(this.createForm.controls['name'].value, this.template); + if (value) { + const request = new CreateAppDto(value.name, this.template); this.appsStore.createApp(request) .subscribe(dto => { this.complete(); }, error => { - this.enableCreateForm(error.displayMessage); + this.createForm.submitFailed(error); }); } } - - private enableCreateForm(message: string) { - this.createForm.enable(); - this.createFormSubmitted = false; - this.createFormError = message; - } } \ No newline at end of file diff --git a/src/Squidex/app/shared/state/apps.state.ts b/src/Squidex/app/shared/state/apps.state.ts index a0fd69bc4..47a517c62 100644 --- a/src/Squidex/app/shared/state/apps.state.ts +++ b/src/Squidex/app/shared/state/apps.state.ts @@ -6,15 +6,18 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -import '@app/framework/utils/rxjs-extensions'; - import { Injectable } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Observable } from 'rxjs'; +import '@app/framework/utils/rxjs-extensions'; + import { DateTime, + Form, ImmutableArray, - State + State, + ValidatorsEx } from '@app/framework'; import { @@ -23,6 +26,26 @@ import { CreateAppDto } from './../services/apps.service'; +const FALLBACK_NAME = 'my-app'; + +export class CreateAppForm extends Form { + public appName = + this.form.controls['name'].valueChanges.map(n => n || FALLBACK_NAME) + .startWith(FALLBACK_NAME); + + constructor(formBuilder: FormBuilder) { + super(formBuilder.group({ + name: ['', + [ + Validators.required, + Validators.maxLength(40), + ValidatorsEx.pattern('[a-z0-9]+(\-[a-z0-9]+)*', 'Name can contain lower case letters (a-z), numbers and dashes (not at the end).') + ] + ] + })); + } +} + interface Snapshot { apps: ImmutableArray;