From 47b467c786f618efbb0f5f21fa44e8d461321699 Mon Sep 17 00:00:00 2001 From: Derek Begnoche Date: Wed, 29 Nov 2017 14:14:17 +0000 Subject: [PATCH 1/6] Display Default Values in UI --- .../content/content-field.component.html | 3 ++- .../pages/content/content-page.component.ts | 20 ++++++++++++++++--- .../app/shared/services/schemas.service.ts | 6 +++++- 3 files changed, 24 insertions(+), 5 deletions(-) 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 index b8adf3f69..802caaafd 100644 --- a/src/Squidex/app/features/content/pages/content/content-field.component.html +++ b/src/Squidex/app/features/content/pages/content/content-field.component.html @@ -31,7 +31,7 @@
@@ -60,6 +60,7 @@
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 d5fb781a9..2b4cf62a0 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 @@ -256,11 +256,25 @@ export class ContentPageComponent implements CanComponentDeactivate, OnDestroy, fieldForm.controls['iv'].setValue(fieldValue['iv'] === undefined ? null : fieldValue['iv']); } } - if (this.content.status === 'Archived') { this.contentForm.disable(); } + } else { + for (const field of this.schema.fields) { + if (field.properties.hasOwnProperty('defaultValue')) { + const defaultValue = (field.properties as any).defaultValue; + if (defaultValue) { + const fieldForm = this.contentForm.get(field.name); + if (field.partitioning === 'language') { + for (let language of this.languages) { + fieldForm.controls[language.iso2Code].setValue(defaultValue); + } + } else { + fieldForm.controls['iv'].setValue(defaultValue); + } + } + } + } } } -} - +} \ No newline at end of file diff --git a/src/Squidex/app/shared/services/schemas.service.ts b/src/Squidex/app/shared/services/schemas.service.ts index 730dccd5f..13cc9597a 100644 --- a/src/Squidex/app/shared/services/schemas.service.ts +++ b/src/Squidex/app/shared/services/schemas.service.ts @@ -426,7 +426,11 @@ export class NumberFieldPropertiesDto extends FieldPropertiesDto { } if (this.allowedValues && this.allowedValues.length > 0) { - validators.push(ValidatorsEx.validValues(this.allowedValues)); + if (this.isRequired && !isOptional) { + validators.push(ValidatorsEx.validValues(this.allowedValues)); + } else { + validators.push(ValidatorsEx.validValues(this.allowedValues.concat([null]))); + } } return validators; From d188c022de7df6d2e3a4d5a726a37f769739e317 Mon Sep 17 00:00:00 2001 From: Derek Begnoche Date: Thu, 30 Nov 2017 17:05:40 -0600 Subject: [PATCH 2/6] Add default value method to FieldDto --- .../pages/content/content-page.component.ts | 2 +- .../app/shared/services/schemas.service.ts | 381 ++++++++++-------- 2 files changed, 216 insertions(+), 167 deletions(-) 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 2b4cf62a0..0cde3d13c 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 @@ -262,7 +262,7 @@ export class ContentPageComponent implements CanComponentDeactivate, OnDestroy, } else { for (const field of this.schema.fields) { if (field.properties.hasOwnProperty('defaultValue')) { - const defaultValue = (field.properties as any).defaultValue; + const defaultValue = field.defaultValue(); if (defaultValue) { const fieldForm = this.contentForm.get(field.name); if (field.partitioning === 'language') { diff --git a/src/Squidex/app/shared/services/schemas.service.ts b/src/Squidex/app/shared/services/schemas.service.ts index 13cc9597a..e013ccb64 100644 --- a/src/Squidex/app/shared/services/schemas.service.ts +++ b/src/Squidex/app/shared/services/schemas.service.ts @@ -317,6 +317,10 @@ export class FieldDto { public createValidators(isOptional: boolean): ValidatorFn[] { return this.properties.createValidators(isOptional); } + + public defaultValue(): any { + return this.properties.getDefaultValue(); + } } export abstract class FieldPropertiesDto { @@ -333,6 +337,8 @@ export abstract class FieldPropertiesDto { public abstract formatValue(value: any): string; public abstract createValidators(isOptional: boolean): ValidatorFn[]; + + public abstract getDefaultValue(): any; } export class StringFieldPropertiesDto extends FieldPropertiesDto { @@ -387,6 +393,10 @@ export class StringFieldPropertiesDto extends FieldPropertiesDto { return validators; } + + public getDefaultValue(): any { + return this.defaultValue; + } } export class NumberFieldPropertiesDto extends FieldPropertiesDto { @@ -435,6 +445,10 @@ export class NumberFieldPropertiesDto extends FieldPropertiesDto { return validators; } + + public getDefaultValue(): any { + return this.defaultValue; + } } export class DateTimeFieldPropertiesDto extends FieldPropertiesDto { @@ -477,6 +491,17 @@ export class DateTimeFieldPropertiesDto extends FieldPropertiesDto { return validators; } + + public getDefaultValue(): any { + if (this.calculatedDefaultValue != null) { + let now = new Date(); + if (this.calculatedDefaultValue === 'Today') { + now = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()); + } + return now.toUTCString(); + } + return this.defaultValue; + } } export class BooleanFieldPropertiesDto extends FieldPropertiesDto { @@ -506,6 +531,10 @@ export class BooleanFieldPropertiesDto extends FieldPropertiesDto { return validators; } + + public getDefaultValue(): any { + return this.defaultValue; + } } export class GeolocationFieldPropertiesDto extends FieldPropertiesDto { @@ -534,6 +563,10 @@ export class GeolocationFieldPropertiesDto extends FieldPropertiesDto { return validators; } + + public getDefaultValue(): any { + return null; + } } export class ReferencesFieldPropertiesDto extends FieldPropertiesDto { @@ -576,6 +609,10 @@ export class ReferencesFieldPropertiesDto extends FieldPropertiesDto { return validators; } + + public getDefaultValue(): any { + return null; + } } export class AssetsFieldPropertiesDto extends FieldPropertiesDto { @@ -617,6 +654,10 @@ export class AssetsFieldPropertiesDto extends FieldPropertiesDto { return validators; } + + public getDefaultValue(): any { + return null; + } } export class TagsFieldPropertiesDto extends FieldPropertiesDto { @@ -658,6 +699,10 @@ export class TagsFieldPropertiesDto extends FieldPropertiesDto { return validators; } + + public getDefaultValue(): any { + return null; + } } export class JsonFieldPropertiesDto extends FieldPropertiesDto { @@ -685,6 +730,10 @@ export class JsonFieldPropertiesDto extends FieldPropertiesDto { return validators; } + + public getDefaultValue(): any { + return null; + } } export class SchemaPropertiesDto { @@ -753,272 +802,272 @@ export class SchemasService { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas`); return HTTP.getVersioned(this.http, url) - .map(response => { - const body = response.payload.body; + .map(response => { + const body = response.payload.body; - const items: any[] = body; + const items: any[] = body; - return items.map(item => { - const properties = new SchemaPropertiesDto(item.properties.label, item.properties.hints); + return items.map(item => { + const properties = new SchemaPropertiesDto(item.properties.label, item.properties.hints); - return new SchemaDto( - item.id, - item.name, properties, - item.isPublished, - item.createdBy, - item.lastModifiedBy, - DateTime.parseISO_UTC(item.created), - DateTime.parseISO_UTC(item.lastModified), - new Version(item.version.toString())); - }); - }) - .pretifyError('Failed to load schemas. Please reload.'); + return new SchemaDto( + item.id, + item.name, properties, + item.isPublished, + item.createdBy, + item.lastModifiedBy, + DateTime.parseISO_UTC(item.created), + DateTime.parseISO_UTC(item.lastModified), + new Version(item.version.toString())); + }); + }) + .pretifyError('Failed to load schemas. Please reload.'); } public getSchema(appName: string, id: string): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${id}`); return HTTP.getVersioned(this.http, url) - .map(response => { - const body = response.payload.body; - - const fields = body.fields.map((item: any) => { - const propertiesDto = - createProperties( - item.properties.fieldType, - item.properties); - - return new FieldDto( - item.fieldId, - item.name, - item.isLocked, - item.isHidden, - item.isDisabled, - item.partitioning, - propertiesDto); - }); - - const properties = new SchemaPropertiesDto(body.properties.label, body.properties.hints); - - return new SchemaDetailsDto( - body.id, - body.name, properties, - body.isPublished, - body.createdBy, - body.lastModifiedBy, - DateTime.parseISO_UTC(body.created), - DateTime.parseISO_UTC(body.lastModified), - response.version, - fields, - body.scriptQuery, - body.scriptCreate, - body.scriptUpdate, - body.scriptDelete, - body.scriptChange); - }) - .catch(error => { - if (error instanceof HttpErrorResponse && error.status === 404) { - const cached = this.localCache.get(`schema.${appName}.${id}`); - - if (cached) { - return Observable.of(cached); - } + .map(response => { + const body = response.payload.body; + + const fields = body.fields.map((item: any) => { + const propertiesDto = + createProperties( + item.properties.fieldType, + item.properties); + + return new FieldDto( + item.fieldId, + item.name, + item.isLocked, + item.isHidden, + item.isDisabled, + item.partitioning, + propertiesDto); + }); + + const properties = new SchemaPropertiesDto(body.properties.label, body.properties.hints); + + return new SchemaDetailsDto( + body.id, + body.name, properties, + body.isPublished, + body.createdBy, + body.lastModifiedBy, + DateTime.parseISO_UTC(body.created), + DateTime.parseISO_UTC(body.lastModified), + response.version, + fields, + body.scriptQuery, + body.scriptCreate, + body.scriptUpdate, + body.scriptDelete, + body.scriptChange); + }) + .catch(error => { + if (error instanceof HttpErrorResponse && error.status === 404) { + const cached = this.localCache.get(`schema.${appName}.${id}`); + + if (cached) { + return Observable.of(cached); } + } - return Observable.throw(error); - }) - .pretifyError('Failed to load schema. Please reload.'); + return Observable.throw(error); + }) + .pretifyError('Failed to load schema. Please reload.'); } public postSchema(appName: string, dto: CreateSchemaDto, user: string, now: DateTime): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas`); return HTTP.postVersioned(this.http, url, dto) - .map(response => { - const body = response.payload.body; - - now = now || DateTime.now(); - - return new SchemaDetailsDto( - body.id, - dto.name, - dto.properties || new SchemaPropertiesDto(), - false, - user, - user, - now, - now, - response.version, - dto.fields || [], - body.scriptQuery, - body.scriptCreate, - body.scriptUpdate, - body.scriptDelete, - body.scriptChange); - }) - .do(schema => { - this.analytics.trackEvent('Schema', 'Created', appName); - - this.localCache.set(`schema.${appName}.${schema.id}`, schema, 5000); - this.localCache.set(`schema.${appName}.${schema.name}`, schema, 5000); - }) - .pretifyError('Failed to create schema. Please reload.'); + .map(response => { + const body = response.payload.body; + + now = now || DateTime.now(); + + return new SchemaDetailsDto( + body.id, + dto.name, + dto.properties || new SchemaPropertiesDto(), + false, + user, + user, + now, + now, + response.version, + dto.fields || [], + body.scriptQuery, + body.scriptCreate, + body.scriptUpdate, + body.scriptDelete, + body.scriptChange); + }) + .do(schema => { + this.analytics.trackEvent('Schema', 'Created', appName); + + this.localCache.set(`schema.${appName}.${schema.id}`, schema, 5000); + this.localCache.set(`schema.${appName}.${schema.name}`, schema, 5000); + }) + .pretifyError('Failed to create schema. Please reload.'); } public postField(appName: string, schemaName: string, dto: AddFieldDto, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields`); return HTTP.postVersioned(this.http, url, dto, version) - .map(response => { - const body = response.payload.body; - - const field = new FieldDto( - body.id, - dto.name, - false, - false, - false, - dto.partitioning, - dto.properties); - - return new Versioned(response.version, field); - }) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldCreated', appName); - }) - .pretifyError('Failed to add field. Please reload.'); + .map(response => { + const body = response.payload.body; + + const field = new FieldDto( + body.id, + dto.name, + false, + false, + false, + dto.partitioning, + dto.properties); + + return new Versioned(response.version, field); + }) + .do(() => { + this.analytics.trackEvent('Schema', 'FieldCreated', appName); + }) + .pretifyError('Failed to add field. Please reload.'); } public deleteSchema(appName: string, schemaName: string, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}`); return HTTP.deleteVersioned(this.http, url, version) - .do(() => { - this.localCache.remove(`schema.${appName}.${schemaName}`); - }) - .do(() => { - this.analytics.trackEvent('Schema', 'Deleted', appName); - }) - .pretifyError('Failed to delete schema. Please reload.'); + .do(() => { + this.localCache.remove(`schema.${appName}.${schemaName}`); + }) + .do(() => { + this.analytics.trackEvent('Schema', 'Deleted', appName); + }) + .pretifyError('Failed to delete schema. Please reload.'); } public putSchemaScripts(appName: string, schemaName: string, dto: UpdateSchemaScriptsDto, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/scripts`); return HTTP.putVersioned(this.http, url, dto, version) - .do(() => { - this.analytics.trackEvent('Schema', 'ScriptsConfigured', appName); - }) - .pretifyError('Failed to update schema scripts. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'ScriptsConfigured', appName); + }) + .pretifyError('Failed to update schema scripts. Please reload.'); } public putSchema(appName: string, schemaName: string, dto: UpdateSchemaDto, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}`); return HTTP.putVersioned(this.http, url, dto, version) - .do(() => { - this.analytics.trackEvent('Schema', 'Updated', appName); - }) - .pretifyError('Failed to update schema. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'Updated', appName); + }) + .pretifyError('Failed to update schema. Please reload.'); } public putFieldOrdering(appName: string, schemaName: string, dto: number[], version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/ordering`); return HTTP.putVersioned(this.http, url, { fieldIds: dto }, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldsReordered', appName); - }) - .pretifyError('Failed to reorder fields. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldsReordered', appName); + }) + .pretifyError('Failed to reorder fields. Please reload.'); } public publishSchema(appName: string, schemaName: string, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/publish`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'Published', appName); - }) - .pretifyError('Failed to publish schema. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'Published', appName); + }) + .pretifyError('Failed to publish schema. Please reload.'); } public unpublishSchema(appName: string, schemaName: string, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/unpublish`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'Unpublished', appName); - }) - .pretifyError('Failed to unpublish schema. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'Unpublished', appName); + }) + .pretifyError('Failed to unpublish schema. Please reload.'); } public putField(appName: string, schemaName: string, fieldId: number, dto: UpdateFieldDto, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}`); return HTTP.putVersioned(this.http, url, dto, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldUpdated', appName); - }) - .pretifyError('Failed to update field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldUpdated', appName); + }) + .pretifyError('Failed to update field. Please reload.'); } public enableField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/enable`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldEnabled', appName); - }) - .pretifyError('Failed to enable field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldEnabled', appName); + }) + .pretifyError('Failed to enable field. Please reload.'); } public disableField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/disable`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldDisabled', appName); - }) - .pretifyError('Failed to disable field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldDisabled', appName); + }) + .pretifyError('Failed to disable field. Please reload.'); } public lockField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/lock`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldLocked', appName); - }) - .pretifyError('Failed to lock field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldLocked', appName); + }) + .pretifyError('Failed to lock field. Please reload.'); } public showField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/show`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldShown', appName); - }) - .pretifyError('Failed to show field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldShown', appName); + }) + .pretifyError('Failed to show field. Please reload.'); } public hideField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/hide`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldHidden', appName); - }) - .pretifyError('Failed to hide field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldHidden', appName); + }) + .pretifyError('Failed to hide field. Please reload.'); } public deleteField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}`); return HTTP.deleteVersioned(this.http, url, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldDeleted', appName); - }) - .pretifyError('Failed to delete field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldDeleted', appName); + }) + .pretifyError('Failed to delete field. Please reload.'); } } \ No newline at end of file From e02f727480569dbc2ad1ca4258df0f123fc61e37 Mon Sep 17 00:00:00 2001 From: Derek Begnoche Date: Thu, 30 Nov 2017 20:34:40 -0600 Subject: [PATCH 3/6] Revert formatting issues --- .../app/shared/services/schemas.service.ts | 332 +++++++++--------- 1 file changed, 166 insertions(+), 166 deletions(-) diff --git a/src/Squidex/app/shared/services/schemas.service.ts b/src/Squidex/app/shared/services/schemas.service.ts index e013ccb64..73d8b0e58 100644 --- a/src/Squidex/app/shared/services/schemas.service.ts +++ b/src/Squidex/app/shared/services/schemas.service.ts @@ -802,272 +802,272 @@ export class SchemasService { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas`); return HTTP.getVersioned(this.http, url) - .map(response => { - const body = response.payload.body; + .map(response => { + const body = response.payload.body; - const items: any[] = body; + const items: any[] = body; - return items.map(item => { - const properties = new SchemaPropertiesDto(item.properties.label, item.properties.hints); + return items.map(item => { + const properties = new SchemaPropertiesDto(item.properties.label, item.properties.hints); - return new SchemaDto( - item.id, - item.name, properties, - item.isPublished, - item.createdBy, - item.lastModifiedBy, - DateTime.parseISO_UTC(item.created), - DateTime.parseISO_UTC(item.lastModified), - new Version(item.version.toString())); - }); - }) - .pretifyError('Failed to load schemas. Please reload.'); + return new SchemaDto( + item.id, + item.name, properties, + item.isPublished, + item.createdBy, + item.lastModifiedBy, + DateTime.parseISO_UTC(item.created), + DateTime.parseISO_UTC(item.lastModified), + new Version(item.version.toString())); + }); + }) + .pretifyError('Failed to load schemas. Please reload.'); } public getSchema(appName: string, id: string): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${id}`); return HTTP.getVersioned(this.http, url) - .map(response => { - const body = response.payload.body; - - const fields = body.fields.map((item: any) => { - const propertiesDto = - createProperties( - item.properties.fieldType, - item.properties); - - return new FieldDto( - item.fieldId, - item.name, - item.isLocked, - item.isHidden, - item.isDisabled, - item.partitioning, - propertiesDto); - }); - - const properties = new SchemaPropertiesDto(body.properties.label, body.properties.hints); - - return new SchemaDetailsDto( - body.id, - body.name, properties, - body.isPublished, - body.createdBy, - body.lastModifiedBy, - DateTime.parseISO_UTC(body.created), - DateTime.parseISO_UTC(body.lastModified), - response.version, - fields, - body.scriptQuery, - body.scriptCreate, - body.scriptUpdate, - body.scriptDelete, - body.scriptChange); - }) - .catch(error => { - if (error instanceof HttpErrorResponse && error.status === 404) { - const cached = this.localCache.get(`schema.${appName}.${id}`); - - if (cached) { - return Observable.of(cached); + .map(response => { + const body = response.payload.body; + + const fields = body.fields.map((item: any) => { + const propertiesDto = + createProperties( + item.properties.fieldType, + item.properties); + + return new FieldDto( + item.fieldId, + item.name, + item.isLocked, + item.isHidden, + item.isDisabled, + item.partitioning, + propertiesDto); + }); + + const properties = new SchemaPropertiesDto(body.properties.label, body.properties.hints); + + return new SchemaDetailsDto( + body.id, + body.name, properties, + body.isPublished, + body.createdBy, + body.lastModifiedBy, + DateTime.parseISO_UTC(body.created), + DateTime.parseISO_UTC(body.lastModified), + response.version, + fields, + body.scriptQuery, + body.scriptCreate, + body.scriptUpdate, + body.scriptDelete, + body.scriptChange); + }) + .catch(error => { + if (error instanceof HttpErrorResponse && error.status === 404) { + const cached = this.localCache.get(`schema.${appName}.${id}`); + + if (cached) { + return Observable.of(cached); + } } - } - return Observable.throw(error); - }) - .pretifyError('Failed to load schema. Please reload.'); + return Observable.throw(error); + }) + .pretifyError('Failed to load schema. Please reload.'); } public postSchema(appName: string, dto: CreateSchemaDto, user: string, now: DateTime): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas`); return HTTP.postVersioned(this.http, url, dto) - .map(response => { - const body = response.payload.body; - - now = now || DateTime.now(); - - return new SchemaDetailsDto( - body.id, - dto.name, - dto.properties || new SchemaPropertiesDto(), - false, - user, - user, - now, - now, - response.version, - dto.fields || [], - body.scriptQuery, - body.scriptCreate, - body.scriptUpdate, - body.scriptDelete, - body.scriptChange); - }) - .do(schema => { - this.analytics.trackEvent('Schema', 'Created', appName); - - this.localCache.set(`schema.${appName}.${schema.id}`, schema, 5000); - this.localCache.set(`schema.${appName}.${schema.name}`, schema, 5000); - }) - .pretifyError('Failed to create schema. Please reload.'); + .map(response => { + const body = response.payload.body; + + now = now || DateTime.now(); + + return new SchemaDetailsDto( + body.id, + dto.name, + dto.properties || new SchemaPropertiesDto(), + false, + user, + user, + now, + now, + response.version, + dto.fields || [], + body.scriptQuery, + body.scriptCreate, + body.scriptUpdate, + body.scriptDelete, + body.scriptChange); + }) + .do(schema => { + this.analytics.trackEvent('Schema', 'Created', appName); + + this.localCache.set(`schema.${appName}.${schema.id}`, schema, 5000); + this.localCache.set(`schema.${appName}.${schema.name}`, schema, 5000); + }) + .pretifyError('Failed to create schema. Please reload.'); } public postField(appName: string, schemaName: string, dto: AddFieldDto, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields`); return HTTP.postVersioned(this.http, url, dto, version) - .map(response => { - const body = response.payload.body; - - const field = new FieldDto( - body.id, - dto.name, - false, - false, - false, - dto.partitioning, - dto.properties); - - return new Versioned(response.version, field); - }) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldCreated', appName); - }) - .pretifyError('Failed to add field. Please reload.'); + .map(response => { + const body = response.payload.body; + + const field = new FieldDto( + body.id, + dto.name, + false, + false, + false, + dto.partitioning, + dto.properties); + + return new Versioned(response.version, field); + }) + .do(() => { + this.analytics.trackEvent('Schema', 'FieldCreated', appName); + }) + .pretifyError('Failed to add field. Please reload.'); } public deleteSchema(appName: string, schemaName: string, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}`); return HTTP.deleteVersioned(this.http, url, version) - .do(() => { - this.localCache.remove(`schema.${appName}.${schemaName}`); - }) - .do(() => { - this.analytics.trackEvent('Schema', 'Deleted', appName); - }) - .pretifyError('Failed to delete schema. Please reload.'); + .do(() => { + this.localCache.remove(`schema.${appName}.${schemaName}`); + }) + .do(() => { + this.analytics.trackEvent('Schema', 'Deleted', appName); + }) + .pretifyError('Failed to delete schema. Please reload.'); } public putSchemaScripts(appName: string, schemaName: string, dto: UpdateSchemaScriptsDto, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/scripts`); return HTTP.putVersioned(this.http, url, dto, version) - .do(() => { - this.analytics.trackEvent('Schema', 'ScriptsConfigured', appName); - }) - .pretifyError('Failed to update schema scripts. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'ScriptsConfigured', appName); + }) + .pretifyError('Failed to update schema scripts. Please reload.'); } public putSchema(appName: string, schemaName: string, dto: UpdateSchemaDto, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}`); return HTTP.putVersioned(this.http, url, dto, version) - .do(() => { - this.analytics.trackEvent('Schema', 'Updated', appName); - }) - .pretifyError('Failed to update schema. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'Updated', appName); + }) + .pretifyError('Failed to update schema. Please reload.'); } public putFieldOrdering(appName: string, schemaName: string, dto: number[], version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/ordering`); return HTTP.putVersioned(this.http, url, { fieldIds: dto }, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldsReordered', appName); - }) - .pretifyError('Failed to reorder fields. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldsReordered', appName); + }) + .pretifyError('Failed to reorder fields. Please reload.'); } public publishSchema(appName: string, schemaName: string, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/publish`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'Published', appName); - }) - .pretifyError('Failed to publish schema. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'Published', appName); + }) + .pretifyError('Failed to publish schema. Please reload.'); } public unpublishSchema(appName: string, schemaName: string, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/unpublish`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'Unpublished', appName); - }) - .pretifyError('Failed to unpublish schema. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'Unpublished', appName); + }) + .pretifyError('Failed to unpublish schema. Please reload.'); } public putField(appName: string, schemaName: string, fieldId: number, dto: UpdateFieldDto, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}`); return HTTP.putVersioned(this.http, url, dto, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldUpdated', appName); - }) - .pretifyError('Failed to update field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldUpdated', appName); + }) + .pretifyError('Failed to update field. Please reload.'); } public enableField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/enable`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldEnabled', appName); - }) - .pretifyError('Failed to enable field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldEnabled', appName); + }) + .pretifyError('Failed to enable field. Please reload.'); } public disableField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/disable`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldDisabled', appName); - }) - .pretifyError('Failed to disable field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldDisabled', appName); + }) + .pretifyError('Failed to disable field. Please reload.'); } public lockField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/lock`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldLocked', appName); - }) - .pretifyError('Failed to lock field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldLocked', appName); + }) + .pretifyError('Failed to lock field. Please reload.'); } public showField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/show`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldShown', appName); - }) - .pretifyError('Failed to show field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldShown', appName); + }) + .pretifyError('Failed to show field. Please reload.'); } public hideField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/hide`); return HTTP.putVersioned(this.http, url, {}, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldHidden', appName); - }) - .pretifyError('Failed to hide field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldHidden', appName); + }) + .pretifyError('Failed to hide field. Please reload.'); } public deleteField(appName: string, schemaName: string, fieldId: number, version: Version): Observable> { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}`); return HTTP.deleteVersioned(this.http, url, version) - .do(() => { - this.analytics.trackEvent('Schema', 'FieldDeleted', appName); - }) - .pretifyError('Failed to delete field. Please reload.'); + .do(() => { + this.analytics.trackEvent('Schema', 'FieldDeleted', appName); + }) + .pretifyError('Failed to delete field. Please reload.'); } } \ No newline at end of file From 9b83e1599064e9e19c38c6a67deb764dfc58a98c Mon Sep 17 00:00:00 2001 From: Derek Begnoche Date: Thu, 30 Nov 2017 20:50:25 -0600 Subject: [PATCH 4/6] Remove has property check --- .../pages/content/content-page.component.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) 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 0cde3d13c..9f8569299 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 @@ -261,17 +261,15 @@ export class ContentPageComponent implements CanComponentDeactivate, OnDestroy, } } else { for (const field of this.schema.fields) { - if (field.properties.hasOwnProperty('defaultValue')) { - const defaultValue = field.defaultValue(); - if (defaultValue) { - const fieldForm = this.contentForm.get(field.name); - if (field.partitioning === 'language') { - for (let language of this.languages) { - fieldForm.controls[language.iso2Code].setValue(defaultValue); - } - } else { - fieldForm.controls['iv'].setValue(defaultValue); + const defaultValue = field.defaultValue(); + if (defaultValue) { + const fieldForm = this.contentForm.get(field.name); + if (field.partitioning === 'language') { + for (let language of this.languages) { + fieldForm.controls[language.iso2Code].setValue(defaultValue); } + } else { + fieldForm.controls['iv'].setValue(defaultValue); } } } From cff339fa93ecc35d244fc6833acd2e9388f01560 Mon Sep 17 00:00:00 2001 From: Derek Begnoche Date: Fri, 1 Dec 2017 08:24:52 -0600 Subject: [PATCH 5/6] Remove abstract clas --- .../app/shared/services/schemas.service.ts | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/src/Squidex/app/shared/services/schemas.service.ts b/src/Squidex/app/shared/services/schemas.service.ts index 73d8b0e58..af754bddb 100644 --- a/src/Squidex/app/shared/services/schemas.service.ts +++ b/src/Squidex/app/shared/services/schemas.service.ts @@ -338,7 +338,9 @@ export abstract class FieldPropertiesDto { public abstract createValidators(isOptional: boolean): ValidatorFn[]; - public abstract getDefaultValue(): any; + public getDefaultValue(): any { + return null; + } } export class StringFieldPropertiesDto extends FieldPropertiesDto { @@ -563,10 +565,6 @@ export class GeolocationFieldPropertiesDto extends FieldPropertiesDto { return validators; } - - public getDefaultValue(): any { - return null; - } } export class ReferencesFieldPropertiesDto extends FieldPropertiesDto { @@ -609,10 +607,6 @@ export class ReferencesFieldPropertiesDto extends FieldPropertiesDto { return validators; } - - public getDefaultValue(): any { - return null; - } } export class AssetsFieldPropertiesDto extends FieldPropertiesDto { @@ -654,10 +648,6 @@ export class AssetsFieldPropertiesDto extends FieldPropertiesDto { return validators; } - - public getDefaultValue(): any { - return null; - } } export class TagsFieldPropertiesDto extends FieldPropertiesDto { @@ -699,10 +689,6 @@ export class TagsFieldPropertiesDto extends FieldPropertiesDto { return validators; } - - public getDefaultValue(): any { - return null; - } } export class JsonFieldPropertiesDto extends FieldPropertiesDto { @@ -730,10 +716,6 @@ export class JsonFieldPropertiesDto extends FieldPropertiesDto { return validators; } - - public getDefaultValue(): any { - return null; - } } export class SchemaPropertiesDto { From eeef4c69f46e8ec38233294a787943e872be64f6 Mon Sep 17 00:00:00 2001 From: Derek Begnoche Date: Fri, 1 Dec 2017 14:34:37 -0600 Subject: [PATCH 6/6] Use DateTime class. Add tests around default values --- .../shared/services/schemas.service.spec.ts | 33 +++++++++++++++++++ .../app/shared/services/schemas.service.ts | 6 ++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/Squidex/app/shared/services/schemas.service.spec.ts b/src/Squidex/app/shared/services/schemas.service.spec.ts index 2f8ec096e..891991edd 100644 --- a/src/Squidex/app/shared/services/schemas.service.spec.ts +++ b/src/Squidex/app/shared/services/schemas.service.spec.ts @@ -12,15 +12,18 @@ import { AddFieldDto, AnalyticsService, ApiUrlConfig, + AssetsFieldPropertiesDto, CreateSchemaDto, createProperties, DateTime, + DateTimeFieldPropertiesDto, FieldDto, LocalCacheService, SchemaDetailsDto, SchemaDto, SchemaPropertiesDto, SchemasService, + StringFieldPropertiesDto, UpdateFieldDto, UpdateSchemaDto, UpdateSchemaScriptsDto, @@ -682,4 +685,34 @@ describe('SchemasService', () => { req.flush({}); })); +}); + +describe('FieldPropertiesDto', () => { + it('should return default value for StringFieldProperties', () => { + const dto = new StringFieldPropertiesDto(null, null, null, false, false, 'Input', 'Default Value'); + expect(dto.getDefaultValue()).toEqual('Default Value'); + }); + + it('should return default for DateFieldProperties', () => { + const now = DateTime.now(); + const dto = new DateTimeFieldPropertiesDto(null, null, null, false, false, 'Input', now.toISOString()); + expect(dto.getDefaultValue()).toEqual(now.toISOString()); + }); + + it('should return calculated date when Today for DateFieldProperties', () => { + const now = DateTime.now().date; + const dto = new DateTimeFieldPropertiesDto(null, null, null, false, false, 'Input', null, null, null, 'Today'); + expect(dto.getDefaultValue()).toEqual(now.toUTCStringFormat('ddd, DD MMM YYYY hh:mm:ss Z')); + }); + + it('should return calculated date when Now for DateFieldProperties', () => { + const now = DateTime.now(); + const dto = new DateTimeFieldPropertiesDto(null, null, null, false, false, 'Input', null, null, null, 'Now'); + expect(dto.getDefaultValue()).toEqual(now.toUTCStringFormat('ddd, DD MMM YYYY hh:mm:ss Z')); + }); + + it('should return null for default properties', () => { + const dto = new AssetsFieldPropertiesDto(null, null, null, false, false); + expect(dto.getDefaultValue()).toEqual(null); + }); }); \ No newline at end of file diff --git a/src/Squidex/app/shared/services/schemas.service.ts b/src/Squidex/app/shared/services/schemas.service.ts index af754bddb..91125bf1a 100644 --- a/src/Squidex/app/shared/services/schemas.service.ts +++ b/src/Squidex/app/shared/services/schemas.service.ts @@ -496,11 +496,11 @@ export class DateTimeFieldPropertiesDto extends FieldPropertiesDto { public getDefaultValue(): any { if (this.calculatedDefaultValue != null) { - let now = new Date(); + let now = DateTime.now(); if (this.calculatedDefaultValue === 'Today') { - now = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()); + now = now.date; } - return now.toUTCString(); + return now.toUTCStringFormat('ddd, DD MMM YYYY hh:mm:ss Z'); } return this.defaultValue; }