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()); }
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 ContentModifierForm BuildModifierForm(ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var f = field.DirectCastTo <TrashingField>(); var form = new TrashingFieldModifierForm { TrashedAt = f.TrashedUtc?.ToLocalTime() }; return(form); }
public ContentModifierForm BuildModifierForm(ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var fi = field.DirectCastTo <FilePickerField>(); var fm = new FilePickerFieldModifierForm { Val = fi.Val }; return(fm); }
public ContentModifierForm BuildModifierForm(ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var f = new CommonFieldModifierForm { ContentId = content?.Id, ContentTypeId = content?.ContentTypeId, OperationName = operation.Name }; return(f); }
public ContentModifierForm BuildModifierForm(ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var cf = field.DirectCastTo <SelectField>(); var val = cf.Val; var form = new SelectFieldModifierForm { Val = val }; return(form); }
public ContentModifierForm BuildModifierForm(ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var f = field != null?field.DirectCastTo <PublishingField>() : new PublishingField(); var form = new PublishingFieldModifierForm { PublishedAt = f.PublishedUtc?.ToLocalTime(), UnpublishedAt = f.UnpublishedUtc?.ToLocalTime() }; return(form); }
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 <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 ContentModifierForm BuildModifierForm(ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { var cf = field.DirectCastTo <TextField>(); var cfg = fieldDefinition.Config.DirectCastTo <TextFieldConfiguration>(); var val = cf.Val; if (operation.IsCreateOperation()) { val = cfg.InitialValue; } var form = new TextFieldModifierForm { Val = val }; return(form); }
public void PerformModification(IDictionary <string, ContentModifierForm> modifierForm, ProtoContent content, ContentModifyOperation operation, ContentType contentType) { foreach (var fd in contentType.Fields) { if (!operation.IsAny(fd.Config.HandledModifyOperationNames)) { continue; } var fdr = fd.FieldFinder(); var mod = fd.FieldModifier(); var field = operation.Is(CommonFieldModifyOperationsProvider.CREATE_OPERATION_NAME) ? Activator.CreateInstance(fd.ModelType).DirectCastTo <ContentField>() : fdr.GetModel(content, fd); modifierForm.TryGetValue(fd.FieldName, out var form); mod.PerformModification(form, field, operation, content, fd); } }
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 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 }); }
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 IDictionary <string, ContentModifierForm> BuildModifierForm(ProtoContent content, ContentModifyOperation operation, ContentType contentType) { var fps = new Dictionary <string, ContentModifierForm>(); foreach (var fd in contentType.Fields) { if (!operation.IsAny(fd.Config.HandledModifyOperationNames)) { continue; } var fdr = fd.FieldFinder(); var mod = fd.FieldModifier(); var field = operation.Is(CommonFieldModifyOperationsProvider.CREATE_OPERATION_NAME) ? Activator.CreateInstance(fd.ModelType).DirectCastTo <ContentField>() : fdr.GetModel(content, fd); var form = mod.BuildModifierForm(field, operation, content, fd); if (form != null) { fps.Add(fd.FieldName, form); } } return(fps); }
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()); }
public FurtherValidationResult ValidateModifierForm(IDictionary <string, ContentModifierForm> modifierForm, ProtoContent content, ContentModifyOperation operation, ContentType contentType) { var result = new FurtherValidationResult(); foreach (var fd in contentType.Fields) { if (!operation.IsAny(fd.Config.HandledModifyOperationNames)) { continue; } var fdr = fd.FieldFinder(); var mod = fd.FieldModifier(); var field = operation.Is(CommonFieldModifyOperationsProvider.CREATE_OPERATION_NAME) ? Activator.CreateInstance(fd.ModelType).DirectCastTo <ContentField>() : fdr.GetModel(content, fd); modifierForm.TryGetValue(fd.FieldName, out var form); if (form == null) { var testForm = mod.BuildModifierForm(field, operation, content, fd); if (testForm != null) { throw new HttpException(400, $"ProtoCMS: content modifier form for field '{fd.FieldName}' " + $"is required and must be an instance of " + $"'{testForm.GetType().FullName}'."); } continue; } foreach (var fvkv in fd.Config.Validators) { var hasValidator = false; foreach (var dv in ContentFieldValidator.DefinedValidators) { if (dv.Name != fvkv.Key || !dv.HandledFormTypes.Contains(form.GetType())) { continue; } hasValidator = true; var valCfg = fvkv.Value ?? Activator.CreateInstance(dv.ConfigType) .DirectCastTo <ContentFieldValidatorConfiguration>(); if (operation.IsAny(valCfg.ModifyOperationNamesThatIgnoreValidation)) { continue; } if (valCfg.GetType() != dv.ConfigType) { throw new InvalidOperationException( $"ProtoCMS: content field validator '{dv.Name}' (for validating form " + $"'{form.GetType().FullName}') can only accept config instance of type " + $"'{dv.ConfigType.FullName}'."); } var valRes = dv.ValidateForm(form, valCfg, contentType, fd); if (valRes != null) { foreach (var kv in valRes.Errors) { if (kv.Value == null || kv.Value.Length == 0) { continue; } foreach (var err in kv.Value) { result.AddError($"{fd.FieldName}.{kv.Key}", err); } } } } if (!hasValidator) { throw new InvalidOperationException($"ProtoCMS: there's no content field validator " + $"named '{fvkv.Key}' that can handle form " + $"'{form.GetType().FullName}' validation."); } } } return(result); }
protected void CheckUserHasPermissionToModifyContent(ProtoCmsRuntimeContext rctx, ModifyContentPermission modPerm, ContentModifyOperation modOp, ContentType ct) { if (!rctx.UserHasPermission(modPerm.Id)) { throw new HttpException(403, $"ProtoCMS: user is forbidden to perform modify operation " + $"'{modOp.Name}' on content type '{ct.Id}'."); } }
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); }
public ContentModifierForm BuildModifierForm(ContentField field, ContentModifyOperation operation, ProtoContent content, ContentFieldDefinition fieldDefinition) { return(null); }