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);
                }
            });
        }
        public MediaMapperProfile(TabsAndPropertiesResolver <IMedia, MediaItemDisplay> tabsAndPropertiesResolver,
                                  ContentTreeNodeUrlResolver <IMedia, MediaTreeController> contentTreeNodeUrlResolver,
                                  MediaAppResolver mediaAppResolver,
                                  IUserService userService,
                                  ILocalizedTextService textService,
                                  IDataTypeService dataTypeService,
                                  IMediaService mediaService,
                                  IMediaTypeService mediaTypeService,
                                  ILogger logger,
                                  IContentTypeBaseServiceProvider contentTypeBaseServiceProvider)
        {
            // create, capture, cache
            var mediaOwnerResolver      = new OwnerResolver <IMedia>(userService);
            var childOfListViewResolver = new MediaChildOfListViewResolver(mediaService, mediaTypeService);
            var mediaTypeBasicResolver  = new ContentTypeBasicResolver <IMedia, MediaItemDisplay>(contentTypeBaseServiceProvider);

            //FROM IMedia TO MediaItemDisplay
            CreateMap <IMedia, MediaItemDisplay>()
            .ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Media, content.Key)))
            .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => mediaOwnerResolver.Resolve(src)))
            .ForMember(dest => dest.Icon, opt => opt.MapFrom(content => content.ContentType.Icon))
            .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(content => content.ContentType.Alias))
            .ForMember(dest => dest.IsChildOfListView, opt => opt.MapFrom(childOfListViewResolver))
            .ForMember(dest => dest.Trashed, opt => opt.MapFrom(content => content.Trashed))
            .ForMember(dest => dest.ContentTypeName, opt => opt.MapFrom(content => content.ContentType.Name))
            .ForMember(dest => dest.Properties, opt => opt.Ignore())
            .ForMember(dest => dest.TreeNodeUrl, opt => opt.MapFrom(contentTreeNodeUrlResolver))
            .ForMember(dest => dest.Notifications, opt => opt.Ignore())
            .ForMember(dest => dest.Errors, opt => opt.Ignore())
            .ForMember(dest => dest.State, opt => opt.MapFrom <ContentSavedState?>(_ => null))
            .ForMember(dest => dest.Edited, opt => opt.Ignore())
            .ForMember(dest => dest.Updater, opt => opt.Ignore())
            .ForMember(dest => dest.Alias, opt => opt.Ignore())
            .ForMember(dest => dest.IsContainer, opt => opt.Ignore())
            .ForMember(dest => dest.Tabs, opt => opt.MapFrom(tabsAndPropertiesResolver))
            .ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
            .ForMember(dest => dest.ContentType, opt => opt.MapFrom(mediaTypeBasicResolver))
            .ForMember(dest => dest.MediaLink, opt => opt.MapFrom(content => string.Join(",", content.GetUrls(Current.Configs.Settings().Content, logger))))
            .ForMember(dest => dest.ContentApps, opt => opt.MapFrom(mediaAppResolver))
            .ForMember(dest => dest.VariesByCulture, opt => opt.MapFrom(src => src.ContentType.VariesByCulture()));


            //FROM IMedia TO ContentItemBasic<ContentPropertyBasic, IMedia>
            CreateMap <IMedia, ContentItemBasic <ContentPropertyBasic> >()
            .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Media, src.Key)))
            .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => mediaOwnerResolver.Resolve(src)))
            .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon))
            .ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed))
            .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias))
            .ForMember(dest => dest.State, opt => opt.MapFrom <ContentSavedState?>(_ => null))
            .ForMember(dest => dest.Edited, opt => opt.Ignore())
            .ForMember(dest => dest.Updater, opt => opt.Ignore())
            .ForMember(dest => dest.Alias, opt => opt.Ignore())
            .ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
            .ForMember(dest => dest.VariesByCulture, opt => opt.MapFrom(src => src.ContentType.VariesByCulture()));


            //FROM IMedia TO ContentItemDto<IMedia>
            CreateMap <IMedia, ContentPropertyCollectionDto>();
            //.ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Media, src.Key)))
            //.ForMember(dest => dest.Owner, opt => opt.MapFrom(src => mediaOwnerResolver.Resolve(src)))
            //.ForMember(dest => dest.Published, opt => opt.Ignore())
            //.ForMember(dest => dest.Edited, opt => opt.Ignore())
            //.ForMember(dest => dest.Updater, opt => opt.Ignore())
            //.ForMember(dest => dest.Icon, opt => opt.Ignore())
            //.ForMember(dest => dest.Alias, opt => opt.Ignore())
            //.ForMember(dest => dest.AdditionalData, opt => opt.Ignore());
        }
