public ProtoContent FindProtoContent(string contentId, string operationName) { ProtoContent content; var operation = FindModifyOperation(operationName); if (operation.IsCreatingNewContent) { content = new ProtoContent { Id = string.IsNullOrWhiteSpace(contentId) ? Guid.NewGuid().ToString() : contentId, ContentTypeId = ContentType.Id }; if (string.IsNullOrWhiteSpace(content.Id)) { throw new HttpException(400, $"ProtoCMS: ContentId is required."); } } else { content = ContentType.Finder().FindById(contentId); if (content == null) { throw new HttpException(400, $"ProtoCMS: no {ContentType.Id} content found with id " + $"'{contentId}'."); } if (content.ContentTypeId != ContentType.Id) { content.ContentTypeId = ContentType.Id; } } return(content); }
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 VueActionTrigger[] TableActionsForSingleContent(ProtoContent content, ProtoCmsRuntimeContext cmsContext, ContentType contentType) { var trigs = new List <VueActionTrigger>(); if (contentType.IsModifyOperationAllowed(CommonFieldModifyOperationsProvider.UPDATE_OPERATION_NAME)) { trigs.Add(new VueButton { Label = $"Update", IconCssClass = "fa fa-pencil", OnClick = $"protoCms.utils.popupEntityOperationForm('content', '{content.Id}', '{contentType.Id}', " + $"'{CommonFieldModifyOperationsProvider.UPDATE_OPERATION_NAME}', " + $"'Update', '{contentType.Name}')" }); } if (contentType.IsModifyOperationAllowed(CommonFieldModifyOperationsProvider.DELETE_OPERATION_NAME)) { trigs.Add(new VueButton { Label = $"Delete", IconCssClass = "fa fa-trash", OnClick = $"protoCms.utils.popupEntityOperationForm('content', '{content.Id}', '{contentType.Id}', " + $"'{CommonFieldModifyOperationsProvider.DELETE_OPERATION_NAME}', " + $"'Delete', '{contentType.Name}')" }); } return(trigs.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 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++; } }
public IDictionary <string, VueComponentDefinition[]> ConvertFormToVues( IDictionary <string, ContentModifierForm> modifierForm, ProtoContent content, ContentModifyOperation operation, ContentType contentType) { var vues = new Dictionary <string, VueComponentDefinition[]>(); 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); var fvs = mod.ConvertFormToVues(form, field, operation, content, fd); if (fvs != null && fvs.Length > 0) { vues.Add(fd.FieldName, fvs); } } return(vues); }
public ContentField GetModel(ProtoContent content, ContentFieldDefinition fieldDefinition) { var mdl = new TrashingField(); var tfn = $"{fieldDefinition.FieldName}.{nameof(TrashingField.TrashedUtc)}"; mdl.TrashedUtc = content.ContentFields.FirstOrDefault(x => x.FieldName == tfn)?.DateTimeValue; return(mdl); }
public ContentField GetModel(ProtoContent content, ContentFieldDefinition fieldDefinition) { var mdl = new BooleanField(); var fn = $"{fieldDefinition.FieldName}.{nameof(BooleanField.Val)}"; var f = content.ContentFields.FirstOrDefault(x => x.FieldName == fn); mdl.Val = f?.BooleanValue; return(mdl); }
public ContentField GetModel(ProtoContent content, ContentFieldDefinition fieldDefinition) { var mdl = new TextField(); var fn = $"{fieldDefinition.FieldName}.{nameof(TextField.Val)}"; var cf = content.ContentFields.FirstOrDefault(x => x.FieldName == fn); mdl.Val = cf?.StringValue; return(mdl); }
public ContentField GetModel(ProtoContent content, ContentFieldDefinition fieldDefinition) { var mdl = new FauxUrlSlugField(); var ct = fieldDefinition.ContentType; var fcfg = fieldDefinition.Config.DirectCastTo <FauxUrlSlugFieldConfiguration>(); var slugPatternParts = fcfg.SlugPattern.Trim('/').Split('/'); var slugParts = new List <string>(); foreach (var spp in slugPatternParts) { if (spp == ID_PATTERN_PART) { var cid = content.Id.Replace("-", ""); var pt = cid.Length <= fcfg.ContentIdSlugPartLength ? cid : cid.Substring(0, fcfg.ContentIdSlugPartLength); if (!string.IsNullOrWhiteSpace(pt)) { slugParts.Add(pt); } continue; } var matchSimple = PartPatternSimpleRegex.Match(spp); if (matchSimple.Success) { var fieldName = matchSimple.Groups["fieldName"].Value; var slugGenFieldDef = ct.Fields.First(x => x.FieldName == fieldName); var slugGenField = slugGenFieldDef.FieldFinder().GetModel(content, slugGenFieldDef) .DirectCastTo <IFauxUrlSlugGenerator>(); var pt = slugGenField?.GenerateFauxUrlSlugPart(null, slugGenFieldDef); if (!string.IsNullOrWhiteSpace(pt)) { slugParts.Add(pt); } continue; } var matchComplex = PartPatternComplexRegex.Match(spp); if (matchComplex.Success) { var fieldName = matchComplex.Groups["fieldName"].Value; var slugGenFieldDef = ct.Fields.First(x => x.FieldName == fieldName); var slugGenField = slugGenFieldDef.FieldFinder().GetModel(content, slugGenFieldDef) .DirectCastTo <IFauxUrlSlugGenerator>(); var slugGenParam = matchComplex.Groups["slugGeneratorParam"].Value; var pt = slugGenField?.GenerateFauxUrlSlugPart(slugGenParam, slugGenFieldDef); if (!string.IsNullOrWhiteSpace(pt)) { slugParts.Add(pt); } continue; } slugParts.Add(spp); } mdl.Slug = string.Join("/", slugParts); return(mdl); }
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 cf = field.DirectCastTo <SelectField>(); var val = cf.Val; var form = new SelectFieldModifierForm { Val = val }; return(form); }
public ContentField GetModel(ProtoContent content, ContentFieldDefinition fieldDefinition) { var model = new CommonField { Id = content.Id, ContentTypeId = content.ContentTypeId, CreatedUtc = content.CreatedUtc, UpdatedUtc = content.UpdatedUtc, CreatedByUserId = content.CreatedByUserId, CreatedByUserName = content.CreatedByUserName, CreatedByUserDisplayName = content.CreatedByUserDisplayName }; return(model); }
public ContentField GetModel(ProtoContent content, ContentFieldDefinition fieldDefinition) { var mdl = new ChronoField(); var fn = $"{fieldDefinition.FieldName}.{nameof(ChronoField.Val)}"; mdl.Val = content.ContentFields.FirstOrDefault(x => x.FieldName == fn)?.DateTimeValue; var cfg = fieldDefinition.Config.DirectCastTo <ChronoFieldConfiguration>(); if (mdl.Val.HasValue) { mdl.Val = DateTime.SpecifyKind(mdl.Val.Value, cfg.Kind); } return(mdl); }
public IDictionary <string, VueComponentDefinition[]> AsTableRowVue(ProtoContent content) { var result = new Dictionary <string, VueComponentDefinition[]>(); foreach (var fd in ContentType.Fields) { var ff = fd.FieldFinder(); var fmdl = ff.GetModel(content, fd); foreach (var col in ff.Columns) { result[$"{fd.FieldName}.{col.PropName}"] = col.CellValue(fmdl, fd); } } return(result); }
public ContentField GetModel(ProtoContent content, ContentFieldDefinition fieldDefinition) { var mdl = new NumberField(); var fn = $"{fieldDefinition.FieldName}.{nameof(NumberField.Val)}"; var cf = content.ContentFields.FirstOrDefault(x => x.FieldName == fn); mdl.Val = cf?.NumberValue; var cfg = fieldDefinition.Config.DirectCastTo <NumberFieldConfiguration>(); if (mdl.Val.HasValue && cfg.NumberKind == NumberValueKind.Integer) { mdl.Val = Convert.ToInt32(mdl.Val.Value); } return(mdl); }
public ContentPreviewPart[] AsFullPreview(ProtoContent content) { var result = new List <ContentPreviewPart>(); foreach (var fd in ContentType.Fields) { var ff = fd.FieldFinder(); var fmdl = ff.GetModel(content, fd); foreach (var col in ff.Columns) { result.Add(new ContentPreviewPart(col.ColumnHeader(fd), $"{fd.FieldName}.{col.PropName}", col.FullPreviewValue(fmdl, fd))); } } return(result.OrderBy(x => x.Label).ToArray()); }
public VueActionTrigger[] TableActionsForSingleContent(ProtoContent content, ProtoCmsRuntimeContext cmsContext, ContentType contentType) { var trigs = new List <VueActionTrigger>(); if (contentType.IsModifyOperationAllowed( TrashingFieldModifyOperationsProvider.CHANGE_TRASH_STATUS_OPERATION_NAME)) { trigs.Add(new VueButton { Label = "Trash/Untrash", IconCssClass = "fa fa-trash-o", OnClick = $"protoCms.utils.popupEntityOperationForm('content', '{content.Id}', '{contentType.Id}', " + $"'{TrashingFieldModifyOperationsProvider.CHANGE_TRASH_STATUS_OPERATION_NAME}', " + $"'Trash/Untrash', '{contentType.Name}')" }); } return(trigs.ToArray()); }
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(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 void PerformModification(IDictionary <string, ContentModifierForm> modifierForm, string contentId, out ProtoContent modifiedContent, string operationName) { var operation = FindModifyOperation(operationName); var db = _dbContext.ThisDbContext(); using (var dbTrx = db.Database.BeginTransaction()) { try { modifiedContent = FindProtoContent(contentId, operationName); foreach (var h in Handlers) { h.PerformModification(modifierForm, modifiedContent, operation, ContentType); } dbTrx.Commit(); } catch (Exception) { dbTrx.Rollback(); throw; } } }
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 string AsSummarizedValue(ProtoContent content, IEnumerable <string> summarySourceFieldNames = null) { var parts = new List <string>(); summarySourceFieldNames = summarySourceFieldNames ?? ContentType.FieldNamesIncludedInSummary; foreach (var fn in summarySourceFieldNames) { var fd = ContentType.Field(fn); var ffr = fd.FieldFinder(); var fm = ffr.GetModel(content, fd); if (fn == $"{fd.FieldName}") { foreach (var fc in ffr.Columns) { var fsumz = fc.SummarizedValue(fm, fd)?.Trim(); if (!string.IsNullOrWhiteSpace(fsumz)) { parts.Add($"{fsumz}"); } } } else { var fc = ffr.Columns.FirstOrDefault(x => $"{fd.FieldName}.{x.PropName}" == fn); if (fc == null) { continue; } var fsumz = fc.SummarizedValue(fm, fd)?.Trim(); if (!string.IsNullOrWhiteSpace(fsumz)) { parts.Add($"{fsumz}"); } } } var sv = string.Join($" {SUMMARY_VALUE_SEPARATOR} ", parts); return(sv); }
public ContentField GetModel(ProtoContent content, ContentFieldDefinition fieldDefinition) { var fcfg = fieldDefinition.Config.DirectCastTo <FilePickerFieldConfiguration>(); var mdl = new FilePickerField(); var fnPrefix = $"{fieldDefinition.FieldName}.{nameof(FilePickerField.Val)}."; if (!fcfg.IsMultiSelect) { var cf = content.ContentFields.FirstOrDefault(x => x.FieldName.StartsWith(fnPrefix)); if (cf?.StringValue != null) { mdl.Val = new[] { cf.StringValue }; } } else { var cfs = content.ContentFields.Where( x => x.FieldName.StartsWith(fnPrefix)).ToArray(); var vals = new List <Tuple <int, string> >(); foreach (var cf in cfs) { var idxStr = cf.FieldName.Replace(fnPrefix, ""); if (!int.TryParse(idxStr, out var idx)) { continue; } if (cf.StringValue != null) { vals.Add(Tuple.Create(idx, cf.StringValue)); } } mdl.Val = vals.OrderBy(x => x.Item1).Select(x => x.Item2).ToArray(); } mdl.UpdateRelatedPaths(_fileMgr.GetHandler()); return(mdl); }
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 dynamic GetContentShaped(ProtoContent content, ContentType contentType, ProtoCmsRuntimeContext cmsContext, ContentListShape shape) { var finder = contentType.Finder(); switch (shape) { case ContentListShape.TableRowVue: var cdt = finder.AsTableRowVue(content); cdt.Add(ContentListApiResult.CONTENT_TABLE_ACTION_KEY, new[] { new VueComponentDefinition { Name = "cms-widget-dropdown-button", Props = new { label = "Opt", size = "xs", type = "warning", iconCssClass = "fa fa-angle-down", items = finder.TableActionsForSingleContent(content.Id, cmsContext) } } }); return(cdt); case ContentListShape.Summary: return(new { content.Id, content.ContentTypeId, Summary = finder.AsSummarizedValue(content, contentType.FieldNamesIncludedInSummary) }); case ContentListShape.FullPreview: return(finder.AsFullPreview(content)); default: return(finder.AsDynamic(content)); } }
public bool IsContentMatchFauxUrlSlug(ProtoContent content, string fauxUrlSlug) { var slugParts = fauxUrlSlug.Trim('/').Split('/'); foreach (var fsf in ContentType.DefinedTypes.Where(x => x.Fields.Any(f => f.ModelType == typeof(FauxUrlSlugField))).Select(x => x.Fields.First(f => f.ModelType == typeof(FauxUrlSlugField)))) { var fcfg = fsf.Config.DirectCastTo <FauxUrlSlugFieldConfiguration>(); var idLen = fcfg.ContentIdSlugPartLength; var cfgSlugPatternParts = fcfg.SlugPattern.Trim('/').Split('/'); if (cfgSlugPatternParts.Length != slugParts.Length) { continue; } for (var i = 0; i < cfgSlugPatternParts.Length; i++) { var cspp = cfgSlugPatternParts[i]; if (cspp != FauxUrlSlugFieldFinder.ID_PATTERN_PART) { continue; } var sp = slugParts[i]; if (sp.Length != idLen) { continue; } var match = content.Id.Replace("-", "").StartsWith(sp); if (match) { return(true); } } } return(false); }
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 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()); }