Browse Source

Add Option to define default Value for DateTime #7

pull/65/head
Sebastian Stehle 9 years ago
parent
commit
b28e49035e
  1. 2
      src/Squidex.Core/Schemas/BooleanFieldProperties.cs
  2. 16
      src/Squidex.Core/Schemas/DateTimeCalculatedDefaultValue.cs
  3. 45
      src/Squidex.Core/Schemas/DateTimeFieldProperties.cs
  4. 2
      src/Squidex.Core/Schemas/GeolocationFieldProperties.cs
  5. 2
      src/Squidex.Core/Schemas/NumberFieldProperties.cs
  6. 2
      src/Squidex.Core/Schemas/StringFieldProperties.cs
  7. 6
      src/Squidex/Controllers/Api/Schemas/Models/DateTimeFieldPropertiesDto.cs
  8. 4
      src/Squidex/app/features/content/pages/content/content-field.component.html
  9. 2
      src/Squidex/app/features/schemas/pages/schema/schema-page.component.html
  10. 21
      src/Squidex/app/features/schemas/pages/schema/types/date-time-validation.component.html
  11. 17
      src/Squidex/app/features/schemas/pages/schema/types/date-time-validation.component.ts
  12. 2
      src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html
  13. 3
      src/Squidex/app/shared/services/schemas.service.ts
  14. 2
      tests/Squidex.Core.Tests/Schemas/BooleanFieldPropertiesTests.cs
  15. 54
      tests/Squidex.Core.Tests/Schemas/DateTimeFieldPropertiesTests.cs
  16. 2
      tests/Squidex.Core.Tests/Schemas/GeolocationPropertiesTests.cs
  17. 2
      tests/Squidex.Core.Tests/Schemas/NumberFieldPropertiesTests.cs
  18. 2
      tests/Squidex.Core.Tests/Schemas/StringFieldPropertiesTests.cs

2
src/Squidex.Core/Schemas/BooleanFieldProperties.cs

@ -49,7 +49,7 @@ namespace Squidex.Core.Schemas
{
if (!Editor.IsEnumValue())
{
yield return new ValidationError("Editor ist not a valid value", nameof(Editor));
yield return new ValidationError("Editor is not a valid value", nameof(Editor));
}
}
}

16
src/Squidex.Core/Schemas/DateTimeCalculatedDefaultValue.cs

@ -0,0 +1,16 @@
// ==========================================================================
// DateTimeCalculatedDefaultValue.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
namespace Squidex.Core.Schemas
{
public enum DateTimeCalculatedDefaultValue
{
Now,
Today
}
}

45
src/Squidex.Core/Schemas/DateTimeFieldProperties.cs

@ -6,17 +6,23 @@
// All rights reserved.
// ==========================================================================
using System;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using NodaTime;
using Squidex.Infrastructure;
// ReSharper disable ConvertIfStatementToSwitchStatement
// ReSharper disable RedundantIfElseBlock
// ReSharper disable InvertIf
namespace Squidex.Core.Schemas
{
[TypeName("DateTime")]
public sealed class DateTimeFieldProperties : FieldProperties
{
private DateTimeFieldEditor editor;
private DateTimeCalculatedDefaultValue? calculatedDefaultValue;
private Instant? maxValue;
private Instant? minValue;
private Instant? defaultValue;
@ -54,6 +60,17 @@ namespace Squidex.Core.Schemas
}
}
public DateTimeCalculatedDefaultValue? CalculatedDefaultValue
{
get { return calculatedDefaultValue; }
set
{
ThrowIfFrozen();
calculatedDefaultValue = value;
}
}
public DateTimeFieldEditor Editor
{
get { return editor; }
@ -67,14 +84,25 @@ namespace Squidex.Core.Schemas
public override JToken GetDefaultValue()
{
return DefaultValue?.ToString();
if (CalculatedDefaultValue == DateTimeCalculatedDefaultValue.Now)
{
return DateTime.UtcNow.ToString("o");
}
else if (CalculatedDefaultValue == DateTimeCalculatedDefaultValue.Today)
{
return DateTime.UtcNow.Date.ToString("o");
}
else
{
return DefaultValue?.ToString();
}
}
protected override IEnumerable<ValidationError> ValidateCore()
{
if (!Editor.IsEnumValue())
{
yield return new ValidationError("Editor ist not a valid value", nameof(Editor));
yield return new ValidationError("Editor is not a valid value", nameof(Editor));
}
if (MaxValue.HasValue && MinValue.HasValue && MinValue.Value >= MaxValue.Value)
@ -91,6 +119,19 @@ namespace Squidex.Core.Schemas
{
yield return new ValidationError("Default value must be less than max value", nameof(DefaultValue));
}
if (CalculatedDefaultValue.HasValue)
{
if (!CalculatedDefaultValue.Value.IsEnumValue())
{
yield return new ValidationError("Calculated default value is not valid", nameof(CalculatedDefaultValue));
}
if (DefaultValue.HasValue)
{
yield return new ValidationError("Calculated default value and default value cannot be used together", nameof(CalculatedDefaultValue), nameof(DefaultValue));
}
}
}
}
}