Beispiel #6
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";
                }
            });
        }
Beispiel #7
0
        /// <summary>
        /// Maps the generic tab with custom properties for content
        /// </summary>
        /// <param name="memberService"></param>
        /// <param name="member"></param>
        /// <param name="display"></param>
        /// <remarks>
        /// If this is a new entity and there is an approved field then we'll set it to true by default.
        /// </remarks>
        private static void MapGenericCustomProperties(IMemberService memberService, IMember member, MemberDisplay display)
        {
            var membersProvider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider();

            //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 <MemberTreeController>(controller => controller.GetTreeNode(display.Key.ToString("N"), null));
                display.TreeNodeUrl = url;
            }

            var genericProperties = new List <ContentPropertyDisplay>
            {
                GetLoginProperty(memberService, member, display),
                new ContentPropertyDisplay
                {
                    Alias      = string.Format("{0}email", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label      = ui.Text("general", "email"),
                    Value      = display.Email,
                    View       = "email",
                    Validation = { Mandatory = true }
                },
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}password", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = ui.Text("password"),
                    //NOTE: The value here is a json value - but the only property we care about is the generatedPassword one if it exists, the newPassword exists
                    // only when creating a new member and we want to have a generated password pre-filled.
                    Value = new Dictionary <string, object>
                    {
                        { "generatedPassword", member.GetAdditionalDataValueIgnoreCase("GeneratedPassword", null) },
                        { "newPassword", member.GetAdditionalDataValueIgnoreCase("NewPassword", null) },
                    },
                    //TODO: Hard coding this because the changepassword doesn't necessarily need to be a resolvable (real) property editor
                    View = "changepassword",
                    //initialize the dictionary with the configuration from the default membership provider
                    Config = new Dictionary <string, object>(membersProvider.GetConfiguration())
                    {
                        //the password change toggle will only be displayed if there is already a password assigned.
                        { "hasPassword", member.RawPasswordValue.IsNullOrWhiteSpace() == false }
                    }
                },
                new ContentPropertyDisplay
                {
                    Alias  = string.Format("{0}membergroup", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label  = ui.Text("content", "membergroup"),
                    Value  = GetMemberGroupValue(display.Username),
                    View   = "membergroups",
                    Config = new Dictionary <string, object> {
                        { "IsRequired", true }
                    }
                }
            };

            TabsAndPropertiesResolver.MapGenericProperties(member, display, genericProperties);

            //check if there's an approval field
            var provider = membersProvider as global::umbraco.providers.members.UmbracoMembershipProvider;

            if (member.HasIdentity == false && provider != null)
            {
                var approvedField = provider.ApprovedPropertyTypeAlias;
                var prop          = display.Properties.FirstOrDefault(x => x.Alias == approvedField);
                if (prop != null)
                {
                    prop.Value = 1;
                }
            }
        }
        public ContentMapperProfile(
            ContentUrlResolver contentUrlResolver,
            ContentTreeNodeUrlResolver <IContent, ContentTreeController> contentTreeNodeUrlResolver,
            TabsAndPropertiesResolver <IContent, ContentVariantDisplay> tabsAndPropertiesResolver,
            ContentAppResolver contentAppResolver,
            IUserService userService,
            IContentService contentService,
            IContentTypeService contentTypeService,
            IContentTypeBaseServiceProvider contentTypeBaseServiceProvider,
            ILocalizationService localizationService,
            ILocalizedTextService localizedTextService)
        {
            // create, capture, cache
            var contentOwnerResolver            = new OwnerResolver <IContent>(userService);
            var creatorResolver                 = new CreatorResolver(userService);
            var actionButtonsResolver           = new ActionButtonsResolver(userService, contentService);
            var childOfListViewResolver         = new ContentChildOfListViewResolver(contentService, contentTypeService);
            var contentTypeBasicResolver        = new ContentTypeBasicResolver <IContent, ContentItemDisplay>(contentTypeBaseServiceProvider);
            var allowedTemplatesResolver        = new AllowedTemplatesResolver(contentTypeService, localizedTextService);
            var defaultTemplateResolver         = new DefaultTemplateResolver();
            var variantResolver                 = new ContentVariantResolver(localizationService);
            var schedPublishReleaseDateResolver = new ScheduledPublishDateResolver(ContentScheduleAction.Release);
            var schedPublishExpireDateResolver  = new ScheduledPublishDateResolver(ContentScheduleAction.Expire);

            //FROM IContent TO ContentItemDisplay
            CreateMap <IContent, ContentItemDisplay>()
            .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key)))
            .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => contentOwnerResolver.Resolve(src)))
            .ForMember(dest => dest.Updater, opt => opt.MapFrom(src => creatorResolver.Resolve(src)))
            .ForMember(dest => dest.Variants, opt => opt.MapFrom(variantResolver))
            .ForMember(dest => dest.ContentApps, opt => opt.MapFrom(contentAppResolver))
            .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon))
            .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias))
            .ForMember(dest => dest.ContentTypeName, opt => opt.MapFrom(src => localizedTextService.UmbracoDictionaryTranslate(src.ContentType.Name)))
            .ForMember(dest => dest.IsContainer, opt => opt.MapFrom(src => src.ContentType.IsContainer))
            .ForMember(dest => dest.IsElement, opt => opt.MapFrom(src => src.ContentType.IsElement))
            .ForMember(dest => dest.IsBlueprint, opt => opt.MapFrom(src => src.Blueprint))
            .ForMember(dest => dest.IsChildOfListView, opt => opt.MapFrom(childOfListViewResolver))
            .ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed))
            .ForMember(dest => dest.TemplateAlias, opt => opt.MapFrom(defaultTemplateResolver))
            .ForMember(dest => dest.Urls, opt => opt.MapFrom(contentUrlResolver))
            .ForMember(dest => dest.AllowPreview, opt => opt.Ignore())
            .ForMember(dest => dest.TreeNodeUrl, opt => opt.MapFrom(contentTreeNodeUrlResolver))
            .ForMember(dest => dest.Notifications, opt => opt.Ignore())
            .ForMember(dest => dest.Errors, opt => opt.Ignore())
            .ForMember(dest => dest.DocumentType, opt => opt.MapFrom(contentTypeBasicResolver))
            .ForMember(dest => dest.AllowedTemplates, opt => opt.MapFrom(allowedTemplatesResolver))
            .ForMember(dest => dest.AllowedActions, opt => opt.MapFrom(src => actionButtonsResolver.Resolve(src)))
            .ForMember(dest => dest.AdditionalData, opt => opt.Ignore());

            CreateMap <IContent, ContentVariantDisplay>()
            .ForMember(dest => dest.PublishDate, opt => opt.MapFrom(src => src.PublishDate))
            .ForMember(dest => dest.ReleaseDate, opt => opt.MapFrom(schedPublishReleaseDateResolver))
            .ForMember(dest => dest.ExpireDate, opt => opt.MapFrom(schedPublishExpireDateResolver))
            .ForMember(dest => dest.Segment, opt => opt.Ignore())
            .ForMember(dest => dest.Language, opt => opt.Ignore())
            .ForMember(dest => dest.Notifications, opt => opt.Ignore())
            .ForMember(dest => dest.State, opt => opt.MapFrom <ContentSavedStateResolver <ContentPropertyDisplay> >())
            .ForMember(dest => dest.Tabs, opt => opt.MapFrom(tabsAndPropertiesResolver));

            //FROM IContent TO ContentItemBasic<ContentPropertyBasic, IContent>
            CreateMap <IContent, ContentItemBasic <ContentPropertyBasic> >()
            .ForMember(dest => dest.Udi, opt => opt.MapFrom(src =>
                                                            Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key)))
            .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => contentOwnerResolver.Resolve(src)))
            .ForMember(dest => dest.Updater, opt => opt.MapFrom(src => creatorResolver.Resolve(src)))
            .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon))
            .ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed))
            .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias))
            .ForMember(dest => dest.Alias, opt => opt.Ignore())
            .ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
            .ForMember(dest => dest.UpdateDate, opt => opt.MapFrom <UpdateDateResolver>())
            .ForMember(dest => dest.Name, opt => opt.MapFrom <NameResolver>())
            .ForMember(dest => dest.State, opt => opt.MapFrom <ContentBasicSavedStateResolver <ContentPropertyBasic> >())
            .ForMember(dest => dest.VariesByCulture, opt => opt.MapFrom(src => src.ContentType.VariesByCulture()));

            //FROM IContent TO ContentPropertyCollectionDto
            //NOTE: the property mapping for cultures relies on a culture being set in the mapping context
            CreateMap <IContent, ContentPropertyCollectionDto>();
        }
