Beispiel #1
0
        public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
        {
            //FROM IContent TO ContentItemDisplay
            config.CreateMap <IContent, ContentItemDisplay>()
            .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(content.IsBlueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, content.Key)))
            .ForMember(display => display.Owner, expression => expression.ResolveUsing(new OwnerResolver <IContent>()))
            .ForMember(display => display.Updater, expression => expression.ResolveUsing(new CreatorResolver()))
            .ForMember(display => display.Icon, expression => expression.MapFrom(content => content.ContentType.Icon))
            .ForMember(display => display.ContentTypeAlias, expression => expression.MapFrom(content => content.ContentType.Alias))
            .ForMember(display => display.ContentTypeName, expression => expression.MapFrom(content => content.ContentType.Name))
            .ForMember(display => display.IsContainer, expression => expression.MapFrom(content => content.ContentType.IsContainer))
            .ForMember(display => display.IsChildOfListView, expression => expression.ResolveUsing(new ChildOfListViewResolver(applicationContext.Services.ContentService, applicationContext.Services.ContentTypeService)))
            .ForMember(display => display.Trashed, expression => expression.MapFrom(content => content.Trashed))
            .ForMember(display => display.PublishDate, expression => expression.MapFrom(content => GetPublishedDate(content)))
            .ForMember(display => display.TemplateAlias, expression => expression.ResolveUsing <DefaultTemplateResolver>())
            .ForMember(display => display.HasPublishedVersion, expression => expression.MapFrom(content => content.HasPublishedVersion))
            .ForMember(display => display.Urls, expression => expression.ResolveUsing <ContentUrlResolver>())
            .ForMember(display => display.Properties, expression => expression.Ignore())
            .ForMember(display => display.AllowPreview, expression => expression.Ignore())
            .ForMember(display => display.TreeNodeUrl, opt => opt.ResolveUsing(new ContentTreeNodeUrlResolver <IContent, ContentTreeController>()))
            .ForMember(display => display.Notifications, expression => expression.Ignore())
            .ForMember(display => display.Errors, expression => expression.Ignore())
            .ForMember(display => display.Alias, expression => expression.Ignore())
            .ForMember(display => display.DocumentType, expression => expression.ResolveUsing <ContentTypeBasicResolver>())
            .ForMember(display => display.AllowedTemplates, expression =>
                       expression.MapFrom(content => content.ContentType.AllowedTemplates
                                          .Where(t => t.Alias.IsNullOrWhiteSpace() == false && t.Name.IsNullOrWhiteSpace() == false)
                                          .ToDictionary(t => t.Alias, t => t.Name)))
            .ForMember(display => display.Tabs, expression => expression.ResolveUsing(new TabsAndPropertiesResolver <IContent>(applicationContext.Services.TextService)))
            .ForMember(display => display.AllowedActions, expression => expression.ResolveUsing(
                           new ActionButtonsResolver(new Lazy <IUserService>(() => applicationContext.Services.UserService), new Lazy <IContentService>(() => applicationContext.Services.ContentService))))
            .AfterMap((content, display) =>
            {
                if (content.ContentType.IsContainer)
                {
                    TabsAndPropertiesResolver <IContent> .AddListView(display, "content", applicationContext.Services.DataTypeService, applicationContext.Services.TextService);
                }
            });

            //FROM IContent TO ContentItemBasic<ContentPropertyBasic, IContent>
            config.CreateMap <IContent, ContentItemBasic <ContentPropertyBasic, IContent> >()
            .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(content.IsBlueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, content.Key)))
            .ForMember(dto => dto.Owner, expression => expression.ResolveUsing(new OwnerResolver <IContent>()))
            .ForMember(dto => dto.Updater, expression => expression.ResolveUsing(new CreatorResolver()))
            .ForMember(dto => dto.Icon, expression => expression.MapFrom(content => content.ContentType.Icon))
            .ForMember(dto => dto.Trashed, expression => expression.MapFrom(content => content.Trashed))
            .ForMember(dto => dto.HasPublishedVersion, expression => expression.MapFrom(content => content.HasPublishedVersion))
            .ForMember(dto => dto.ContentTypeAlias, expression => expression.MapFrom(content => content.ContentType.Alias))
            .ForMember(dto => dto.Alias, expression => expression.Ignore());

            //FROM IContent TO ContentItemDto<IContent>
            config.CreateMap <IContent, ContentItemDto <IContent> >()
            .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(content.IsBlueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, content.Key)))
            .ForMember(dto => dto.Owner, expression => expression.ResolveUsing(new OwnerResolver <IContent>()))
            .ForMember(dto => dto.HasPublishedVersion, expression => expression.MapFrom(content => content.HasPublishedVersion))
            .ForMember(dto => dto.Updater, expression => expression.Ignore())
            .ForMember(dto => dto.Icon, expression => expression.Ignore())
            .ForMember(dto => dto.Alias, expression => expression.Ignore());
        }
