public virtual ActionResult DocumentsTable(Guid groupId, GroupDocumentDocumentField column, Direction direction)
        {
            var groupDocumentsList = _groupDocumentsService.GetByGroup(groupId).ToList();
            var mediaIdsList       = groupDocumentsList.Select(s => s.MediaId).ToList();
            var medias             = _mediaService.GetByIds(mediaIdsList);
            var group         = _groupService.Get(groupId);
            var groupMembers  = _groupMemberService.GetGroupMemberByGroup(groupId);
            var currentMember = _intranetMemberService.GetCurrentMember();
            var docs          = medias.Select(s =>
            {
                var intranetCreator = s.GetValue <Guid?>(IntranetConstants.IntranetCreatorId);
                var creator         = intranetCreator.HasValue ? _intranetMemberService.Get(intranetCreator.Value) : _intranetMemberService.GetByUserId(s.CreatorId);
                var document        = groupDocumentsList.First(f => f.MediaId == s.Id);
                var url             = _umbracoHelper.TypedMedia(s.Id).Url;
                var model           = new GroupDocumentTableRowViewModel
                {
                    CanDelete  = CanDelete(currentMember, group, groupMembers, s),
                    Id         = document.Id,
                    CreateDate = s.CreateDate,
                    Name       = s.Name,
                    Type       = s.GetValue <string>(UmbracoAliases.Media.MediaExtension),
                    Creator    = creator.Map <MemberViewModel>(),
                    FileUrl    = url
                };
                return(model);
            });

            docs = Sort(docs, column, direction);

            var viewModel = new GroupDocumentsTableViewModel
            {
                Documents = docs,
                GroupId   = groupId,
                Column    = column,
                Direction = direction
            };

            return(PartialView(GroupDocumentsTableViewPath, viewModel));
        }
        public virtual ActionResult DeleteDocument(Guid groupId, Guid documentId, GroupDocumentDocumentField column, Direction direction)
        {
            var document = _groupDocumentsService.Get(documentId);

            if (document.GroupId != groupId)
            {
                throw new Exception("Can't delete document because it does not belong to this group!");
            }

            var currentUser  = _intranetMemberService.GetCurrentMember();
            var group        = _groupService.Get(groupId);
            var groupMembers = _groupMemberService.GetGroupMemberByGroup(groupId);
            var media        = _mediaService.GetById(document.MediaId);
            var canDelete    = CanDelete(currentUser, group, groupMembers, media);

            if (canDelete)
            {
                _mediaService.Delete(media);
                _groupDocumentsService.Delete(document);
            }

            return(DocumentsTable(groupId, column, direction));
        }
        protected Func <GroupDocumentTableRowViewModel, object> GetKeySelector(GroupDocumentDocumentField column)
        {
            Func <GroupDocumentTableRowViewModel, object> keySelector;

            switch (column)
            {
            case GroupDocumentDocumentField.Type:
                keySelector = s => s.Type;
                break;

            case GroupDocumentDocumentField.Date:
                keySelector = s => s.CreateDate;
                break;

            case GroupDocumentDocumentField.Creator:
                keySelector = s => s.Creator.DisplayedName;
                break;

            default:
                keySelector = s => s.Name;
                break;
            }
            return(keySelector);
        }
        protected IEnumerable <GroupDocumentTableRowViewModel> Sort(IEnumerable <GroupDocumentTableRowViewModel> documents, GroupDocumentDocumentField column, Direction direction)
        {
            var keySelector = GetKeySelector(column);

            switch (direction)
            {
            case Direction.Asc:
                documents = documents.OrderBy(keySelector);
                break;

            case Direction.Desc:
                documents = documents.OrderByDescending(keySelector);
                break;
            }

            return(documents);
        }