Browse Source

Separate files for forms.

pull/297/head
Sebastian 8 years ago
parent
commit
a5427a5598
  1. 8
      src/Squidex/app/shared/internal.ts
  2. 30
      src/Squidex/app/shared/state/apps.forms.ts
  3. 26
      src/Squidex/app/shared/state/apps.state.ts
  4. 22
      src/Squidex/app/shared/state/assets.forms.ts
  5. 14
      src/Squidex/app/shared/state/assets.state.ts
  6. 38
      src/Squidex/app/shared/state/clients.forms.ts
  7. 31
      src/Squidex/app/shared/state/clients.state.ts
  8. 196
      src/Squidex/app/shared/state/contents.forms.ts
  9. 184
      src/Squidex/app/shared/state/contents.state.ts
  10. 25
      src/Squidex/app/shared/state/contributors.forms.ts
  11. 17
      src/Squidex/app/shared/state/contributors.state.ts
  12. 45
      src/Squidex/app/shared/state/languages.forms.ts
  13. 38
      src/Squidex/app/shared/state/languages.state.ts
  14. 34
      src/Squidex/app/shared/state/patterns.forms.ts
  15. 27
      src/Squidex/app/shared/state/patterns.state.ts
  16. 128
      src/Squidex/app/shared/state/schemas.forms.ts
  17. 120
      src/Squidex/app/shared/state/schemas.state.ts

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

@ -39,17 +39,25 @@ export * from './services/usages.service';
export * from './services/users-provider.service'; export * from './services/users-provider.service';
export * from './services/users.service'; export * from './services/users.service';
export * from './state/apps.forms';
export * from './state/apps.state'; export * from './state/apps.state';
export * from './state/assets.forms';
export * from './state/assets.state'; export * from './state/assets.state';
export * from './state/backups.state'; export * from './state/backups.state';
export * from './state/clients.forms';
export * from './state/clients.state'; export * from './state/clients.state';
export * from './state/contents.forms';
export * from './state/contents.state'; export * from './state/contents.state';
export * from './state/contributors.forms';
export * from './state/contributors.state'; export * from './state/contributors.state';
export * from './state/languages.forms';
export * from './state/languages.state'; export * from './state/languages.state';
export * from './state/patterns.forms';
export * from './state/patterns.state'; export * from './state/patterns.state';
export * from './state/plans.state'; export * from './state/plans.state';
export * from './state/rule-events.state'; export * from './state/rule-events.state';
export * from './state/rules.state'; export * from './state/rules.state';
export * from './state/schemas.forms';
export * from './state/schemas.state'; export * from './state/schemas.state';
export * from './utils/messages'; export * from './utils/messages';

30
src/Squidex/app/shared/state/apps.forms.ts

@ -0,0 +1,30 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Form, ValidatorsEx } from '@app/framework';
const FALLBACK_NAME = 'my-app';
export class CreateAppForm extends Form<FormGroup> {
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).')
]
]
}));
}
}

26
src/Squidex/app/shared/state/apps.state.ts