Beispiel #2
0
        public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
        {
            //FROM IMedia TO MediaItemDisplay
            config.CreateMap <IMedia, MediaItemDisplay>()
            .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Media, content.Key)))
            .ForMember(display => display.Owner, expression => expression.ResolveUsing(new OwnerResolver <IMedia>()))
            .ForMember(display => display.Icon, expression => expression.MapFrom(content => content.ContentType.Icon))
            .ForMember(display => display.ContentTypeAlias, expression => expression.MapFrom(content => content.ContentType.Alias))
            .ForMember(display => display.IsChildOfListView, expression => expression.ResolveUsing(new ChildOfListViewResolver(applicationContext.Services.MediaService, applicationContext.Services.ContentTypeService)))
            .ForMember(display => display.Trashed, expression => expression.MapFrom(content => content.Trashed))
            .ForMember(display => display.ContentTypeName, expression => expression.MapFrom(content => content.ContentType.Name))
            .ForMember(display => display.Properties, expression => expression.Ignore())
            .ForMember(display => display.TreeNodeUrl, opt => opt.ResolveUsing(new ContentTreeNodeUrlResolver <IMedia, MediaTreeController>()))
            .ForMember(display => display.Notifications, expression => expression.Ignore())
            .ForMember(display => display.Errors, expression => expression.Ignore())
            .ForMember(display => display.Published, expression => expression.Ignore())
            .ForMember(display => display.Updater, expression => expression.Ignore())
            .ForMember(display => display.Alias, expression => expression.Ignore())
            .ForMember(display => display.IsContainer, expression => expression.Ignore())
            .ForMember(display => display.HasPublishedVersion, expression => expression.Ignore())
            .ForMember(display => display.Tabs, expression => expression.ResolveUsing(new TabsAndPropertiesResolver <IMedia>(applicationContext.Services.TextService)))
            .ForMember(display => display.ContentType, expression => expression.ResolveUsing <MediaTypeBasicResolver>())
            .ForMember(display => display.MediaLink, expression => expression.ResolveUsing(
                           content => string.Join(",", content.GetUrls(UmbracoConfig.For.UmbracoSettings().Content, applicationContext.ProfilingLogger.Logger))))
            .AfterMap((media, display) =>
            {
                if (media.ContentType.IsContainer)
                {
                    TabsAndPropertiesResolver <IMedia> .AddListView(display, "media", applicationContext.Services.DataTypeService, applicationContext.Services.TextService);
                }
            });

            //FROM IMedia TO ContentItemBasic<ContentPropertyBasic, IMedia>
            config.CreateMap <IMedia, ContentItemBasic <ContentPropertyBasic, IMedia> >()
            .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Media, content.Key)))
            .ForMember(dto => dto.Owner, expression => expression.ResolveUsing(new OwnerResolver <IMedia>()))
            .ForMember(dto => dto.Icon, expression => expression.MapFrom(content => content.ContentType.Icon))
            .ForMember(dto => dto.Trashed, expression => expression.MapFrom(content => content.Trashed))
            .ForMember(dto => dto.ContentTypeAlias, expression => expression.MapFrom(content => content.ContentType.Alias))
            .ForMember(dto => dto.Published, expression => expression.Ignore())
            .ForMember(dto => dto.Updater, expression => expression.Ignore())
            .ForMember(dto => dto.Alias, expression => expression.Ignore())
            .ForMember(dto => dto.HasPublishedVersion, expression => expression.Ignore());

            //FROM IMedia TO ContentItemDto<IMedia>
            config.CreateMap <IMedia, ContentItemDto <IMedia> >()
            .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Media, content.Key)))
            .ForMember(dto => dto.Owner, expression => expression.ResolveUsing(new OwnerResolver <IMedia>()))
            .ForMember(dto => dto.Published, expression => expression.Ignore())
            .ForMember(dto => dto.Updater, expression => expression.Ignore())
            .ForMember(dto => dto.Icon, expression => expression.Ignore())
            .ForMember(dto => dto.Alias, expression => expression.Ignore())
            .ForMember(dto => dto.HasPublishedVersion, expression => expression.Ignore());
        }