Beispiel #9
0
        /// <summary>
        /// Maps the generic tab with custom properties for content
        /// </summary>
        /// <param name="memberService"></param>
        /// <param name="userService"></param>
        /// <param name="member"></param>
        /// <param name="display"></param>
        /// <param name="localizedText"></param>
        /// <remarks>
        /// If this is a new entity and there is an approved field then we'll set it to true by default.
        /// </remarks>
        private static void MapGenericCustomProperties(IMemberService memberService, IUserService userService, IMember member, MemberDisplay display, ILocalizedTextService localizedText)
        {
            var membersProvider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider();

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

            var genericProperties = new List <ContentPropertyDisplay>
            {
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}doctype", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("content/membertype"),
                    Value = localizedText.UmbracoDictionaryTranslate(display.ContentTypeName),
                    View  = PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View
                },
                GetLoginProperty(memberService, member, display, localizedText),
                new ContentPropertyDisplay
                {
                    Alias      = string.Format("{0}email", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label      = localizedText.Localize("general/email"),
                    Value      = display.Email,
                    View       = "email",
                    Validation = { Mandatory = true }
                },
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}password", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("password"),
                    //NOTE: The value here is a json value - but the only property we care about is the generatedPassword one if it exists, the newPassword exists
                    // only when creating a new member and we want to have a generated password pre-filled.
                    Value = new Dictionary <string, object>
                    {
                        { "generatedPassword", member.GetAdditionalDataValueIgnoreCase("GeneratedPassword", null) },
                        { "newPassword", member.GetAdditionalDataValueIgnoreCase("NewPassword", null) },
                    },
                    //TODO: Hard coding this because the changepassword doesn't necessarily need to be a resolvable (real) property editor
                    View = "changepassword",
                    //initialize the dictionary with the configuration from the default membership provider
                    Config = new Dictionary <string, object>(membersProvider.GetConfiguration(userService))
                    {
                        //the password change toggle will only be displayed if there is already a password assigned.
                        { "hasPassword", member.RawPasswordValue.IsNullOrWhiteSpace() == false }
                    }
                },
                new ContentPropertyDisplay
                {
                    Alias  = string.Format("{0}membergroup", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label  = localizedText.Localize("content/membergroup"),
                    Value  = GetMemberGroupValue(display.Username),
                    View   = "membergroups",
                    Config = new Dictionary <string, object> {
                        { "IsRequired", true }
                    }
                }
            };

            TabsAndPropertiesResolver.MapGenericProperties(member, 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 memberTypeLink = string.Format("#/member/memberTypes/edit/{0}", member.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 = member.ContentType.Name,
                            url      = memberTypeLink,
                            target   = "_self",
                            icon     = "icon-item-arrangement"
                        }
                    };
                    docTypeProperty.View = "urllist";
                }
            });

            //check if there's an approval field
            var provider = membersProvider as global::umbraco.providers.members.UmbracoMembershipProvider;

            if (member.HasIdentity == false && provider != null)
            {
                var approvedField = provider.ApprovedPropertyTypeAlias;
                var prop          = display.Properties.FirstOrDefault(x => x.Alias == approvedField);
                if (prop != null)
                {
                    prop.Value = 1;
                }
            }
        }
        /// <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
                });
            });
        }