@ -1,4 +1,3 @@
/* /*
* Squidex Headless CMS * Squidex Headless CMS
* *
@ -7,7 +6,6 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import '@app/framework/utils/rxjs-extensions'; import '@app/framework/utils/rxjs-extensions';
@ -15,10 +13,8 @@ import '@app/framework/utils/rxjs-extensions';
import { import {
DateTime, DateTime,
DialogService, DialogService,
Form,
ImmutableArray, ImmutableArray,
State, State
ValidatorsEx
} from '@app/framework'; } from '@app/framework';
import { import {
@ -27,26 +23,6 @@ import {
CreateAppDto CreateAppDto
} from './../services/apps.service'; } from './../services/apps.service';
const FALLBACK_NAME = 'my-app';
export class CreateAppForm extends Form<FormGroup> {
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 { interface Snapshot {
apps: ImmutableArray<AppDto>; apps: ImmutableArray<AppDto>;

22
src/Squidex/app/shared/state/assets.forms.ts

@ -0,0 +1,22 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Form } from '@app/framework';
export class RenameAssetForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
name: ['',
[
Validators.required
]
]
}));
}
}

14
src/Squidex/app/shared/state/assets.state.ts

@ -6,14 +6,12 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import '@app/framework/utils/rxjs-extensions'; import '@app/framework/utils/rxjs-extensions';
import { import {
DialogService, DialogService,
Form,
ImmutableArray, ImmutableArray,
Pager, Pager,
State State
@ -22,18 +20,6 @@ import {
import { AssetDto, AssetsService} from './../services/assets.service'; import { AssetDto, AssetsService} from './../services/assets.service';
import { AppsState } from './apps.state'; import { AppsState } from './apps.state';
export class RenameAssetForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
name: ['',
[
Validators.required
]
]
}));
}
}
interface Snapshot { interface Snapshot {
assets: ImmutableArray<AssetDto>; assets: ImmutableArray<AssetDto>;
assetsPager: Pager; assetsPager: Pager;

38
src/Squidex/app/shared/state/clients.forms.ts

@ -0,0 +1,38 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Form, ValidatorsEx } from '@app/framework';
export class RenameClientForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
name: ['',
[
Validators.required
]
]
}));
}
}
export class AttachClientForm extends Form<FormGroup> {
public hasNoName =
this.form.controls['name'].valueChanges.startWith('').map(x => !x || x.length === 0);
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
name: ['',
[
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).')
]
]
}));
}
}

31
src/Squidex/app/shared/state/clients.state.ts

@ -6,17 +6,14 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import '@app/framework/utils/rxjs-extensions'; import '@app/framework/utils/rxjs-extensions';
import { import {
DialogService, DialogService,
Form,
ImmutableArray, ImmutableArray,
State, State,
ValidatorsEx,
Version Version
} from '@app/framework'; } from '@app/framework';
@ -29,34 +26,6 @@ import {
UpdateAppClientDto UpdateAppClientDto
} from './../services/app-clients.service'; } from './../services/app-clients.service';
export class RenameClientForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
name: ['',
[
Validators.required
]
]
}));
}
}
export class AttachClientForm extends Form<FormGroup> {
public hasNoName =
this.form.controls['name'].valueChanges.startWith('').map(x => !x || x.length === 0);
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
name: ['',
[
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 { interface Snapshot {
clients: ImmutableArray<AppClientDto>; clients: ImmutableArray<AppClientDto>;

196
src/Squidex/app/shared/state/contents.forms.ts

@ -0,0 +1,196 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
// tslint:disable:prefer-for-of
import { FormArray, FormControl, FormGroup } from '@angular/forms';
import {
ErrorDto,
Form,
ImmutableArray,
Types
} from '@app/framework';
import { AppLanguageDto } from './../services/app-languages.service';
import { fieldInvariant, RootFieldDto, SchemaDetailsDto } from './../services/schemas.service';
export class EditContentForm extends Form<FormGroup> {
constructor(
private readonly schema: SchemaDetailsDto,
private readonly languages: ImmutableArray<AppLanguageDto>
) {
super(new FormGroup({}));
for (const field of schema.fields) {
const fieldForm = new FormGroup({});
const fieldDefault = field.defaultValue();
const createControl = (isOptional: boolean) => {
if (field.properties.fieldType === 'Array') {
return new FormArray([], field.createValidators(isOptional));
} else {
return new FormControl(fieldDefault, field.createValidators(isOptional));
}
};
if (field.isLocalizable) {
for (let language of this.languages.values) {
fieldForm.setControl(language.iso2Code, createControl(language.isOptional));
}
} else {
fieldForm.setControl(fieldInvariant, createControl(false));
}
this.form.setControl(field.name, fieldForm);
}
this.enableContentForm();
}
public removeArrayItem(field: RootFieldDto, language: AppLanguageDto, index: number) {
this.findArrayItemForm(field, language).removeAt(index);
}
public insertArrayItem(field: RootFieldDto, language: AppLanguageDto) {
if (field.nested.length > 0) {
const formControl = this.findArrayItemForm(field, language);
this.addArrayItem(field, language, formControl);
}
}
private addArrayItem(field: RootFieldDto, language: AppLanguageDto | null, formControl: FormArray) {
const formItem = new FormGroup({});
let isOptional = field.isLocalizable && language !== null && language.isOptional;
for (let nested of field.nested) {
const nestedDefault = field.defaultValue();
formItem.setControl(nested.name, new FormControl(nestedDefault, nested.createValidators(isOptional)));
}
formControl.push(formItem);
}
private findArrayItemForm(field: RootFieldDto, language: AppLanguageDto): FormArray {
const fieldForm = this.form.get(field.name)!;
if (field.isLocalizable) {
return <FormArray>fieldForm.get(language.iso2Code)!;
} else {
return <FormArray>fieldForm.get(fieldInvariant);
}
}
public submitCompleted(newValue?: any) {
super.submitCompleted(newValue);
this.enableContentForm();
}
public submitFailed(error?: string | ErrorDto) {
super.submitFailed(error);
this.enableContentForm();
}
public loadData(value: any, isArchive: boolean) {
for (let field of this.schema.fields) {
if (field.properties.fieldType === 'Array' && field.nested.length > 0) {
const fieldValue = value ? value[field.name] || {} : {};
const fieldForm = <FormGroup>this.form.get(field.name)!;
const addControls = (key: string, language: AppLanguageDto | null) => {
const languageValue = fieldValue[key];
const languageForm = new FormArray([]);
if (Types.isArray(languageValue)) {
for (let i = 0; i < languageValue.length; i++) {
this.addArrayItem(field, language, languageForm);
}
}
fieldForm.setControl(key, languageForm);
};
if (field.isLocalizable) {
for (let language of this.languages.values) {
addControls(language.iso2Code, language);
}
} else {
addControls(fieldInvariant, null);
}
}
}
super.load(value);
if (isArchive) {
this.form.disable();
} else {
this.enableContentForm();
}
}
private enableContentForm() {
if (this.schema.fields.length === 0) {
this.form.enable();
} else {
for (const field of this.schema.fields) {
const fieldForm = this.form.controls[field.name];
if (field.isDisabled) {
fieldForm.disable();
} else {
fieldForm.enable();
}
}
}
}
}
export class PatchContentForm extends Form<FormGroup> {
constructor(
private readonly schema: SchemaDetailsDto,
private readonly language: AppLanguageDto
) {
super(new FormGroup({}));
for (let field of this.schema.listFields) {
if (field.properties && field.properties['inlineEditable']) {
this.form.setControl(field.name, new FormControl(undefined, field.createValidators(this.language.isOptional)));
}
}
}
public submit() {
const result = super.submit();
if (result) {
const request = {};
for (let field of this.schema.listFields) {
if (field.properties['inlineEditable']) {
const value = result[field.name];
if (field.isLocalizable) {
request[field.name] = { [this.language.iso2Code]: value };
} else {
request[field.name] = { iv: value };
}
}
}
return request;
}
return result;
}
}

184
src/Squidex/app/shared/state/contents.state.ts

@ -5,10 +5,7 @@
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/ */
// tslint:disable:prefer-for-of
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { FormArray, FormControl, FormGroup } from '@angular/forms';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import '@app/framework/utils/rxjs-extensions'; import '@app/framework/utils/rxjs-extensions';
@ -16,199 +13,20 @@ import '@app/framework/utils/rxjs-extensions';
import { import {
DateTime, DateTime,
DialogService, DialogService,
ErrorDto,
Form,
ImmutableArray, ImmutableArray,
Pager, Pager,
State, State,
Types,
Version, Version,
Versioned Versioned
} from '@app/framework'; } from '@app/framework';
import { AppLanguageDto } from './../services/app-languages.service';
import { AuthService } from './../services/auth.service'; import { AuthService } from './../services/auth.service';
import { fieldInvariant, RootFieldDto, SchemaDetailsDto, SchemaDto } from './../services/schemas.service'; import { SchemaDto } from './../services/schemas.service';
import { AppsState } from './apps.state'; import { AppsState } from './apps.state';
import { SchemasState } from './schemas.state'; import { SchemasState } from './schemas.state';
import { ContentDto, ContentsService, ScheduleDto } from './../services/contents.service'; import { ContentDto, ContentsService, ScheduleDto } from './../services/contents.service';
export class EditContentForm extends Form<FormGroup> {
constructor(
private readonly schema: SchemaDetailsDto,
private readonly languages: ImmutableArray<AppLanguageDto>
) {
super(new FormGroup({}));
for (const field of schema.fields) {
const fieldForm = new FormGroup({});
const fieldDefault = field.defaultValue();
const createControl = (isOptional: boolean) => {
if (field.properties.fieldType === 'Array') {
return new FormArray([], field.createValidators(isOptional));
} else {
return new FormControl(fieldDefault, field.createValidators(isOptional));
}
};
if (field.isLocalizable) {
for (let language of this.languages.values) {
fieldForm.setControl(language.iso2Code, createControl(language.isOptional));
}
} else {
fieldForm.setControl(fieldInvariant, createControl(false));
}
this.form.setControl(field.name, fieldForm);
}
this.enableContentForm();
}
public removeArrayItem(field: RootFieldDto, language: AppLanguageDto, index: number) {
this.findArrayItemForm(field, language).removeAt(index);
}
public insertArrayItem(field: RootFieldDto, language: AppLanguageDto) {
if (field.nested.length > 0) {
const formControl = this.findArrayItemForm(field, language);
this.addArrayItem(field, language, formControl);
}
}
private addArrayItem(field: RootFieldDto, language: AppLanguageDto | null, formControl: FormArray) {
const formItem = new FormGroup({});
let isOptional = field.isLocalizable && language !== null && language.isOptional;
for (let nested of field.nested) {
const nestedDefault = field.defaultValue();
formItem.setControl(nested.name, new FormControl(nestedDefault, nested.createValidators(isOptional)));
}
formControl.push(formItem);
}
private findArrayItemForm(field: RootFieldDto, language: AppLanguageDto): FormArray {
const fieldForm = this.form.get(field.name)!;
if (field.isLocalizable) {
return <FormArray>fieldForm.get(language.iso2Code)!;
} else {
return <FormArray>fieldForm.get(fieldInvariant);
}
}
public submitCompleted(newValue?: any) {
super.submitCompleted(newValue);
this.enableContentForm();
}
public submitFailed(error?: string | ErrorDto) {
super.submitFailed(error);
this.enableContentForm();
}
public loadData(value: any, isArchive: boolean) {
for (let field of this.schema.fields) {
if (field.properties.fieldType === 'Array' && field.nested.length > 0) {
const fieldValue = value ? value[field.name] || {} : {};
const fieldForm = <FormGroup>this.form.get(field.name)!;
const addControls = (key: string, language: AppLanguageDto | null) => {
const languageValue = fieldValue[key];
const languageForm = new FormArray([]);
if (Types.isArray(languageValue)) {
for (let i = 0; i < languageValue.length; i++) {
this.addArrayItem(field, language, languageForm);
}
}
fieldForm.setControl(key, languageForm);
};
if (field.isLocalizable) {
for (let language of this.languages.values) {
addControls(language.iso2Code, language);
}
} else {
addControls(fieldInvariant, null);
}
}
}
super.load(value);
if (isArchive) {
this.form.disable();
} else {
this.enableContentForm();
}
}
private enableContentForm() {
if (this.schema.fields.length === 0) {
this.form.enable();
} else {
for (const field of this.schema.fields) {
const fieldForm = this.form.controls[field.name];
if (field.isDisabled) {
fieldForm.disable();
} else {
fieldForm.enable();
}
}
}
}
}
export class PatchContentForm extends Form<FormGroup> {
constructor(
private readonly schema: SchemaDetailsDto,
private readonly language: AppLanguageDto
) {
super(new FormGroup({}));
for (let field of this.schema.listFields) {
if (field.properties && field.properties['inlineEditable']) {
this.form.setControl(field.name, new FormControl(undefined, field.createValidators(this.language.isOptional)));
}
}
}
public submit() {
const result = super.submit();
if (result) {
const request = {};
for (let field of this.schema.listFields) {
if (field.properties['inlineEditable']) {
const value = result[field.name];
if (field.isLocalizable) {
request[field.name] = { [this.language.iso2Code]: value };
} else {
request[field.name] = { iv: value };
}
}
}
return request;
}
return result;
}
}
interface Snapshot { interface Snapshot {
contents: ImmutableArray<ContentDto>; contents: ImmutableArray<ContentDto>;
contentsPager: Pager; contentsPager: Pager;

25
src/Squidex/app/shared/state/contributors.forms.ts

@ -0,0 +1,25 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Form } from '@app/framework';
export class AssignContributorForm extends Form<FormGroup> {
public hasNoUser =
this.form.controls['user'].valueChanges.startWith(null).map(x => !x);
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
user: [null,
[
Validators.required
]
]
}));
}
}