Beispiel #3
0
        private static void AfterMap(IMedia media, MediaItemDisplay display, IDataTypeService dataTypeService)
        {
            //map the tree node url
            if (HttpContext.Current != null)
            {
                var urlHelper = new UrlHelper(new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData()));
                var url       = urlHelper.GetUmbracoApiService <MediaTreeController>(controller => controller.GetTreeNode(display.Id.ToString(), null));
                display.TreeNodeUrl = url;
            }

            if (media.ContentType.IsContainer)
            {
                TabsAndPropertiesResolver.AddListView(display, "media", dataTypeService);
            }

            TabsAndPropertiesResolver.MapGenericProperties(media, display);
        }
        private static void AfterMap(IMedia media, MediaItemDisplay display, IDataTypeService dataTypeService, ILocalizedTextService localizedText, IContentTypeService contentTypeService, ILogger logger)
        {
            // Adapted from ContentModelMapper
            //map the IsChildOfListView (this is actually if it is a descendant of a list view!)
            var parent = media.Parent();

            display.IsChildOfListView = parent != null && (parent.ContentType.IsContainer || contentTypeService.HasContainerInPath(parent.Path));

            //map the tree node url
            if (HttpContext.Current != null)
            {
                var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
                var url       = urlHelper.GetUmbracoApiService <MediaTreeController>(controller => controller.GetTreeNode(display.Id.ToString(), null));
                display.TreeNodeUrl = url;
            }

            if (media.ContentType.IsContainer)
            {
                TabsAndPropertiesResolver.AddListView(display, "media", dataTypeService, localizedText);
            }

            var genericProperties = new List <ContentPropertyDisplay>
            {
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}doctype", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("content/mediatype"),
                    Value = localizedText.UmbracoDictionaryTranslate(display.ContentTypeName),
                    View  = PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View
                }
            };

            TabsAndPropertiesResolver.MapGenericProperties(media, display, localizedText, genericProperties, properties =>
            {
                if (HttpContext.Current != null && UmbracoContext.Current != null && UmbracoContext.Current.Security.CurrentUser != null &&
                    UmbracoContext.Current.Security.CurrentUser.AllowedSections.Any(x => x.Equals(Constants.Applications.Settings)))
                {
                    var mediaTypeLink = string.Format("#/settings/mediatypes/edit/{0}", media.ContentTypeId);

                    //Replace the doctype property
                    var docTypeProperty   = properties.First(x => x.Alias == string.Format("{0}doctype", Constants.PropertyEditors.InternalGenericPropertiesPrefix));
                    docTypeProperty.Value = new List <object>
                    {
                        new
                        {
                            linkText = media.ContentType.Name,
                            url      = mediaTypeLink,
                            target   = "_self",
                            icon     = "icon-item-arrangement"
                        }
                    };
                    docTypeProperty.View = "urllist";
                }

                // inject 'Link to media' as the first generic property
                var links = media.GetUrls(UmbracoConfig.For.UmbracoSettings().Content, logger);
                if (links.Any())
                {
                    var link = new ContentPropertyDisplay
                    {
                        Alias = string.Format("{0}urls", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                        Label = localizedText.Localize("media/urls"),
                        Value = string.Join(",", links),
                        View  = "urllist"
                    };
                    properties.Insert(0, link);
                }
            });
        }
