コード例 #1
0
        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);
        }
コード例 #2
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());
        }
        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++;
            }
        }
コード例 #5
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++;
            }
        }
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #15
0
        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);
        }
コード例 #17
0
        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());
        }
コード例 #18
0
        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;
        }
コード例 #21
0
        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;
        }
コード例 #24
0
        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;
        }
コード例 #27
0
        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());
        }