17
src/Squidex/app/shared/state/contributors.state.ts

@ -6,14 +6,12 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import '@app/framework/utils/rxjs-extensions'; import '@app/framework/utils/rxjs-extensions';
import { import {
DialogService, DialogService,
Form,
ImmutableArray, ImmutableArray,
State, State,
Version Version
@ -23,21 +21,6 @@ import { AppContributorDto, AppContributorsService } from './../services/app-con
import { AuthService } from './../services/auth.service'; import { AuthService } from './../services/auth.service';
import { AppsState } from './apps.state'; import { AppsState } from './apps.state';
export class AssignContributorForm extends Form<FormGroup> {
public hasNoUser =
this.form.controls['user'].valueChanges.startWith(null).map(x => !x);
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
user: [null,
[
Validators.required
]
]
}));
}
}
interface SnapshotContributor { interface SnapshotContributor {
contributor: AppContributorDto; contributor: AppContributorDto;

45
src/Squidex/app/shared/state/languages.forms.ts

@ -0,0 +1,45 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Form } from '@app/framework';
export class EditLanguageForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
isMaster: false,
isOptional: false
}));
this.form.controls['isMaster'].valueChanges
.subscribe(value => {
if (value) {
this.form.controls['isOptional'].setValue(false);
}
});
this.form.controls['isOptional'].valueChanges
.subscribe(value => {
if (value) {
this.form.controls['isMaster'].setValue(false);
}
});
}
}
export class AddLanguageForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
language: [null,
[
Validators.required
]
]
}));
}
}

