From 358903c49fd8355477c80b1d2cdfec1fa5dbe612 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Mon, 22 Mar 2021 13:40:48 +0100 Subject: [PATCH] update media library to include shared items --- zero.Core/Api/MediaApi.cs | 4 +- .../Collections/Media/MediaCollection.cs | 23 +-- .../Database/Indexes/Media_ByChildren.cs | 51 ++++++ zero.Core/Database/Indexes/Media_ByParent.cs | 8 +- zero.Core/Entities/Media/MediaListItem.cs | 4 + zero.Core/Entities/Media/MediaListQuery.cs | 2 - .../App/components/datagrid/datagrid.vue | 6 + zero.Web.UI/App/components/header-bar.vue | 8 +- .../components/overlays/overlay-holder.vue | 11 +- .../components/overlays/select-overlay.vue | 167 ++++++++++++++++++ zero.Web.UI/App/pages/media/item.vue | 66 ++++--- zero.Web.UI/App/pages/media/overview.vue | 149 +++++++++++----- zero.Web.UI/App/pages/media/upload.vue | 3 +- .../Resources/Localization/zero.en-us.json | 10 ++ 14 files changed, 404 insertions(+), 108 deletions(-) create mode 100644 zero.Core/Database/Indexes/Media_ByChildren.cs create mode 100644 zero.Web.UI/App/components/overlays/select-overlay.vue diff --git a/zero.Core/Api/MediaApi.cs b/zero.Core/Api/MediaApi.cs index b2d8ba3a..9354f088 100644 --- a/zero.Core/Api/MediaApi.cs +++ b/zero.Core/Api/MediaApi.cs @@ -94,7 +94,7 @@ namespace zero.Core.Api public async Task> GetListByQuery(MediaListItemQuery query) { bool hasSearch = !query.Search.IsNullOrWhiteSpace(); - bool isRoot = !query.IsShared && query.FolderId.IsNullOrWhiteSpace(); + bool isRoot = query.FolderId.IsNullOrWhiteSpace(); query.SearchFor(entity => entity.Name); @@ -102,7 +102,7 @@ namespace zero.Core.Api .OrderByDescending(x => x.IsFolder) .ThenBy(query.OrderBy, query.OrderIsDescending, query.OrderType == ListQueryOrderType.String ? OrderingType.String : OrderingType.Double); - using IAsyncDocumentSession session = Store.OpenAsyncSession(query.IsShared ? Backoffice.Options.Raven.Database : null); + using IAsyncDocumentSession session = Store.OpenAsyncSession(); session.Advanced.MaxNumberOfRequestsPerSession = query.PageSize + 1; IRavenQueryable dbQuery = session.Query().ProjectInto(); diff --git a/zero.Core/Collections/Media/MediaCollection.cs b/zero.Core/Collections/Media/MediaCollection.cs index b91e4c80..fc8c97ba 100644 --- a/zero.Core/Collections/Media/MediaCollection.cs +++ b/zero.Core/Collections/Media/MediaCollection.cs @@ -222,8 +222,6 @@ namespace zero.Core.Collections .OrderByDescending(x => x.IsFolder) .ThenBy(query.OrderBy, query.OrderIsDescending, query.OrderType == ListQueryOrderType.String ? OrderingType.String : OrderingType.Double); - Session.Advanced.MaxNumberOfRequestsPerSession = query.PageSize + 1; - IRavenQueryable dbQuery = Session.Query().ProjectInto(); if (!hasSearch || !query.SearchIsGlobal) @@ -233,22 +231,15 @@ namespace zero.Core.Collections ListResult result = await dbQuery.ToQueriedListAsyncX(query); + string[] ids = result.Items.Where(x => x.IsFolder).Select(x => x.Id).ToArray(); + + List children = await Session.Query() + .Where(x => x.ParentId.In(ids)) + .ToListAsync(); + foreach (MediaListItem item in result.Items) { - if (item.IsFolder) - { - item.Children = await Session.Query().CountAsync(x => x.ParentId == item.Id); - } - } - - // TODO this is only inserted when we have a core/shared database and a multi-tenancy setup - if (isRoot && Database != Context.Options.Raven.Database) - { - result.Items.Insert(0, new MediaListItem() - { - Id = "shared", - IsFolder = true - }); + item.Children = children.FirstOrDefault(x => x.ParentId == item.Id)?.ChildrenCount ?? 0; } return result; diff --git a/zero.Core/Database/Indexes/Media_ByChildren.cs b/zero.Core/Database/Indexes/Media_ByChildren.cs new file mode 100644 index 00000000..4abcfbae --- /dev/null +++ b/zero.Core/Database/Indexes/Media_ByChildren.cs @@ -0,0 +1,51 @@ +using Raven.Client.Documents.Indexes; +using System.Linq; +using zero.Core.Entities; + +namespace zero.Core.Database.Indexes +{ + public class Media_ByChildren : AbstractMultiMapIndexCreationTask + { + public class Result : IZeroIdEntity, IZeroDbConventions + { + public string Id { get; set; } + + public string ParentId { get; set; } + + public int ChildrenCount { get; set; } + + public string[] ChildrenIds { get; set; } + } + + + public Media_ByChildren() + { + AddMap(items => items.Select(item => new Result() + { + Id = item.Id, + ParentId = item.FolderId, + ChildrenCount = 1, + ChildrenIds = new string[] { } + })); + + AddMap(items => items.Select(item => new Result() + { + Id = item.Id, + ParentId = item.ParentId, + ChildrenCount = 1, + ChildrenIds = new string[] { } + })); + + Reduce = results => results.GroupBy(x => new { x.ParentId }).Select(group => new Result() + { + Id = null, + ParentId = group.Key.ParentId, + ChildrenCount = group.Sum(x => x.ChildrenCount), + ChildrenIds = group.Select(x => x.Id).ToArray() + }); + + StoreAllFields(FieldStorage.Yes); + Index(x => x.ParentId, FieldIndexing.Exact); + } + } +} diff --git a/zero.Core/Database/Indexes/Media_ByParent.cs b/zero.Core/Database/Indexes/Media_ByParent.cs index d218e8eb..bc85474a 100644 --- a/zero.Core/Database/Indexes/Media_ByParent.cs +++ b/zero.Core/Database/Indexes/Media_ByParent.cs @@ -18,7 +18,9 @@ namespace zero.Core.Database.Indexes Name = item.Name, Image = null, Children = 0, - Size = 0 + Size = 0, + IsShared = item.Blueprint != null, + AspectRatio = 0 })); AddMap(items => items.Select(item => new MediaListItem @@ -30,7 +32,9 @@ namespace zero.Core.Database.Indexes Name = item.Name, Image = item.PreviewSource, Children = 0, - Size = item.Size + Size = item.Size, + IsShared = item.Blueprint != null, + AspectRatio = item.ImageMeta != null ? (float)item.ImageMeta.Width / item.ImageMeta.Height : 0 })); StoreAllFields(FieldStorage.Yes); diff --git a/zero.Core/Entities/Media/MediaListItem.cs b/zero.Core/Entities/Media/MediaListItem.cs index 06aa544a..b7d1cfde 100644 --- a/zero.Core/Entities/Media/MediaListItem.cs +++ b/zero.Core/Entities/Media/MediaListItem.cs @@ -21,5 +21,9 @@ namespace zero.Core.Entities public int Children { get; set; } public bool HasTransparency { get; set; } + + public float AspectRatio { get; set; } + + public bool IsShared { get; set; } } } diff --git a/zero.Core/Entities/Media/MediaListQuery.cs b/zero.Core/Entities/Media/MediaListQuery.cs index acff3b3b..3e48046e 100644 --- a/zero.Core/Entities/Media/MediaListQuery.cs +++ b/zero.Core/Entities/Media/MediaListQuery.cs @@ -11,7 +11,5 @@ public string FolderId { get; set; } public bool SearchIsGlobal { get; set; } - - public bool IsShared { get; set; } } } diff --git a/zero.Web.UI/App/components/datagrid/datagrid.vue b/zero.Web.UI/App/components/datagrid/datagrid.vue index 02e22b02..7f69dec3 100644 --- a/zero.Web.UI/App/components/datagrid/datagrid.vue +++ b/zero.Web.UI/App/components/datagrid/datagrid.vue @@ -303,6 +303,12 @@ } } + this.$emit('select', this.selected, this); + }, + + clearSelection() + { + this.selected = []; this.$emit('select', this.selected, this); } } diff --git a/zero.Web.UI/App/components/header-bar.vue b/zero.Web.UI/App/components/header-bar.vue index fc44b2b8..157ce121 100644 --- a/zero.Web.UI/App/components/header-bar.vue +++ b/zero.Web.UI/App/components/header-bar.vue @@ -87,12 +87,11 @@ & + .ui-view-box { - padding-top: 0; + padding-top: 0; } .app-tree & { - height: 90px; margin-bottom: 8px; } } @@ -146,11 +145,6 @@ margin: 0; font-size: var(--font-size-l); font-weight: 700; - //display: flex; - //align-items: center; - font-size: var(--font-size-xl); - font-weight: 900; - //text-transform: uppercase; &.is-empty, .-minor { diff --git a/zero.Web.UI/App/components/overlays/overlay-holder.vue b/zero.Web.UI/App/components/overlays/overlay-holder.vue index d2d5e486..2a4d6a50 100644 --- a/zero.Web.UI/App/components/overlays/overlay-holder.vue +++ b/zero.Web.UI/App/components/overlays/overlay-holder.vue @@ -4,7 +4,7 @@
- +
@@ -95,6 +95,15 @@ font-size: var(--font-size); } + .app-overlay .ui-loading + { + position: relative; + left: 50%; + margin-left: -16px; + margin-top: 20px; + margin-bottom: 20px; + } + .app-overlay[display="dialog"] .ui-form-loading { height: 200px; diff --git a/zero.Web.UI/App/components/overlays/select-overlay.vue b/zero.Web.UI/App/components/overlays/select-overlay.vue new file mode 100644 index 00000000..36ad2a94 --- /dev/null +++ b/zero.Web.UI/App/components/overlays/select-overlay.vue @@ -0,0 +1,167 @@ + + + + + + \ No newline at end of file diff --git a/zero.Web.UI/App/pages/media/item.vue b/zero.Web.UI/App/pages/media/item.vue index a35cd589..31be93bd 100644 --- a/zero.Web.UI/App/pages/media/item.vue +++ b/zero.Web.UI/App/pages/media/item.vue @@ -1,24 +1,22 @@