Beispiel #5
0
        /// <summary>
        /// Maps the generic tab with custom properties for content
        /// </summary>
        /// <param name="content"></param>
        /// <param name="display"></param>
        /// <param name="dataTypeService"></param>
        /// <param name="localizedText"></param>
        /// <param name="contentTypeService"></param>
        private static void AfterMap(IContent content, ContentItemDisplay display, IDataTypeService dataTypeService,
                                     ILocalizedTextService localizedText, IContentTypeService contentTypeService)
        {
            //map the IsChildOfListView (this is actually if it is a descendant of a list view!)
            //TODO: Fix this shorthand .Ancestors() lookup, at least have an overload to use the current
            if (content.HasIdentity)
            {
                var ancesctorListView = content.Ancestors().FirstOrDefault(x => x.ContentType.IsContainer);
                display.IsChildOfListView = ancesctorListView != null;
            }
            else
            {
                //it's new so it doesn't have a path, so we need to look this up by it's parent + ancestors
                var parent = content.Parent();
                if (parent == null)
                {
                    display.IsChildOfListView = false;
                }
                else if (parent.ContentType.IsContainer)
                {
                    display.IsChildOfListView = true;
                }
                else
                {
                    var ancesctorListView = parent.Ancestors().FirstOrDefault(x => x.ContentType.IsContainer);
                    display.IsChildOfListView = ancesctorListView != null;
                }
            }


            //map the tree node url
            if (HttpContext.Current != null)
            {
                var urlHelper = new UrlHelper(new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData()));
                var url       = urlHelper.GetUmbracoApiService <ContentTreeController>(controller => controller.GetTreeNode(display.Id.ToString(), null));
                display.TreeNodeUrl = url;
            }

            //fill in the template config to be passed to the template drop down.
            var templateItemConfig = new Dictionary <string, string> {
                { "", "Choose..." }
            };

            foreach (var t in content.ContentType.AllowedTemplates
                     .Where(t => t.Alias.IsNullOrWhiteSpace() == false && t.Name.IsNullOrWhiteSpace() == false))
            {
                templateItemConfig.Add(t.Alias, t.Name);
            }

            if (content.ContentType.IsContainer)
            {
                TabsAndPropertiesResolver.AddListView(display, "content", dataTypeService);
            }

            var properties = new List <ContentPropertyDisplay>
            {
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}releasedate", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("content/releaseDate"),
                    Value = display.ReleaseDate.HasValue ? display.ReleaseDate.Value.ToIsoString() : null,
                    View  = "datepicker" //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
                },
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}expiredate", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("content/unpublishDate"),
                    Value = display.ExpireDate.HasValue ? display.ExpireDate.Value.ToIsoString() : null,
                    View  = "datepicker" //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
                },
                new ContentPropertyDisplay
                {
                    Alias  = string.Format("{0}template", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label  = "Template", //TODO: localize this?
                    Value  = display.TemplateAlias,
                    View   = "dropdown", //TODO: Hard coding until we make a real dropdown property editor to lookup
                    Config = new Dictionary <string, object>
                    {
                        { "items", templateItemConfig }
                    }
                },
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}urls", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("content/urls"),
                    Value = string.Join(",", display.Urls),
                    View  = "urllist" //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
                }
            };

            TabsAndPropertiesResolver.MapGenericProperties(content, display, properties.ToArray(),
                                                           genericProperties =>
            {
                //TODO: This would be much nicer with the IUmbracoContextAccessor so we don't use singletons
                //If this is a web request and there's a user signed in and the
                // user has access to the settings section, we will
                if (HttpContext.Current != null && UmbracoContext.Current != null && UmbracoContext.Current.Security.CurrentUser != null &&
                    UmbracoContext.Current.Security.CurrentUser.AllowedSections.Any(x => x.Equals(Constants.Applications.Settings)))
                {
                    var currentDocumentType     = contentTypeService.GetContentType(display.ContentTypeAlias);
                    var currentDocumentTypeName = currentDocumentType == null ? string.Empty : currentDocumentType.Name;

                    var currentDocumentTypeId = currentDocumentType == null ? string.Empty : currentDocumentType.Id.ToString(CultureInfo.InvariantCulture);
                    //TODO: Hard coding this is not good
                    var docTypeLink = string.Format("#/settings/framed/settings%252FeditNodeTypeNew.aspx%253Fid%253D{0}", currentDocumentTypeId);

                    //Replace the doc type property
                    var docTypeProp   = genericProperties.First(x => x.Alias == string.Format("{0}doctype", Constants.PropertyEditors.InternalGenericPropertiesPrefix));
                    docTypeProp.Value = new List <object>
                    {
                        new
                        {
                            linkText = currentDocumentTypeName,
                            url      = docTypeLink,
                            target   = "_self", icon = "icon-item-arrangement"
                        }
                    };
                    //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
                    docTypeProp.View = "urllist";
                }
            });
        }
        /// <summary>
        /// Maps the generic tab with custom properties for content
        /// </summary>
        /// <param name="content"></param>
        /// <param name="display"></param>
        /// <param name="dataTypeService"></param>
        /// <param name="localizedText"></param>
        /// <param name="contentTypeService"></param>
        private static void AfterMap(IContent content, ContentItemDisplay display, IDataTypeService dataTypeService,
                                     ILocalizedTextService localizedText, IContentTypeService contentTypeService)
        {
            // map the IsChildOfListView (this is actually if it is a descendant of a list view!)
            var parent = content.Parent();

            display.IsChildOfListView = parent != null && (parent.ContentType.IsContainer || contentTypeService.HasContainerInPath(parent.Path));

            //map the tree node url
            if (HttpContext.Current != null)
            {
                var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
                var url       = urlHelper.GetUmbracoApiService <ContentTreeController>(controller => controller.GetTreeNode(display.Id.ToString(), null));
                display.TreeNodeUrl = url;
            }

            //fill in the template config to be passed to the template drop down.
            var templateItemConfig = new Dictionary <string, string> {
                { "", localizedText.Localize("general/choose") }
            };

            foreach (var t in content.ContentType.AllowedTemplates
                     .Where(t => t.Alias.IsNullOrWhiteSpace() == false && t.Name.IsNullOrWhiteSpace() == false))
            {
                templateItemConfig.Add(t.Alias, t.Name);
            }

            if (content.ContentType.IsContainer)
            {
                TabsAndPropertiesResolver.AddListView(display, "content", dataTypeService, localizedText);
            }

            var properties = new List <ContentPropertyDisplay>
            {
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}doctype", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("content/documentType"),
                    Value = localizedText.UmbracoDictionaryTranslate(display.ContentTypeName),
                    View  = PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View
                },
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}releasedate", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("content/releaseDate"),
                    Value = display.ReleaseDate.HasValue ? display.ReleaseDate.Value.ToIsoString() : null,
                    //Not editible for people without publish permission (U4-287)
                    View   = display.AllowedActions.Contains(ActionPublish.Instance.Letter) ? "datepicker" : PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View,
                    Config = new Dictionary <string, object>
                    {
                        { "offsetTime", "1" }
                    }
                    //TODO: Fix up hard coded datepicker
                },
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}expiredate", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("content/unpublishDate"),
                    Value = display.ExpireDate.HasValue ? display.ExpireDate.Value.ToIsoString() : null,
                    //Not editible for people without publish permission (U4-287)
                    View   = display.AllowedActions.Contains(ActionPublish.Instance.Letter) ? "datepicker" : PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View,
                    Config = new Dictionary <string, object>
                    {
                        { "offsetTime", "1" }
                    }
                    //TODO: Fix up hard coded datepicker
                },
                new ContentPropertyDisplay
                {
                    Alias  = string.Format("{0}template", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label  = localizedText.Localize("template/template"),
                    Value  = display.TemplateAlias,
                    View   = "dropdown", //TODO: Hard coding until we make a real dropdown property editor to lookup
                    Config = new Dictionary <string, object>
                    {
                        { "items", templateItemConfig }
                    }
                }
            };


            TabsAndPropertiesResolver.MapGenericProperties(content, display, localizedText, properties.ToArray(),
                                                           genericProperties =>
            {
                //TODO: This would be much nicer with the IUmbracoContextAccessor so we don't use singletons
                //If this is a web request and there's a user signed in and the
                // user has access to the settings section, we will
                if (HttpContext.Current != null && UmbracoContext.Current != null && UmbracoContext.Current.Security.CurrentUser != null &&
                    UmbracoContext.Current.Security.CurrentUser.AllowedSections.Any(x => x.Equals(Constants.Applications.Settings)))
                {
                    var currentDocumentType     = contentTypeService.GetContentType(display.ContentTypeAlias);
                    var currentDocumentTypeName = currentDocumentType == null ? string.Empty : localizedText.UmbracoDictionaryTranslate(currentDocumentType.Name);

                    var currentDocumentTypeId = currentDocumentType == null ? string.Empty : currentDocumentType.Id.ToString(CultureInfo.InvariantCulture);
                    //TODO: Hard coding this is not good
                    var docTypeLink = string.Format("#/settings/documenttypes/edit/{0}", currentDocumentTypeId);

                    //Replace the doc type property
                    var docTypeProperty   = genericProperties.First(x => x.Alias == string.Format("{0}doctype", Constants.PropertyEditors.InternalGenericPropertiesPrefix));
                    docTypeProperty.Value = new List <object>
                    {
                        new
                        {
                            linkText = currentDocumentTypeName,
                            url      = docTypeLink,
                            target   = "_self",
                            icon     = "icon-item-arrangement"
                        }
                    };
                    //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
                    docTypeProperty.View = "urllist";
                }

                // inject 'Link to document' as the first generic property
                genericProperties.Insert(0, new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}urls", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("content/urls"),
                    Value = string.Join(",", display.Urls),
                    View  = "urllist"    //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
                });
            });
        }