38
src/Squidex/app/shared/state/languages.state.ts

@ -6,14 +6,12 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import '@app/framework/utils/rxjs-extensions'; import '@app/framework/utils/rxjs-extensions';
import { import {
DialogService, DialogService,
Form,
ImmutableArray, ImmutableArray,
State, State,
Version Version
@ -23,42 +21,6 @@ import { AddAppLanguageDto, AppLanguageDto, AppLanguagesService, UpdateAppLangua
import { LanguageDto, LanguagesService } from './../services/languages.service'; import { LanguageDto, LanguagesService } from './../services/languages.service';
import { AppsState } from './apps.state'; import { AppsState } from './apps.state';
export class EditLanguageForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
isMaster: false,
isOptional: false
}));
this.form.controls['isMaster'].valueChanges
.subscribe(value => {
if (value) {
this.form.controls['isOptional'].setValue(false);
}
});
this.form.controls['isOptional'].valueChanges
.subscribe(value => {
if (value) {
this.form.controls['isMaster'].setValue(false);
}
});
}
}
export class AddLanguageForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
language: [null,
[
Validators.required
]
]
}));
}
}
interface SnapshotLanguage { interface SnapshotLanguage {
language: AppLanguageDto; language: AppLanguageDto;

34
src/Squidex/app/shared/state/patterns.forms.ts

@ -0,0 +1,34 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Form, ValidatorsEx } from '@app/framework';
export class EditPatternForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
name: ['',
[
Validators.required,
Validators.maxLength(100),
ValidatorsEx.pattern('[A-z0-9]+[A-z0-9\- ]*[A-z0-9]', 'Name can only contain letters, numbers, dashes and spaces.')
]
],
pattern: ['',
[
Validators.required
]
],
message: ['',
[
Validators.maxLength(1000)
]
]
}));
}
}

