From 122cad7586a20c6b7316b319db4c295abc47b26d Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 18 Jan 2017 07:27:28 +0100 Subject: [PATCH] Cleanup --- src/Squidex.Core/Contents/ContentData.cs | 2 +- src/Squidex.Core/Schemas/FieldProperties.cs | 12 +++ src/Squidex.Core/Schemas/Schema.cs | 2 +- src/Squidex.Read/Contents/IContentEntity.cs | 2 +- .../{Repositories => }/ISchemaEntity.cs | 3 +- .../ISchemaEntityWithSchema.cs | 2 +- .../Schemas/Services/ISchemaProvider.cs | 1 - .../Implementations/CachingSchemaProvider.cs | 6 +- .../Contents/MongoContentEntity.cs | 14 +++ .../Schemas/MongoSchemaEntity.cs | 2 +- .../Schemas/MongoSchemaRepository.cs | 1 + .../Models/Converters/SchemaConverter.cs | 2 +- .../Api/Schemas/Models/FieldPropertiesDto.cs | 10 +++ .../Generator/SchemasSwaggerGenerator.cs | 2 +- src/Squidex/Properties/launchSettings.json | 1 + .../app/features/content/declarations.ts | 1 + src/Squidex/app/features/content/module.ts | 9 +- .../content/content-field.component.html | 86 +++++++++++++++++++ .../content/content-field.component.scss | 22 +++++ .../pages/content/content-field.component.ts | 56 ++++++++++++ .../pages/content/content-page.component.html | 86 +++---------------- .../pages/content/content-page.component.scss | 4 - .../pages/content/content-page.component.ts | 49 +++++++++-- .../contents/contents-page.component.html | 75 ++++++++++++++-- .../contents/contents-page.component.scss | 22 ++++- .../pages/contents/contents-page.component.ts | 83 +++++++++++++++++- .../app/features/content/pages/messages.ts | 8 ++ .../pages/schemas/schemas-page.component.html | 4 +- .../pages/schemas/schemas-page.component.scss | 13 +-- .../schemas/pages/schema/field.component.html | 16 ++++ .../schemas/pages/schema/field.component.scss | 4 +- .../schemas/pages/schema/field.component.ts | 4 +- .../pages/schema/schema-page.component.html | 6 +- .../pages/schemas/schemas-page.component.html | 5 +- .../pages/schemas/schemas-page.component.scss | 31 ++----- .../pages/clients/client.component.html | 2 +- .../pages/clients/client.component.scss | 2 + .../pages/clients/clients-page.component.html | 10 ++- .../pages/clients/clients-page.component.scss | 5 -- .../contributors-page.component.html | 12 +-- .../languages/languages-page.component.html | 10 ++- .../settings/settings-area.component.html | 10 ++- .../angular/control-errors.component.ts | 8 +- src/Squidex/app/shared/app-component-base.ts | 28 +++++- .../shared/components/history.component.html | 12 +-- src/Squidex/app/shared/declarations.ts | 1 + .../resolve-app-languages.guard.spec.ts | 83 ++++++++++++++++++ .../guards/resolve-app-languages.guard.ts | 62 +++++++++++++ src/Squidex/app/shared/module.ts | 2 + .../shared/services/contents.service.spec.ts | 49 ++++++----- .../app/shared/services/contents.service.ts | 16 +++- .../app/shared/services/schemas.service.ts | 31 ++++--- src/Squidex/app/theme/_panels.scss | 19 ++-- src/Squidex/app/theme/_vars.scss | 2 +- src/Squidex/app/theme/_vendor-overrides.scss | 4 + .../Contents/ContentDataTests.cs | 31 ++++++- .../Contents/ContentCommandHandlerTests.cs | 2 +- .../Schemas/SchemaCommandHandlerTests.cs | 2 +- 58 files changed, 814 insertions(+), 235 deletions(-) rename src/Squidex.Read/Schemas/{Repositories => }/ISchemaEntity.cs (92%) rename src/Squidex.Read/Schemas/{Repositories => }/ISchemaEntityWithSchema.cs (91%) create mode 100644 src/Squidex/app/features/content/pages/content/content-field.component.html create mode 100644 src/Squidex/app/features/content/pages/content/content-field.component.scss create mode 100644 src/Squidex/app/features/content/pages/content/content-field.component.ts create mode 100644 src/Squidex/app/features/content/pages/messages.ts create mode 100644 src/Squidex/app/shared/guards/resolve-app-languages.guard.spec.ts create mode 100644 src/Squidex/app/shared/guards/resolve-app-languages.guard.ts diff --git a/src/Squidex.Core/Contents/ContentData.cs b/src/Squidex.Core/Contents/ContentData.cs index 1c8563dad..8d1cd11cd 100644 --- a/src/Squidex.Core/Contents/ContentData.cs +++ b/src/Squidex.Core/Contents/ContentData.cs @@ -62,7 +62,7 @@ namespace Squidex.Core.Contents { Field field; - if (!schema.FieldsByName.TryGetValue(fieldValue.Key, out field)) + if (!schema.FieldsByName.TryGetValue(fieldValue.Key, out field) || field.IsHidden) { continue; } diff --git a/src/Squidex.Core/Schemas/FieldProperties.cs b/src/Squidex.Core/Schemas/FieldProperties.cs index 934be3a78..f82590468 100644 --- a/src/Squidex.Core/Schemas/FieldProperties.cs +++ b/src/Squidex.Core/Schemas/FieldProperties.cs @@ -15,6 +15,7 @@ namespace Squidex.Core.Schemas { private bool isRequired; private bool isLocalizable; + private bool isListField; private string placeholder; public bool IsRequired @@ -39,6 +40,17 @@ namespace Squidex.Core.Schemas } } + public bool IsListField + { + get { return isListField; } + set + { + ThrowIfFrozen(); + + isListField = value; + } + } + public string Placeholder { get { return placeholder; } diff --git a/src/Squidex.Core/Schemas/Schema.cs b/src/Squidex.Core/Schemas/Schema.cs index 455a4ac89..e9d094697 100644 --- a/src/Squidex.Core/Schemas/Schema.cs +++ b/src/Squidex.Core/Schemas/Schema.cs @@ -180,7 +180,7 @@ namespace Squidex.Core.Schemas var schema = new JsonSchema4 { Id = Name, Type = JsonObjectType.Object }; - foreach (var field in fieldsByName.Values) + foreach (var field in fieldsByName.Values.Where(x => !x.IsHidden)) { field.AddToSchema(schema, languages, Name, schemaResolver); } diff --git a/src/Squidex.Read/Contents/IContentEntity.cs b/src/Squidex.Read/Contents/IContentEntity.cs index 7d1bce4cf..78460b80e 100644 --- a/src/Squidex.Read/Contents/IContentEntity.cs +++ b/src/Squidex.Read/Contents/IContentEntity.cs @@ -10,7 +10,7 @@ using Squidex.Core.Contents; namespace Squidex.Read.Contents { - public interface IContentEntity : IEntity + public interface IContentEntity : IAppRefEntity, ITrackCreatedByEntity, ITrackLastModifiedByEntity { bool IsPublished { get; } diff --git a/src/Squidex.Read/Schemas/Repositories/ISchemaEntity.cs b/src/Squidex.Read/Schemas/ISchemaEntity.cs similarity index 92% rename from src/Squidex.Read/Schemas/Repositories/ISchemaEntity.cs rename to src/Squidex.Read/Schemas/ISchemaEntity.cs index bf3c1a43f..33c5479ce 100644 --- a/src/Squidex.Read/Schemas/Repositories/ISchemaEntity.cs +++ b/src/Squidex.Read/Schemas/ISchemaEntity.cs @@ -5,7 +5,8 @@ // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== -namespace Squidex.Read.Schemas.Repositories + +namespace Squidex.Read.Schemas { public interface ISchemaEntity : IAppRefEntity, ITrackCreatedByEntity, ITrackLastModifiedByEntity { diff --git a/src/Squidex.Read/Schemas/Repositories/ISchemaEntityWithSchema.cs b/src/Squidex.Read/Schemas/ISchemaEntityWithSchema.cs similarity index 91% rename from src/Squidex.Read/Schemas/Repositories/ISchemaEntityWithSchema.cs rename to src/Squidex.Read/Schemas/ISchemaEntityWithSchema.cs index 6d6d503d1..78f3abf0e 100644 --- a/src/Squidex.Read/Schemas/Repositories/ISchemaEntityWithSchema.cs +++ b/src/Squidex.Read/Schemas/ISchemaEntityWithSchema.cs @@ -8,7 +8,7 @@ using Squidex.Core.Schemas; -namespace Squidex.Read.Schemas.Repositories +namespace Squidex.Read.Schemas { public interface ISchemaEntityWithSchema : ISchemaEntity { diff --git a/src/Squidex.Read/Schemas/Services/ISchemaProvider.cs b/src/Squidex.Read/Schemas/Services/ISchemaProvider.cs index 44e10d732..2d155f57b 100644 --- a/src/Squidex.Read/Schemas/Services/ISchemaProvider.cs +++ b/src/Squidex.Read/Schemas/Services/ISchemaProvider.cs @@ -8,7 +8,6 @@ using System; using System.Threading.Tasks; -using Squidex.Read.Schemas.Repositories; namespace Squidex.Read.Schemas.Services { diff --git a/src/Squidex.Read/Schemas/Services/Implementations/CachingSchemaProvider.cs b/src/Squidex.Read/Schemas/Services/Implementations/CachingSchemaProvider.cs index dad421ada..404e2c418 100644 --- a/src/Squidex.Read/Schemas/Services/Implementations/CachingSchemaProvider.cs +++ b/src/Squidex.Read/Schemas/Services/Implementations/CachingSchemaProvider.cs @@ -89,7 +89,11 @@ namespace Squidex.Read.Schemas.Services.Implementations public Task On(Envelope @event) { - if (@event.Payload is SchemaDeleted) + if (@event.Payload is SchemaDeleted || + @event.Payload is SchemaPublished || + @event.Payload is SchemaUnpublished || + @event.Payload is SchemaUpdated || + @event.Payload is FieldEvent) { var cacheKey = BuildIdCacheKey(@event.Headers.AggregateId()); diff --git a/src/Squidex.Store.MongoDb/Contents/MongoContentEntity.cs b/src/Squidex.Store.MongoDb/Contents/MongoContentEntity.cs index 05d1c299d..90cad7e46 100644 --- a/src/Squidex.Store.MongoDb/Contents/MongoContentEntity.cs +++ b/src/Squidex.Store.MongoDb/Contents/MongoContentEntity.cs @@ -6,6 +6,7 @@ // All rights reserved. // ========================================================================== +using System; using System.Linq; using System.Text; using MongoDB.Bson; @@ -13,6 +14,7 @@ using MongoDB.Bson.Serialization.Attributes; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Squidex.Core.Contents; +using Squidex.Infrastructure; using Squidex.Infrastructure.MongoDb; using Squidex.Read.Contents; // ReSharper disable InvertIf @@ -36,6 +38,18 @@ namespace Squidex.Store.MongoDb.Contents [BsonElement] public string Text { get; set; } + [BsonRequired] + [BsonElement] + public Guid AppId { get; set; } + + [BsonRequired] + [BsonElement] + public RefToken CreatedBy { get; set; } + + [BsonRequired] + [BsonElement] + public RefToken LastModifiedBy { get; set; } + [BsonRequired] [BsonElement] public BsonDocument Data diff --git a/src/Squidex.Store.MongoDb/Schemas/MongoSchemaEntity.cs b/src/Squidex.Store.MongoDb/Schemas/MongoSchemaEntity.cs index 9e7409b26..fa631a8f2 100644 --- a/src/Squidex.Store.MongoDb/Schemas/MongoSchemaEntity.cs +++ b/src/Squidex.Store.MongoDb/Schemas/MongoSchemaEntity.cs @@ -13,7 +13,7 @@ using Squidex.Core.Schemas; using Squidex.Core.Schemas.Json; using Squidex.Infrastructure; using Squidex.Infrastructure.MongoDb; -using Squidex.Read.Schemas.Repositories; +using Squidex.Read.Schemas; namespace Squidex.Store.MongoDb.Schemas { diff --git a/src/Squidex.Store.MongoDb/Schemas/MongoSchemaRepository.cs b/src/Squidex.Store.MongoDb/Schemas/MongoSchemaRepository.cs index 376f87f28..699e1750a 100644 --- a/src/Squidex.Store.MongoDb/Schemas/MongoSchemaRepository.cs +++ b/src/Squidex.Store.MongoDb/Schemas/MongoSchemaRepository.cs @@ -22,6 +22,7 @@ using Squidex.Infrastructure.CQRS.Replay; using Squidex.Infrastructure.Dispatching; using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.Reflection; +using Squidex.Read.Schemas; using Squidex.Read.Schemas.Repositories; using Squidex.Store.MongoDb.Utils; diff --git a/src/Squidex/Controllers/Api/Schemas/Models/Converters/SchemaConverter.cs b/src/Squidex/Controllers/Api/Schemas/Models/Converters/SchemaConverter.cs index e5f460951..4a21552a6 100644 --- a/src/Squidex/Controllers/Api/Schemas/Models/Converters/SchemaConverter.cs +++ b/src/Squidex/Controllers/Api/Schemas/Models/Converters/SchemaConverter.cs @@ -11,7 +11,7 @@ using System.Collections.Generic; using System.Linq; using Squidex.Core.Schemas; using Squidex.Infrastructure.Reflection; -using Squidex.Read.Schemas.Repositories; +using Squidex.Read.Schemas; namespace Squidex.Controllers.Api.Schemas.Models.Converters { diff --git a/src/Squidex/Controllers/Api/Schemas/Models/FieldPropertiesDto.cs b/src/Squidex/Controllers/Api/Schemas/Models/FieldPropertiesDto.cs index 161f927ea..2f03cabf3 100644 --- a/src/Squidex/Controllers/Api/Schemas/Models/FieldPropertiesDto.cs +++ b/src/Squidex/Controllers/Api/Schemas/Models/FieldPropertiesDto.cs @@ -43,6 +43,16 @@ namespace Squidex.Controllers.Api.Schemas.Models /// public bool IsRequired { get; set; } + /// + /// Determines if the field should be displayed in lists. + /// + public bool IsListField { get; set; } + + /// + /// Determines if the field is localizable. + /// + public bool IsLocalizable { get; set; } + public abstract FieldProperties ToProperties(); } } diff --git a/src/Squidex/Controllers/ContentApi/Generator/SchemasSwaggerGenerator.cs b/src/Squidex/Controllers/ContentApi/Generator/SchemasSwaggerGenerator.cs index ace4ae714..2dcf89f3b 100644 --- a/src/Squidex/Controllers/ContentApi/Generator/SchemasSwaggerGenerator.cs +++ b/src/Squidex/Controllers/ContentApi/Generator/SchemasSwaggerGenerator.cs @@ -23,7 +23,7 @@ using Squidex.Core.Schemas; using Squidex.Infrastructure; using Squidex.Pipeline.Swagger; using Squidex.Read.Apps; -using Squidex.Read.Schemas.Repositories; +using Squidex.Read.Schemas; // ReSharper disable SuggestBaseTypeForParameter // ReSharper disable PrivateFieldCanBeConvertedToLocalVariable diff --git a/src/Squidex/Properties/launchSettings.json b/src/Squidex/Properties/launchSettings.json index 1aa5504bd..81325951e 100644 --- a/src/Squidex/Properties/launchSettings.json +++ b/src/Squidex/Properties/launchSettings.json @@ -16,6 +16,7 @@ }, "Squidex": { "commandName": "Project", + "commandLineArgs": "--replay", "launchUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" diff --git a/src/Squidex/app/features/content/declarations.ts b/src/Squidex/app/features/content/declarations.ts index 3f2fdf5d9..db3f86fba 100644 --- a/src/Squidex/app/features/content/declarations.ts +++ b/src/Squidex/app/features/content/declarations.ts @@ -5,6 +5,7 @@ * Copyright (c) Sebastian Stehle. All rights reserved */ +export * from './pages/content/content-field.component'; export * from './pages/content/content-page.component'; export * from './pages/contents/contents-page.component'; export * from './pages/schemas/schemas-page.component'; \ No newline at end of file diff --git a/src/Squidex/app/features/content/module.ts b/src/Squidex/app/features/content/module.ts index a9f285510..a50227464 100644 --- a/src/Squidex/app/features/content/module.ts +++ b/src/Squidex/app/features/content/module.ts @@ -10,12 +10,14 @@ import { RouterModule, Routes } from '@angular/router'; import { HistoryComponent, + ResolveAppLanguagesGuard, ResolvePublishedSchemaGuard, SqxFrameworkModule, SqxSharedModule } from 'shared'; import { + ContentFieldComponent, ContentPageComponent, ContentsPageComponent, SchemasPageComponent @@ -33,14 +35,14 @@ const routes: Routes = [ path: ':schemaName', component: ContentsPageComponent, resolve: { - schema: ResolvePublishedSchemaGuard + schema: ResolvePublishedSchemaGuard, appLanguages: ResolveAppLanguagesGuard }, children: [ { path: 'new', component: ContentPageComponent, resolve: { - schema: ResolvePublishedSchemaGuard + schema: ResolvePublishedSchemaGuard, appLanguages: ResolveAppLanguagesGuard }, data: { disableHistory: true @@ -55,7 +57,7 @@ const routes: Routes = [ path: ':contentId', component: ContentPageComponent, resolve: { - schema: ResolvePublishedSchemaGuard + schema: ResolvePublishedSchemaGuard, appLanguages: ResolveAppLanguagesGuard }, children: [ { @@ -79,6 +81,7 @@ const routes: Routes = [ RouterModule.forChild(routes) ], declarations: [ + ContentFieldComponent, ContentPageComponent, ContentsPageComponent, SchemasPageComponent diff --git a/src/Squidex/app/features/content/pages/content/content-field.component.html b/src/Squidex/app/features/content/pages/content/content-field.component.html new file mode 100644 index 000000000..296b488d0 --- /dev/null +++ b/src/Squidex/app/features/content/pages/content/content-field.component.html @@ -0,0 +1,86 @@ +
+ + + Disabled + +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ {{field.properties.hints}} +
+
\ No newline at end of file diff --git a/src/Squidex/app/features/content/pages/content/content-field.component.scss b/src/Squidex/app/features/content/pages/content/content-field.component.scss new file mode 100644 index 000000000..c84c0b002 --- /dev/null +++ b/src/Squidex/app/features/content/pages/content/content-field.component.scss @@ -0,0 +1,22 @@ +@import '_vars'; +@import '_mixins'; + +.table-items-row { + position: relative; +} + +.languages-buttons { + @include absolute(1rem, 1.25rem, auto, auto); +} + +.field { + &-required { + color: $color-theme-error; + } + + &-disabled { + color: $color-border-dark; + font-size: .8rem; + font-weight: normal; + } +} \ No newline at end of file diff --git a/src/Squidex/app/features/content/pages/content/content-field.component.ts b/src/Squidex/app/features/content/pages/content/content-field.component.ts new file mode 100644 index 000000000..f862f8a81 --- /dev/null +++ b/src/Squidex/app/features/content/pages/content/content-field.component.ts @@ -0,0 +1,56 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Sebastian Stehle. All rights reserved + */ + +import { Component, Input, OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; + +import { + AppLanguageDto, + FieldDto +} from 'shared'; + +@Component({ + selector: 'sqx-content-field', + styleUrls: ['./content-field.component.scss'], + templateUrl: './content-field.component.html' +}) +export class ContentFieldComponent implements OnInit { + @Input() + public field: FieldDto; + + @Input() + public fieldForm: FormGroup; + + @Input() + public languages: AppLanguageDto[]; + + @Input() + public contentFormSubmitted: boolean; + + public fieldLanguages: string[]; + + public selectedLanguage: string; + + public selectLanguage(language: AppLanguageDto) { + this.selectedLanguage = language.iso2Code; + } + + public ngOnInit() { + if (this.field.isDisabled) { + this.fieldForm.disable(); + } + + if (this.field.properties.isLocalizable) { + this.fieldLanguages = this.languages.map(t => t.iso2Code); + this.selectedLanguage = this.fieldLanguages[0]; + } else { + this.fieldLanguages = ['iv']; + this.selectedLanguage = 'iv'; + } + } +} + diff --git a/src/Squidex/app/features/content/pages/content/content-page.component.html b/src/Squidex/app/features/content/pages/content/content-page.component.html index 79f6e07e3..3d4263893 100644 --- a/src/Squidex/app/features/content/pages/content/content-page.component.html +++ b/src/Squidex/app/features/content/pages/content/content-page.component.html @@ -3,85 +3,25 @@
-
- -
- -

New {{schema|displayName}}

+
+
+ +
+ +

New {{schema|displayName}}

- - - + + + +
-
- -
-
- - -
-
-
-
- -
-
- -
-
- -
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
- -
- {{field.properties.hints}} -
-
+
diff --git a/src/Squidex/app/features/content/pages/content/content-page.component.scss b/src/Squidex/app/features/content/pages/content/content-page.component.scss index 7d554a055..c92713ef8 100644 --- a/src/Squidex/app/features/content/pages/content/content-page.component.scss +++ b/src/Squidex/app/features/content/pages/content/content-page.component.scss @@ -4,8 +4,4 @@ .panel { min-width: 36rem; max-width: 36rem; -} - -label { - margin: .4rem; } \ No newline at end of file diff --git a/src/Squidex/app/features/content/pages/content/content-page.component.ts b/src/Squidex/app/features/content/pages/content/content-page.component.ts index ea3bcaf82..c9f37098b 100644 --- a/src/Squidex/app/features/content/pages/content/content-page.component.ts +++ b/src/Squidex/app/features/content/pages/content/content-page.component.ts @@ -9,10 +9,14 @@ import { Component } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; +import { ContentAdded } from './../messages'; + import { AppComponentBase, + AppLanguageDto, AppsStoreService, ContentsService, + MessageBus, NotificationService, NumberFieldPropertiesDto, SchemaDetailsDto, @@ -32,13 +36,14 @@ export class ContentPageComponent extends AppComponentBase { public contentFormSubmitted = false; public contentForm: FormGroup; - public languages = ['iv']; + public languages: AppLanguageDto[] = []; public isNewMode = false; constructor(apps: AppsStoreService, notifications: NotificationService, users: UsersProviderService, private readonly contentsService: ContentsService, - private readonly route: ActivatedRoute + private readonly route: ActivatedRoute, + private readonly messageBus: MessageBus ) { super(apps, notifications, users); } @@ -48,6 +53,10 @@ export class ContentPageComponent extends AppComponentBase { this.isNewMode = !contentId; }); + this.route.data.map(p => p['appLanguages']).subscribe((languages: AppLanguageDto[]) => { + this.languages = languages; + }); + this.route.data.map(p => p['schema']).subscribe((schema: SchemaDetailsDto) => { this.schema = schema; @@ -59,7 +68,7 @@ export class ContentPageComponent extends AppComponentBase { this.contentFormSubmitted = true; if (this.contentForm.valid) { - this.contentForm.disable(); + this.disable(); const data = this.contentForm.value; @@ -67,17 +76,37 @@ export class ContentPageComponent extends AppComponentBase { .switchMap(app => this.contentsService.postContent(app, this.schema.name, data)) .subscribe(() => { this.reset(); + this.messageBus.publish(new ContentAdded()); }, error => { - this.contentForm.enable(); + this.notifyError(error); + this.enable(); }); } } public reset() { + this.enable(); + this.contentForm.reset(); this.contentFormSubmitted = false; } + public enable() { + for (const field of this.schema.fields.filter(f => !f.isDisabled)) { + const fieldForm = this.contentForm.controls[field.name]; + + fieldForm.enable(); + } + } + + public disable() { + for (const field of this.schema.fields.filter(f => !f.isDisabled)) { + const fieldForm = this.contentForm.controls[field.name]; + + fieldForm.disable(); + } + } + private setupForm(schema: SchemaDetailsDto) { const controls: { [key: string]: AbstractControl } = {}; @@ -102,9 +131,15 @@ export class ContentPageComponent extends AppComponentBase { } } - const group = new FormGroup({ - 'iv': new FormControl(undefined, validators) - }); + const group = new FormGroup({}); + + if (field.properties.isLocalizable) { + for (let language of this.languages) { + group.addControl(language.iso2Code, new FormControl(undefined, validators)); + } + } else { + group.addControl('iv', new FormControl(undefined, validators)); + } controls[field.name] = group; } diff --git a/src/Squidex/app/features/content/pages/contents/contents-page.component.html b/src/Squidex/app/features/content/pages/contents/contents-page.component.html index 67f4bb7cd..701f4f215 100644 --- a/src/Squidex/app/features/content/pages/contents/contents-page.component.html +++ b/src/Squidex/app/features/content/pages/contents/contents-page.component.html @@ -2,21 +2,78 @@
- +
+
+
+ +
+ + + New + +
-

{{schema|displayName}} Contents

+

{{schema|displayName}} Contents

- - - + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ {{field|displayName:'properties.label':'name'}} + + Updated + + By + + Options +