2
src/Squidex.Core/Schemas/GeolocationFieldProperties.cs

@ -37,7 +37,7 @@ namespace Squidex.Core.Schemas
{
if (!Editor.IsEnumValue())
{
yield return new ValidationError("Editor ist not a valid value", nameof(Editor));
yield return new ValidationError("Editor is not a valid value", nameof(Editor));
}
}
}

2
src/Squidex.Core/Schemas/NumberFieldProperties.cs

@ -86,7 +86,7 @@ namespace Squidex.Core.Schemas
{
if (!Editor.IsEnumValue())
{
yield return new ValidationError("Editor ist not a valid value", nameof(Editor));
yield return new ValidationError("Editor is not a valid value", nameof(Editor));
}
if ((Editor == NumberFieldEditor.Radio || Editor == NumberFieldEditor.Dropdown) && (AllowedValues == null || AllowedValues.Count == 0))

2
src/Squidex.Core/Schemas/StringFieldProperties.cs

@ -112,7 +112,7 @@ namespace Squidex.Core.Schemas
{
if (!Editor.IsEnumValue())
{
yield return new ValidationError("Editor ist not a valid value", nameof(Editor));
yield return new ValidationError("Editor is not a valid value", nameof(Editor));
}
if ((Editor == StringFieldEditor.Radio || Editor == StringFieldEditor.Dropdown) && (AllowedValues == null || AllowedValues.Count == 0))

6
src/Squidex/Controllers/Api/Schemas/Models/DateTimeFieldPropertiesDto.cs

@ -39,6 +39,12 @@ namespace Squidex.Controllers.Api.Schemas.Models
[JsonConverter(typeof(StringEnumConverter))]
public DateTimeFieldEditor Editor { get; set; }
/// <summary>
/// The calculated default value for the field value.
/// </summary>
[JsonConverter(typeof(StringEnumConverter))]
public DateTimeCalculatedDefaultValue? CalculatedDefaultValue { get; set; }
public override FieldProperties ToProperties()
{
var result = SimpleMapper.Map(this, new DateTimeFieldProperties());

4
src/Squidex/app/features/content/pages/content/content-field.component.html

@ -26,7 +26,7 @@
<div *ngSwitchCase="'Dropdown'">
<select class="form-control" [formControlName]="language">
<option></option>
<option *ngFor="let value of field.properties.allowedValues">{{value}}</option>
<option *ngFor="let value of field.properties.allowedValues" [ngValue]="value">{{value}}</option>
</select>
</div>
<div *ngSwitchCase="'Radio'">
@ -48,7 +48,7 @@
</div>
<div *ngSwitchCase="'Dropdown'">
<select class="form-control" [formControlName]="language">
<option *ngFor="let value of field.properties.allowedValues">{{value}}</option>
<option *ngFor="let value of field.properties.allowedValues" [ngValue]="value">{{value}}</option>
</select>
</div>
<div *ngSwitchCase="'Radio'">

2
src/Squidex/app/features/schemas/pages/schema/schema-page.component.html

@ -51,7 +51,7 @@
<form class="form-inline" [formGroup]="addFieldForm" (ngSubmit)="addField()">
<div class="form-group mr-2">
<select class="form-control" formControlName="type">
<option *ngFor="let type of fieldTypes">{{type}}</option>
<option *ngFor="let type of fieldTypes" [ngValue]="type">{{type}}</option>
</select>
</div>

21
src/Squidex/app/features/schemas/pages/schema/types/date-time-validation.component.html

@ -23,11 +23,24 @@
</div>
</div>
<div class="form-group row" *ngIf="!(hideDefaultValue | async)">
<label class="col col-3 col-form-label" for="field-default-value">Default Value</label>
<div *ngIf="!(hideDefaultValues | async)">
<div class="form-group row">
<label class="col col-3 col-form-label">Default Mode:</label>
<div class="col col-9">
<sqx-date-time-editor enforceTime="true" formControlName="defaultValue"></sqx-date-time-editor>
<div class="col col-3">
<select class="form-control" formControlName="calculatedDefaultValue">
<option></option>
<option *ngFor="let value of calculatedDefaultValues" [ngValue]="value">{{value}}</option>
</select>
</div>
</div>
<div class="form-group row" *ngIf="!(hideDefaultValue | async)">
<label class="col col-3 col-form-label" for="field-default-value">Default Value</label>
<div class="col col-9">
<sqx-date-time-editor enforceTime="true" mode="DateTime" formControlName="defaultValue"></sqx-date-time-editor>
</div>
</div>
</div>
</div>

17
src/Squidex/app/features/schemas/pages/schema/types/date-time-validation.component.ts

@ -9,7 +9,7 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core
import { FormControl, FormGroup } from '@angular/forms';
import { Observable } from 'rxjs';
import { NumberFieldPropertiesDto, ValidatorsEx } from 'shared';
import { DateTimeFieldPropertiesDto, ValidatorsEx } from 'shared';
@Component({
selector: 'sqx-date-time-validation',
@ -22,11 +22,17 @@ export class DateTimeValidationComponent implements OnInit {
public editForm: FormGroup;
@Input()
public properties: NumberFieldPropertiesDto;
public properties: DateTimeFieldPropertiesDto;
public hideDefaultValues: Observable<boolean>;
public hideDefaultValue: Observable<boolean>;
public calculatedDefaultValues = ['Now', 'Today'];
public ngOnInit() {
this.editForm.addControl('calculatedDefaultValue',
new FormControl(this.properties.calculatedDefaultValue));
this.editForm.addControl('maxValue',
new FormControl(this.properties.maxValue, [
ValidatorsEx.validDateTime()
@ -42,9 +48,14 @@ export class DateTimeValidationComponent implements OnInit {
ValidatorsEx.validDateTime()
]));
this.hideDefaultValue =
this.hideDefaultValues =
this.editForm.get('isRequired').valueChanges
.startWith(this.properties.isRequired)
.map(x => !!x);
this.hideDefaultValue =
this.editForm.get('calculatedDefaultValue').valueChanges
.startWith(this.properties.calculatedDefaultValue)
.map(x => !!x);
}
}

2
src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html

@ -53,7 +53,7 @@
</td>
<td>
<select class="form-control" [ngModel]="contributor.permission" (ngModelChange)="changePermission(contributor, $event)" [disabled]="currentUserId === contributor.contributorId">
<option *ngFor="let permission of usersPermissions">{{permission}}</option>
<option *ngFor="let permission of usersPermissions" [ngValue]="permission">{{permission}}</option>
</select>
</td>
<td>

3
src/Squidex/app/shared/services/schemas.service.ts

@ -160,7 +160,8 @@ export class DateTimeFieldPropertiesDto extends FieldPropertiesDto {
public readonly editor: string,
public readonly defaultValue?: string,
public readonly maxValue?: string,
public readonly minValue?: string
public readonly minValue?: string,
public readonly calculatedDefaultValue?: string
) {
super('DateTime', label, hints, placeholder, isRequired, isListField, isLocalizable);
}

2
tests/Squidex.Core.Tests/Schemas/BooleanFieldPropertiesTests.cs

@ -30,7 +30,7 @@ namespace Squidex.Core.Schemas
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Editor ist not a valid value", "Editor")
new ValidationError("Editor is not a valid value", "Editor")
});
}

54
tests/Squidex.Core.Tests/Schemas/DateTimeFieldPropertiesTests.cs

@ -88,10 +88,62 @@ namespace Squidex.Core.Schemas
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Editor ist not a valid value", "Editor")
new ValidationError("Editor is not a valid value", "Editor")
});
}
[Fact]
public void Should_add_error_if_calculated_default_value_is_not_valid()
{
var sut = new DateTimeFieldProperties { CalculatedDefaultValue = (DateTimeCalculatedDefaultValue)123 };
sut.Validate(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Calculated default value is not valid", "CalculatedDefaultValue")
});
}
[Fact]
public void Should_add_error_if_calculated_default_value_default_value_is_defined()
{
var sut = new DateTimeFieldProperties { CalculatedDefaultValue = DateTimeCalculatedDefaultValue.Now, DefaultValue = FutureDays(10) };
sut.Validate(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Calculated default value and default value cannot be used together", "CalculatedDefaultValue", "DefaultValue")
});
}
[Fact]
public void Should_provide_today_default_value()
{
var sut = new DateTimeFieldProperties { CalculatedDefaultValue = DateTimeCalculatedDefaultValue.Today };
Assert.Equal(DateTime.UtcNow.Date.ToString("o"), sut.GetDefaultValue().ToString());
}
[Fact]
public void Should_provide_now_default_value()
{
var sut = new DateTimeFieldProperties { CalculatedDefaultValue = DateTimeCalculatedDefaultValue.Now };
Assert.Equal(DateTime.UtcNow.ToString("o").Substring(0, 16), sut.GetDefaultValue().ToString().Substring(0, 16));
}
[Fact]
public void Should_provide_specific_default_value()
{
var sut = new DateTimeFieldProperties { DefaultValue = FutureDays(15) };
Assert.Equal(FutureDays(15).ToString(), sut.GetDefaultValue());
}
[Fact]
public void Should_set_or_freeze_sut()
{

2
tests/Squidex.Core.Tests/Schemas/GeolocationPropertiesTests.cs

@ -30,7 +30,7 @@ namespace Squidex.Core.Schemas
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Editor ist not a valid value", "Editor")
new ValidationError("Editor is not a valid value", "Editor")
});
}

2
tests/Squidex.Core.Tests/Schemas/NumberFieldPropertiesTests.cs

@ -130,7 +130,7 @@ namespace Squidex.Core.Schemas
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Editor ist not a valid value", "Editor")
new ValidationError("Editor is not a valid value", "Editor")
});
}

2
tests/Squidex.Core.Tests/Schemas/StringFieldPropertiesTests.cs

@ -87,7 +87,7 @@ namespace Squidex.Core.Schemas
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Editor ist not a valid value", "Editor")
new ValidationError("Editor is not a valid value", "Editor")
});
}

Loading…
Cancel
Save