27
src/Squidex/app/shared/state/patterns.state.ts

@ -6,17 +6,14 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import '@app/framework/utils/rxjs-extensions'; import '@app/framework/utils/rxjs-extensions';
import { import {
DialogService, DialogService,
Form,
ImmutableArray, ImmutableArray,
State, State,
ValidatorsEx,
Version Version
} from '@app/framework'; } from '@app/framework';
@ -28,30 +25,6 @@ import {
EditAppPatternDto EditAppPatternDto
} from './../services/app-patterns.service'; } from './../services/app-patterns.service';
export class EditPatternForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
name: ['',
[
Validators.required,
Validators.maxLength(100),
ValidatorsEx.pattern('[A-z0-9]+[A-z0-9\- ]*[A-z0-9]', 'Name can only contain letters, numbers, dashes and spaces.')
]
],
pattern: ['',
[
Validators.required
]
],
message: ['',
[
Validators.maxLength(1000)
]
]
}));
}
}
interface Snapshot { interface Snapshot {
patterns: ImmutableArray<AppPatternDto>; patterns: ImmutableArray<AppPatternDto>;

128
src/Squidex/app/shared/state/schemas.forms.ts

@ -0,0 +1,128 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Form, ValidatorsEx } from '@app/framework';
import { createProperties } from './../services/schemas.service';
const FALLBACK_NAME = 'my-schema';
export class CreateCategoryForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
name: ['']
}));
}
}
export class CreateSchemaForm extends Form<FormGroup> {
public schemaName =
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 only (not at the end).')
]
],
import: {}
}));
}
}
export class EditScriptsForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
scriptQuery: '',
scriptCreate: '',
scriptUpdate: '',
scriptDelete: '',
scriptChange: ''
}));
}
}
export class EditFieldForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
label: ['',
[
Validators.maxLength(100)
]
],
hints: ['',
[
Validators.maxLength(1000)
]
],
placeholder: ['',
[
Validators.maxLength(1000)
]
],
editorUrl: null,
isRequired: false,
isListField: false
}));
}
}
export class EditSchemaForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
label: ['',
[
Validators.maxLength(100)
]
],
hints: ['',
[
Validators.maxLength(1000)
]
]
}));
}
}
export class AddFieldForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
type: ['String',
[
Validators.required
]
],
name: ['',
[
Validators.required,
Validators.maxLength(40),
ValidatorsEx.pattern('[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*', 'Name must be a valid javascript name in camel case.')
]
],
isLocalizable: false
}));
}
public submit() {
const value = super.submit();
if (value) {
const properties = createProperties(value.type);
const partitioning = value.isLocalizable ? 'language' : 'invariant';
return { name: value.name, partitioning, properties };
}
return null;
}
}

