/// <summary> /// Validate the form /// </summary> public FurtherValidationResult ValidateForm(ContentModifierForm form, ContentFieldValidatorConfiguration config, ContentType contentType, ContentFieldDefinition fieldDefinition) { ValidateValidatorParams(); return(Validate(form, config, contentType, fieldDefinition)); }
protected override FurtherValidationResult Validate(ContentModifierForm form, ContentFieldValidatorConfiguration config, ContentType contentType, ContentFieldDefinition fieldDefinition) { var fm = form.DirectCastTo <FilePickerFieldModifierForm>(); var cfg = config.DirectCastTo <FileExtensionValidatorConfiguration>(); if (cfg.AllowedFileExtensions.Length == 0) { return(null); } var errs = new List <string>(); var allowedFileExts = cfg.AllowedFileExtensions.Where(x => x?.Trim().Trim('.').ToLowerInvariant() != null).ToArray(); var isOrAre = allowedFileExts.Length > 0 ? "are" : "is"; var allowedFileExtsStr = $"'{string.Join("', '", allowedFileExts)}'"; foreach (var path in fm.Val) { var lastDotIdx = path.LastIndexOf('.'); var fileExt = path.Substring(lastDotIdx).Trim('.'); if (allowedFileExts.All(x => x != fileExt.ToLowerInvariant())) { errs.Add($"File extension '{fileExt}' is not allowed. Only {allowedFileExtsStr} {isOrAre} allowed."); } } if (errs.Count == 0) { return(null); } var valres = new FurtherValidationResult(); valres.Errors[nameof(FilePickerFieldModifierForm.Val)] = errs.ToArray(); return(valres); }
public void PerformModification(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var fm = modifierForm.DirectCastTo <FilePickerFieldModifierForm>(); var fnPrefix = $"{fieldDefinition.FieldName}.{nameof(FilePickerField.Val)}."; var existing = content.ContentFields.Where(x => x.FieldName.StartsWith(fnPrefix)).ToArray(); foreach (var cfe in existing) { content.ContentFields.Remove(cfe); _dbContext.ProtoFields.Remove(cfe); } var idx = 0; foreach (var path in fm.Val) { var cf = new ProtoField { ContentId = content.Id, StringValue = path, FieldName = $"{fnPrefix}{idx}", FieldClassTypeName = typeof(FilePickerField).FullName }; content.ContentFields.Add(cf); idx++; } }
public void PerformModification(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var f = modifierForm.DirectCastTo <SelectFieldModifierForm>(); var fnPrefix = $"{fieldDefinition.FieldName}.{nameof(SelectField.Val)}."; var existingCfs = content.ContentFields.Where(x => x.FieldName.StartsWith(fnPrefix)) .ToArray(); foreach (var excf in existingCfs) { content.ContentFields.Remove(excf); _dbContext.ProtoFields.Remove(excf); } var idx = 0; foreach (var fv in f.Val) { if (fv == null) { continue; } var cf = new ProtoField { ContentId = content.Id, FieldName = $"{fnPrefix}{idx}" }; content.ContentFields.Add(cf); cf.FieldClassTypeName = typeof(SelectField).FullName; cf.StringValue = fv; idx++; } }
protected override FurtherValidationResult Validate(ContentModifierForm form, ContentFieldValidatorConfiguration config, ContentType contentType, ContentFieldDefinition fieldDefinition) { var valCfg = config.DirectCastTo <TextFieldLengthValidatorConfiguration>(); var f = form.DirectCastTo <TextFieldModifierForm>(); if (f.Val == null) { return(null); } var result = new FurtherValidationResult(); var dispName = fieldDefinition.Config.Label ?? fieldDefinition.FieldName; if (valCfg.MinLength.HasValue) { var ml = valCfg.MinLength.Value; if (f.Val.Length < ml) { result.AddError(nameof(f.Val), string.Format(valCfg.MinLengthErrorMessage, dispName, ml)); } } if (valCfg.MaxLength.HasValue) { var ml = valCfg.MaxLength.Value; if (f.Val.Length > ml) { result.AddError(nameof(f.Val), string.Format(valCfg.MaxLengthErrorMessage, dispName, ml)); } } return(result); }
public VueComponentDefinition[] ConvertFormToVues(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var vues = new List <VueComponentDefinition>(); if (operation.IsDeleteOperation()) { vues.Add(new VueHtmlWidget("Proceed to delete?")); } vues.AddRange(new[] { new VueComponentDefinition { Name = "cms-form-field-hidden", Props = new { valuePath = nameof(CommonFieldModifierForm.ContentId) } }, new VueComponentDefinition { Name = "cms-form-field-hidden", Props = new { valuePath = nameof(CommonFieldModifierForm.ContentTypeId) } }, new VueComponentDefinition { Name = "cms-form-field-hidden", Props = new { valuePath = nameof(CommonFieldModifierForm.OperationName) } } }); return(vues.ToArray()); }
protected override FurtherValidationResult Validate(ContentModifierForm form, ContentFieldValidatorConfiguration config, ContentType contentType, ContentFieldDefinition fieldDefinition) { var f = form.DirectCastTo <NumberFieldModifierForm>(); var valCfg = config.DirectCastTo <NumberFieldRangeValidatorConfiguration>(); if (!f.Val.HasValue) { return(null); } var result = new FurtherValidationResult(); var dispName = fieldDefinition.Config.Label ?? fieldDefinition.FieldName; if (valCfg.MinValue.HasValue) { var mv = valCfg.MinValue.Value; if (valCfg.MinValueIsInclusive) { if (f.Val.Value < mv) { result.AddError( nameof(f.Val), string.Format(valCfg.MinValueInclusiveErrorMessage, dispName, mv)); } } else { if (f.Val.Value <= mv) { result.AddError( nameof(f.Val), string.Format(valCfg.MinValueErrorMessage, dispName, mv)); } } } if (valCfg.MaxValue.HasValue) { var mv = valCfg.MaxValue.Value; if (valCfg.MaxValueIsInclusive) { if (f.Val.Value > mv) { result.AddError( nameof(f.Val), string.Format(valCfg.MaxValueInclusiveErrorMessage, dispName, mv)); } } else { if (f.Val.Value >= mv) { result.AddError( nameof(f.Val), string.Format(valCfg.MaxValueErrorMessage, dispName, mv)); } } } return(result); }
public VueComponentDefinition[] ConvertFormToVues(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { return(new[] { new VueComponentDefinition { Name = "cms-form-field-datetime", Props = new { label = "Trashed At", valuePath = nameof(TrashingFieldModifierForm.TrashedAt) } } }); }
public VueComponentDefinition[] ConvertFormToVues(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var cfg = fieldDefinition.Config.DirectCastTo <NumberFieldConfiguration>(); return(new[] { new VueComponentDefinition { Name = "cms-form-field-number", Props = new { label = cfg.Label ?? fieldDefinition.FieldName, valuePath = nameof(NumberFieldModifierForm.Val), numberKind = cfg.NumberKind.ToString().ToLowerInvariant(), helpText = cfg.HelpText, } } }); }
public VueComponentDefinition[] ConvertFormToVues(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var fcfg = fieldDefinition.Config.DirectCastTo <BooleanFieldConfiguration>(); return(new[] { new VueComponentDefinition { Name = "cms-form-field-checkbox", Props = new { label = fieldDefinition.Config.Label ?? fieldDefinition.FieldName, valuePath = nameof(BooleanFieldModifierForm.Val), yesLabel = fcfg.TrueBoolLabel, noLabel = fcfg.FalseBoolLabel, helpText = fcfg.HelpText, } } }); }
public VueComponentDefinition[] ConvertFormToVues(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var fcfg = fieldDefinition.Config.DirectCastTo <FilePickerFieldConfiguration>(); return(new[] { new VueComponentDefinition { Name = "cms-form-field-file-picker", Props = new { label = fcfg.Label ?? fieldDefinition.FieldName, valuePath = nameof(FilePickerFieldModifierForm.Val), helpText = fcfg.HelpText, isMultiSelect = fcfg.IsMultiSelect, fileExplorerPageUrl = _urlProv.GenerateManageFileExplorerUrl() } } }); }
public VueComponentDefinition[] ConvertFormToVues(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var cfg = fieldDefinition.Config.DirectCastTo <SelectFieldConfiguration>(); return(new[] { new VueComponentDefinition { Name = "cms-form-field-select", Props = new { label = fieldDefinition.Config.Label ?? fieldDefinition.FieldName, valuePath = $"{nameof(SelectField.Val)}", isMultiSelect = cfg.IsMultiSelect, optionsHandlerId = cfg.OptionsHandlerId, optionsHandlerParam = cfg.OptionsHandlerParam } }, }); }
public void PerformModification(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var fn = $"{fieldDefinition.FieldName}.{nameof(TrashingField.TrashedUtc)}"; var fp = modifierForm.DirectCastTo <TrashingFieldModifierForm>(); var trashedUtc = fp?.TrashedAt?.ToUniversalTime(); var cf = content.ContentFields.FirstOrDefault(x => x.FieldName == fn); if (cf == null) { cf = new ProtoField { FieldName = fn, ContentId = content.Id }; content.ContentFields.Add(cf); } cf.FieldClassTypeName = typeof(TrashingField).FullName; cf.DateTimeValue = trashedUtc; }
public VueComponentDefinition[] ConvertFormToVues(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var fcfg = fieldDefinition.Config.DirectCastTo <ChronoFieldConfiguration>(); var pickerKind = fcfg.PickerKind.ToString(); return(new[] { new VueComponentDefinition { Name = "cms-form-field-datetime", Props = new { label = $"{fcfg.Label}", helpText = fcfg.HelpText, valuePath = nameof(ChronoFieldModifierForm.Val), pickerKind } } }); }
public void PerformModification(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var cfg = fieldDefinition.Config.DirectCastTo <BooleanFieldConfiguration>(); var form = modifierForm.DirectCastTo <BooleanFieldModifierForm>(); var fn = $"{fieldDefinition.FieldName}.{nameof(BooleanField.Val)}"; var cf = content.ContentFields.FirstOrDefault(x => x.FieldName == fn); if (cf == null) { cf = new ProtoField { ContentId = content.Id, FieldName = fn }; content.ContentFields.Add(cf); } cf.FieldClassTypeName = typeof(BooleanField).FullName; cf.BooleanValue = form.Val ?? cfg.DefaultValue; }
public void PerformModification(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var f = modifierForm.DirectCastTo <TextFieldModifierForm>(); var cfg = fieldDefinition.Config.DirectCastTo <TextFieldConfiguration>(); var fn = $"{fieldDefinition.FieldName}.{nameof(f.Val)}"; var cf = content.ContentFields.FirstOrDefault(x => x.FieldName == fn); if (cf == null) { cf = new ProtoField { ContentId = content.Id, FieldName = fn }; content.ContentFields.Add(cf); } cf.FieldClassTypeName = typeof(TextField).FullName; cf.StringValue = string.IsNullOrWhiteSpace(f.Val) ? cfg.DefaultValue?.Trim() : f.Val; }
public VueComponentDefinition[] ConvertFormToVues(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var cfg = fieldDefinition.Config.DirectCastTo <TextFieldConfiguration>(); var editorVue = new VueComponentDefinition { Name = "cms-form-field-text", Props = new { label = cfg.Label, helpText = cfg.HelpText, valuePath = nameof(TextFieldModifierForm.Val) } }; switch (cfg.EditorType) { case TextFieldEditorType.TextArea: editorVue = new VueComponentDefinition { Name = "cms-form-field-textarea", Props = new { label = cfg.Label, helpText = cfg.HelpText, valuePath = nameof(TextFieldModifierForm.Val) } }; break; case TextFieldEditorType.RichHtml: editorVue = new VueComponentDefinition { Name = "cms-form-field-rich-html", Props = new { label = cfg.Label, helpText = cfg.HelpText, valuePath = nameof(TextFieldModifierForm.Val) } }; break; } return(new[] { editorVue }); }
protected override FurtherValidationResult Validate(ContentModifierForm form, ContentFieldValidatorConfiguration config, ContentType contentType, ContentFieldDefinition fieldDefinition) { var cfg = config.DirectCastTo <TextFieldRegexValidatorConfiguration>(); var fm = form.DirectCastTo <TextFieldModifierForm>(); if (fm.Val == null) { return(null); } if (!cfg.Regex.IsMatch(fm.Val)) { var dispName = fieldDefinition.Config.Label ?? fieldDefinition.FieldName; var res = new FurtherValidationResult(); res.AddError(nameof(fm.Val), string.Format(cfg.ErrorMessage, dispName, cfg.Pattern)); return(res); } return(null); }
public void PerformModification(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var pfn = $"{fieldDefinition.FieldName}.{nameof(PublishingField.PublishedUtc)}"; var ufn = $"{fieldDefinition.FieldName}.{nameof(PublishingField.UnpublishedUtc)}"; var fp = modifierForm.DirectCastTo <PublishingFieldModifierForm>(); var publishedUtc = fp?.PublishedAt?.ToUniversalTime(); var pcf = content.ContentFields.FirstOrDefault(x => x.FieldName == pfn); if (pcf == null) { pcf = new ProtoField { FieldName = pfn, ContentId = content.Id }; content.ContentFields.Add(pcf); } pcf.FieldClassTypeName = typeof(PublishingField).FullName; pcf.DateTimeValue = publishedUtc; var unpublishedUtc = fp?.UnpublishedAt?.ToUniversalTime(); var ucf = content.ContentFields.FirstOrDefault(x => x.FieldName == ufn); if (ucf == null) { ucf = new ProtoField { FieldName = ufn, ContentId = content.Id }; content.ContentFields.Add(ucf); } ucf.FieldClassTypeName = typeof(PublishingField).FullName; ucf.DateTimeValue = unpublishedUtc; }
public void PerformModification(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { if (operation.Is(CommonFieldModifyOperationsProvider.CREATE_OPERATION_NAME)) { content.CreatedUtc = DateTime.UtcNow; content.UpdatedUtc = content.CreatedUtc; _dbContext.ProtoContents.Add(content); } else if (operation.Is(CommonFieldModifyOperationsProvider.DELETE_OPERATION_NAME)) { content.UpdatedUtc = DateTime.UtcNow; _dbContext.ProtoContents.Remove(content); } else { content.UpdatedUtc = DateTime.UtcNow; } if (string.IsNullOrWhiteSpace(content.CreatedByUserId)) { var rctx = ProtoCmsRuntimeContext.Current; if (rctx.CurrentUser != null) { content.CreatedByUserId = rctx.CurrentUser.Id; } } var creator = _userMgr.ProtoUsers.FirstOrDefault(x => x.Id == content.CreatedByUserId); if (creator != null) { content.CreatedByUserName = creator.UserName; content.CreatedByUserDisplayName = creator.DisplayName; } _dbContext.ThisDbContext().SaveChanges(); }
public VueComponentDefinition[] ConvertFormToVues(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var vues = new List <VueComponentDefinition> { new VueComponentDefinition { Name = "cms-form-field-datetime", Props = new { label = "Published At", valuePath = nameof(PublishingFieldModifierForm.PublishedAt) } }, new VueComponentDefinition { Name = "cms-form-field-datetime", Props = new { label = "Unpublished At", valuePath = nameof(PublishingFieldModifierForm.UnpublishedAt) } } }; return(vues.ToArray()); }
protected override FurtherValidationResult Validate(ContentModifierForm form, ContentFieldValidatorConfiguration config, ContentType type, ContentFieldDefinition definition) { var genericSimpleFormType = FindGenericSimpleFormType(form.GetType()); var valType = genericSimpleFormType.GenericTypeArguments[0]; if (valType.IsValueType && !(valType.IsGenericType && valType.GetGenericTypeDefinition() == typeof(Nullable <>))) { return(null); } var simpleFieldFormType = typeof(SimpleContentFieldModifierForm <>).MakeGenericType(valType); var valProp = simpleFieldFormType.GetProperty(nameof(SimpleContentFieldModifierForm <string> .Val)); var val = valProp?.GetValue(form); var fcfg = definition.Config; var cfg = config.DirectCastTo <SimpleFieldRequiredValidatorConfiguration>(); var dispName = fcfg.Label ?? definition.FieldName; var errMsg = cfg.RequiredNullableErrorMessage; if (val is string) { var valStr = val.DirectCastTo <string>(); if (!string.IsNullOrWhiteSpace(valStr)) { return(null); } errMsg = cfg.RequiredStringErrorMessage; } else if (val != null) { if (typeof(IEnumerable).IsAssignableFrom(valType)) { //https://stackoverflow.com/questions/5604168/calculating-count-for-ienumerable-non-generic var source = (IEnumerable)val; var count = 0; if (source is ICollection sourceAsCollection) { count = sourceAsCollection.Count; } else { var enumerator = source.GetEnumerator(); try { while (enumerator.MoveNext()) { count++; } } finally { if (enumerator is IDisposable disposableObj) { disposableObj.Dispose(); } } } if (count > 0) { return(null); } } else { return(null); } } var vr = new FurtherValidationResult(); vr.AddError(nameof(SimpleContentFieldModifierForm <string> .Val), string.Format(errMsg, new object[] { dispName })); return(vr); }
/// <summary> /// The validate function. /// </summary> /// <param name="form">The form to validate.</param> /// <param name="config">Validator configuration.</param> /// <param name="contentType">Content type that wants validation.</param> /// <param name="fieldDefinition">Content field definition related to this validation.</param> /// <returns>Validation result</returns> protected abstract FurtherValidationResult Validate(ContentModifierForm form, ContentFieldValidatorConfiguration config, ContentType contentType, ContentFieldDefinition fieldDefinition);
public void PerformModification(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { }
public VueComponentDefinition[] ConvertFormToVues(ContentModifierForm modifierForm, ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { return(null); }