From e733b573f72296f92ea20861c0def7fedbcb18cc Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Sat, 18 Dec 2021 16:24:07 +0100 Subject: [PATCH] file upload works --- zero.Api/Endpoints/Media/MediaController.cs | 21 +- zero.Api/Filters/ApiResponseFilter.cs | 5 + zero.Backoffice.UI/app/components/index.ts | 4 +- .../app/components/ui-progress.vue | 85 +++++++ zero.Backoffice.UI/app/modules/media/api.ts | 12 +- .../media/overlays/upload-status-item.vue | 225 ++++++++++++++++++ .../modules/media/overlays/upload-status.vue | 199 +++++----------- .../app/modules/media/pages/overview/drop.vue | 48 +++- .../modules/media/pages/overview/overview.vue | 8 +- zero.Backoffice.UI/app/ui/app-overlays.vue | 13 +- .../Resources/Localization/zero.en-us.json | 7 +- zero.Core/Media/MediaCreator.cs | 70 +++--- zero.Core/Media/MediaManagement.cs | 9 +- zero.Core/zero.Core.csproj | 1 + 14 files changed, 501 insertions(+), 206 deletions(-) create mode 100644 zero.Backoffice.UI/app/components/ui-progress.vue create mode 100644 zero.Backoffice.UI/app/modules/media/overlays/upload-status-item.vue diff --git a/zero.Api/Endpoints/Media/MediaController.cs b/zero.Api/Endpoints/Media/MediaController.cs index 4ad2c108..b8d32914 100644 --- a/zero.Api/Endpoints/Media/MediaController.cs +++ b/zero.Api/Endpoints/Media/MediaController.cs @@ -41,13 +41,6 @@ public class MediaController : ZeroApiTreeEntityStoreController Upload(IFormFile file) - { - await Task.Delay(2000); - return Ok(); - } - #region bulk operations [HttpPut("bulk/move")] @@ -223,10 +216,18 @@ public class MediaController : ZeroApiTreeEntityStoreController> Create(zero.Media.Media saveModel) + public virtual async Task> Create([FromForm] IFormFile file, [FromForm] string folderId = null) { - saveModel.IsFolder = false; - return CreateModel(saveModel); + Result result = await Media.UploadFile(file, folderId); + + bool minimalResponse = Hints.ResponsePreference == ApiResponsePreference.Minimal; + + if (result.IsSuccess) + { + return Created(GetAction(result.Model), minimalResponse ? null : result.Model); + } + + return result.WithoutModel(); } diff --git a/zero.Api/Filters/ApiResponseFilter.cs b/zero.Api/Filters/ApiResponseFilter.cs index 230cbbe8..f8d92c68 100644 --- a/zero.Api/Filters/ApiResponseFilter.cs +++ b/zero.Api/Filters/ApiResponseFilter.cs @@ -127,6 +127,11 @@ public class ApiResponseFilterAttribute : ResultFilterAttribute ApiResponseMetadata GetMetadata(ResultExecutingContext context) { + if (!context.HttpContext.Items.ContainsKey("zero.action.started")) + { + return new(); + } + DateTimeOffset started = (DateTimeOffset)context.HttpContext.Items["zero.action.started"]; TimeSpan duration = DateTimeOffset.Now - started; diff --git a/zero.Backoffice.UI/app/components/index.ts b/zero.Backoffice.UI/app/components/index.ts index ff32efea..727e4d78 100644 --- a/zero.Backoffice.UI/app/components/index.ts +++ b/zero.Backoffice.UI/app/components/index.ts @@ -25,6 +25,7 @@ import uiTableFilter from './ui-table-filter.vue'; import uiTrinity from './ui-trinity.vue'; import uiPick from './ui-pick.vue'; import uiDatagrid from './ui-datagrid.vue'; +import uiProgress from './ui-progress.vue'; export { uiIcon, @@ -53,5 +54,6 @@ export { uiTableFilter, uiTrinity, uiPick, - uiDatagrid + uiDatagrid, + uiProgress }; \ No newline at end of file diff --git a/zero.Backoffice.UI/app/components/ui-progress.vue b/zero.Backoffice.UI/app/components/ui-progress.vue new file mode 100644 index 00000000..c073cac2 --- /dev/null +++ b/zero.Backoffice.UI/app/components/ui-progress.vue @@ -0,0 +1,85 @@ + + + + + + \ No newline at end of file diff --git a/zero.Backoffice.UI/app/modules/media/api.ts b/zero.Backoffice.UI/app/modules/media/api.ts index 30ba34f9..b9cca644 100644 --- a/zero.Backoffice.UI/app/modules/media/api.ts +++ b/zero.Backoffice.UI/app/modules/media/api.ts @@ -11,7 +11,7 @@ const files = { getHierarchy: (id: string, config?: ApiRequestConfig) => get(`media/${id}/hierarchy`, { ...config }), - create: (model: any, config?: ApiRequestConfig) => post('media', model, config), + //create: (model: any, config?: ApiRequestConfig) => post('media', model, config), update: (model: any, config?: ApiRequestConfig) => put('media/' + model.id, model, config), @@ -21,13 +21,17 @@ const files = { //uploadtest: (model: any, config?: ApiRequestConfig) => post('media/uploadtest', model, config), - uploadtest: async (file, onProgress) => + upload: async (file: File, folderId?: string, onProgress?: any) => { var data = new FormData(); data.append('file', file); - //data.append('folderId', folderId); - return await post('media/uploadtest', data, { + if (folderId) + { + data.append('folderId', folderId); + } + + return await post('media', data, { onUploadProgress: (progressEvent) => { if (typeof onProgress === 'function') diff --git a/zero.Backoffice.UI/app/modules/media/overlays/upload-status-item.vue b/zero.Backoffice.UI/app/modules/media/overlays/upload-status-item.vue new file mode 100644 index 00000000..8ce4367f --- /dev/null +++ b/zero.Backoffice.UI/app/modules/media/overlays/upload-status-item.vue @@ -0,0 +1,225 @@ + + + + + + \ No newline at end of file diff --git a/zero.Backoffice.UI/app/modules/media/overlays/upload-status.vue b/zero.Backoffice.UI/app/modules/media/overlays/upload-status.vue index 74ff5944..47d57b6d 100644 --- a/zero.Backoffice.UI/app/modules/media/overlays/upload-status.vue +++ b/zero.Backoffice.UI/app/modules/media/overlays/upload-status.vue @@ -1,27 +1,20 @@  @@ -30,84 +23,74 @@