Ejemplo n.º 1
0
 /// <summary>
 ///     Validate the form
 /// </summary>
 public FurtherValidationResult ValidateForm(ContentModifierForm form,
                                             ContentFieldValidatorConfiguration config,
                                             ContentType contentType, ContentFieldDefinition fieldDefinition)
 {
     ValidateValidatorParams();
     return(Validate(form, config, contentType, fieldDefinition));
 }
Ejemplo n.º 2
0
        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++;
            }
        }
Ejemplo n.º 4
0
        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++;
            }
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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());
        }
Ejemplo n.º 7
0
        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()
                    }
                }
            });
        }
Ejemplo n.º 12
0
        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;
        }
Ejemplo n.º 14
0
        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;
        }
Ejemplo n.º 20
0
        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);
        }
Ejemplo n.º 23
0
 /// <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);
 }