From 795b0a711640a9e2efd8c52a13253333ecf297c9 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Mon, 1 May 2017 16:01:29 +0200 Subject: [PATCH] Asset field. --- .../Assets/MongoAssetEntity.cs | 4 +++ .../Assets/MongoAssetRepository.cs | 5 ++-- .../MongoAssetRepository_EventHandling.cs | 5 +++- src/Squidex.Read/Assets/IAssetEntity.cs | 2 ++ .../Assets/AssetCommandHandler.cs | 4 +-- .../Controllers/Api/Assets/AssetController.cs | 3 +- .../assets/pages/assets-page.component.html | 3 +- .../assets/pages/assets-page.component.ts | 28 +++++++++++++++-- .../schemas/pages/schema/field.component.html | 2 ++ .../schemas/pages/schema/field.component.scss | 13 +++++++- .../shared/components/asset.component.html | 20 +++++-------- .../app/shared/components/asset.component.ts | 15 +++++++--- .../components/assets-editor.component.html | 3 +- .../components/assets-editor.component.scss | 1 + .../components/assets-editor.component.ts | 30 +++++++++++++++++-- .../app/shared/services/auth.service.ts | 12 ++++---- src/Squidex/app/shared/utils/messages.ts | 12 +++++++- src/Squidex/package.json | 4 +-- 18 files changed, 125 insertions(+), 41 deletions(-) diff --git a/src/Squidex.Read.MongoDb/Assets/MongoAssetEntity.cs b/src/Squidex.Read.MongoDb/Assets/MongoAssetEntity.cs index 556c502da..dfd7dc053 100644 --- a/src/Squidex.Read.MongoDb/Assets/MongoAssetEntity.cs +++ b/src/Squidex.Read.MongoDb/Assets/MongoAssetEntity.cs @@ -28,6 +28,10 @@ namespace Squidex.Read.MongoDb.Assets [BsonElement] public bool IsImage { get; set; } + [BsonRequired] + [BsonElement] + public bool IsDeleted { get; set; } + [BsonRequired] [BsonElement] public long Version { get; set; } diff --git a/src/Squidex.Read.MongoDb/Assets/MongoAssetRepository.cs b/src/Squidex.Read.MongoDb/Assets/MongoAssetRepository.cs index 2c5c40dad..ba1667146 100644 --- a/src/Squidex.Read.MongoDb/Assets/MongoAssetRepository.cs +++ b/src/Squidex.Read.MongoDb/Assets/MongoAssetRepository.cs @@ -34,7 +34,7 @@ namespace Squidex.Read.MongoDb.Assets protected override Task SetupCollectionAsync(IMongoCollection collection) { - return collection.Indexes.CreateOneAsync(IndexKeys.Descending(x => x.LastModified).Ascending(x => x.AppId).Ascending(x => x.FileName).Ascending(x => x.MimeType)); + return collection.Indexes.CreateOneAsync(IndexKeys.Ascending(x => x.AppId).Ascending(x => x.IsDeleted).Descending(x => x.LastModified).Ascending(x => x.FileName).Ascending(x => x.MimeType)); } public async Task IsValidAsync(Guid assetId) @@ -74,7 +74,8 @@ namespace Squidex.Read.MongoDb.Assets { var filters = new List> { - Filter.Eq(x => x.AppId, appId) + Filter.Eq(x => x.AppId, appId), + Filter.Eq(x => x.IsDeleted, false) }; if (ids != null && ids.Count > 0) diff --git a/src/Squidex.Read.MongoDb/Assets/MongoAssetRepository_EventHandling.cs b/src/Squidex.Read.MongoDb/Assets/MongoAssetRepository_EventHandling.cs index 3441aa6da..c1ffb3f6c 100644 --- a/src/Squidex.Read.MongoDb/Assets/MongoAssetRepository_EventHandling.cs +++ b/src/Squidex.Read.MongoDb/Assets/MongoAssetRepository_EventHandling.cs @@ -58,7 +58,10 @@ namespace Squidex.Read.MongoDb.Assets protected Task On(AssetDeleted @event, EnvelopeHeaders headers) { - return Collection.DeleteOneAsync(Filter.Eq(x => x.Id, @event.AssetId)); + return Collection.UpdateAsync(@event, headers, a => + { + a.IsDeleted = true; + }); } } } diff --git a/src/Squidex.Read/Assets/IAssetEntity.cs b/src/Squidex.Read/Assets/IAssetEntity.cs index f0902c530..754ddcfdc 100644 --- a/src/Squidex.Read/Assets/IAssetEntity.cs +++ b/src/Squidex.Read/Assets/IAssetEntity.cs @@ -20,6 +20,8 @@ namespace Squidex.Read.Assets bool IsImage { get; } + bool IsDeleted { get; } + int? PixelWidth { get; } int? PixelHeight { get; } diff --git a/src/Squidex.Write/Assets/AssetCommandHandler.cs b/src/Squidex.Write/Assets/AssetCommandHandler.cs index f274c82eb..b19977798 100644 --- a/src/Squidex.Write/Assets/AssetCommandHandler.cs +++ b/src/Squidex.Write/Assets/AssetCommandHandler.cs @@ -44,7 +44,7 @@ namespace Squidex.Write.Assets c.Create(command); - await assetStore.UploadAsync(c.Id, 1, null, command.File.OpenRead()); + await assetStore.UploadAsync(c.Id, c.Version, null, command.File.OpenRead()); context.Succeed(EntityCreatedResult.Create(c.Id, c.Version)); }); @@ -58,7 +58,7 @@ namespace Squidex.Write.Assets c.Update(command); - await assetStore.UploadAsync(c.Id, 2, null, command.File.OpenRead()); + await assetStore.UploadAsync(c.Id, c.Version, null, command.File.OpenRead()); }); } diff --git a/src/Squidex/Controllers/Api/Assets/AssetController.cs b/src/Squidex/Controllers/Api/Assets/AssetController.cs index 9879094c3..65f671612 100644 --- a/src/Squidex/Controllers/Api/Assets/AssetController.cs +++ b/src/Squidex/Controllers/Api/Assets/AssetController.cs @@ -17,7 +17,6 @@ using Microsoft.Extensions.Options; using Microsoft.Extensions.Primitives; using NSwag.Annotations; using Squidex.Controllers.Api.Assets.Models; -using Squidex.Controllers.Api.Schemas.Models; using Squidex.Core.Identity; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Commands; @@ -122,7 +121,7 @@ namespace Squidex.Controllers.Api.Assets { var entity = await assetRepository.FindAssetAsync(id); - if (entity == null) + if (entity == null || entity.IsDeleted) { return NotFound(); } diff --git a/src/Squidex/app/features/assets/pages/assets-page.component.html b/src/Squidex/app/features/assets/pages/assets-page.component.html index 1dbe09953..c5c48b9aa 100644 --- a/src/Squidex/app/features/assets/pages/assets-page.component.html +++ b/src/Squidex/app/features/assets/pages/assets-page.component.html @@ -41,7 +41,8 @@ (loaded)="onAssetLoaded(file, $event)"> + (deleting)="onAssetDeleting($event)" + (updated)="onAssetUpdated($event)"> diff --git a/src/Squidex/app/features/assets/pages/assets-page.component.ts b/src/Squidex/app/features/assets/pages/assets-page.component.ts index 216e2761b..691e44c2c 100644 --- a/src/Squidex/app/features/assets/pages/assets-page.component.ts +++ b/src/Squidex/app/features/assets/pages/assets-page.component.ts @@ -7,16 +7,19 @@ // tslint:disable:prefer-for-of -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { FormControl } from '@angular/forms'; +import { Subscription } from 'rxjs'; import { AppComponentBase, AppsStoreService, AssetDto, AssetsService, + AssetUpdated, fadeAnimation, ImmutableArray, + MessageBus, NotificationService, Pager } from 'shared'; @@ -29,7 +32,9 @@ import { fadeAnimation ] }) -export class AssetsPageComponent extends AppComponentBase implements OnInit { +export class AssetsPageComponent extends AppComponentBase implements OnDestroy, OnInit { + private assetUpdatedSubscription: Subscription; + public newFiles = ImmutableArray.empty(); public assetsItems = ImmutableArray.empty(); @@ -38,15 +43,28 @@ export class AssetsPageComponent extends AppComponentBase implements OnInit { public assertQuery = ''; constructor(apps: AppsStoreService, notifications: NotificationService, - private readonly assetsService: AssetsService + private readonly assetsService: AssetsService, + private readonly messageBus: MessageBus ) { super(notifications, apps); } public ngOnInit() { + this.assetUpdatedSubscription = + this.messageBus.of(AssetUpdated) + .subscribe(event => { + if (event.sender !== this) { + this.assetsItems = this.assetsItems.map(x => x.id === event.assetDto.id ? event.assetDto : x); + } + }); + this.load(); } + public ngOnDestroy() { + this.assetUpdatedSubscription.unsubscribe(); + } + public search() { this.assetsPager = new Pager(0, 0, 12); this.assertQuery = this.assetsFilter.value; @@ -83,6 +101,10 @@ export class AssetsPageComponent extends AppComponentBase implements OnInit { this.assetsPager = this.assetsPager.incrementCount(); } + public onAssetUpdated(asset: AssetDto) { + this.messageBus.publish(new AssetUpdated(asset, this)); + } + public onAssetFailed(file: File) { this.newFiles = this.newFiles.remove(file); } diff --git a/src/Squidex/app/features/schemas/pages/schema/field.component.html b/src/Squidex/app/features/schemas/pages/schema/field.component.html index e1c7e1f4c..13cf0a94b 100644 --- a/src/Squidex/app/features/schemas/pages/schema/field.component.html +++ b/src/Squidex/app/features/schemas/pages/schema/field.component.html @@ -1,5 +1,7 @@
+ +
diff --git a/src/Squidex/app/features/schemas/pages/schema/field.component.scss b/src/Squidex/app/features/schemas/pages/schema/field.component.scss index f762a1d67..b5ec4b247 100644 --- a/src/Squidex/app/features/schemas/pages/schema/field.component.scss +++ b/src/Squidex/app/features/schemas/pages/schema/field.component.scss @@ -9,10 +9,21 @@ $field-header: #e7ebef; .field { &-summary { - padding: 1rem 1.25rem; + padding: 1rem 1.25rem 1rem 1.5rem; + position: relative; line-height: 2.5rem; } + &-drag { + @include absolute(0, auto, 0, 0); + z-index: 1000; + font-size: 1.4rem; + font-weight: normal; + line-height: 4.8rem; + cursor: move; + color: $color-border; + } + &-icon { margin-right: 1rem; color: $color-border-dark; diff --git a/src/Squidex/app/shared/components/asset.component.html b/src/Squidex/app/shared/components/asset.component.html index 3560b5938..651060ecd 100644 --- a/src/Squidex/app/shared/components/asset.component.html +++ b/src/Squidex/app/shared/components/asset.component.html @@ -22,16 +22,12 @@ - - - - - - - - - - + + + + + + {{fileType}} @@ -45,7 +41,7 @@
-