120
src/Squidex/app/shared/state/schemas.state.ts

@ -6,7 +6,6 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import '@app/framework/utils/rxjs-extensions'; import '@app/framework/utils/rxjs-extensions';
@ -14,11 +13,9 @@ import '@app/framework/utils/rxjs-extensions';
import { import {
DateTime, DateTime,
DialogService, DialogService,
Form,
ImmutableArray, ImmutableArray,
State, State,
Types, Types,
ValidatorsEx,
Version Version
} from '@app/framework'; } from '@app/framework';
@ -28,7 +25,6 @@ import { AppsState } from './apps.state';
import { import {
AddFieldDto, AddFieldDto,
AnyFieldDto, AnyFieldDto,
createProperties,
CreateSchemaDto, CreateSchemaDto,
FieldDto, FieldDto,
FieldPropertiesDto, FieldPropertiesDto,
@ -44,122 +40,6 @@ import {
UpdateSchemaScriptsDto UpdateSchemaScriptsDto
} from './../services/schemas.service'; } from './../services/schemas.service';
const FALLBACK_NAME = 'my-schema';
export class CreateCategoryForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
name: ['']
}));
}
}
export class CreateSchemaForm extends Form<FormGroup> {
public schemaName =
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 only (not at the end).')
]
],
import: {}
}));
}
}
export class EditScriptsForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
scriptQuery: '',
scriptCreate: '',
scriptUpdate: '',
scriptDelete: '',
scriptChange: ''
}));
}
}
export class EditFieldForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
label: ['',
[
Validators.maxLength(100)
]
],
hints: ['',
[
Validators.maxLength(1000)
]
],
placeholder: ['',
[
Validators.maxLength(1000)
]
],
editorUrl: null,
isRequired: false,
isListField: false
}));
}
}
export class EditSchemaForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
label: ['',
[
Validators.maxLength(100)
]
],
hints: ['',
[
Validators.maxLength(1000)
]
]
}));
}
}
export class AddFieldForm extends Form<FormGroup> {
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
type: ['String',
[
Validators.required
]
],
name: ['',
[
Validators.required,
Validators.maxLength(40),
ValidatorsEx.pattern('[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*', 'Name must be a valid javascript name in camel case.')
]
],
isLocalizable: false
}));
}
public submit() {
const value = super.submit();
if (value) {
const properties = createProperties(value.type);
const partitioning = value.isLocalizable ? 'language' : 'invariant';
return { name: value.name, partitioning, properties };
}
return null;
}
}
interface Snapshot { interface Snapshot {
categories: { [name: string]: boolean }; categories: { [name: string]: boolean };

Loading…
Cancel
Save