From 40acddfa74da891649488bf0bc103381080e12ba Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Sun, 30 Jul 2017 12:30:11 +0200 Subject: [PATCH] Moire small refactorings. --- .../Contents/GraphQL/Types/AssetGraphType.cs | 9 ++ src/Squidex.Infrastructure/FileExtensions.cs | 31 +++++ .../Api/Assets/AssetsController.cs | 4 +- .../Api/Assets/Models/AssetCreatedDto.cs | 6 + .../Controllers/Api/Assets/Models/AssetDto.cs | 6 + .../Api/Assets/Models/AssetReplacedDto.cs | 1 + .../pages/users/user-page.component.ts | 12 +- .../assets/pages/assets-page.component.ts | 2 +- .../pages/content/content-page.component.ts | 16 +-- .../pages/contents/contents-page.component.ts | 18 +-- .../content/shared/assets-editor.component.ts | 2 +- .../pages/dashboard-page.component.html | 8 +- .../pages/dashboard-page.component.ts | 35 ++---- .../schemas/pages/schema/field.component.ts | 4 +- .../schema/schema-edit-form.component.ts | 8 +- .../pages/schema/schema-page.component.ts | 22 ++-- .../pages/schemas/schema-form.component.ts | 8 +- .../pages/clients/clients-page.component.ts | 2 +- .../contributors-page.component.ts | 10 +- .../pages/languages/language.component.ts | 4 +- .../languages/languages-page.component.ts | 2 +- .../pages/plans/plans-page.component.html | 4 +- .../pages/plans/plans-page.component.ts | 23 ---- .../framework/angular/numbers.pipes.spec.ts | 30 +++++ .../app/framework/angular/numbers.pipes.ts | 50 ++++++++ src/Squidex/app/framework/declarations.ts | 1 + src/Squidex/app/framework/module.ts | 6 + .../framework/services/message-bus.spec.ts | 4 +- .../app/framework/services/message-bus.ts | 2 +- .../shared/components/app-form.component.ts | 8 +- .../shared/components/asset.component.html | 20 ++-- .../app/shared/components/asset.component.ts | 37 ++---- src/Squidex/app/shared/components/pipes.ts | 62 +++++++++- src/Squidex/app/shared/declarations-base.ts | 1 - src/Squidex/app/shared/module.ts | 11 +- .../shared/services/assets.service.spec.ts | 37 +++--- .../app/shared/services/assets.service.ts | 6 + .../app/shared/utils/file-helper.spec.ts | 75 ------------ src/Squidex/app/shared/utils/file-helper.ts | 112 ------------------ .../FileExtensionsTests.cs | 38 ++++++ 40 files changed, 378 insertions(+), 359 deletions(-) create mode 100644 src/Squidex.Infrastructure/FileExtensions.cs create mode 100644 src/Squidex/app/framework/angular/numbers.pipes.spec.ts create mode 100644 src/Squidex/app/framework/angular/numbers.pipes.ts delete mode 100644 src/Squidex/app/shared/utils/file-helper.spec.ts delete mode 100644 src/Squidex/app/shared/utils/file-helper.ts create mode 100644 tests/Squidex.Infrastructure.Tests/FileExtensionsTests.cs diff --git a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/Types/AssetGraphType.cs b/src/Squidex.Domain.Apps.Read/Contents/GraphQL/Types/AssetGraphType.cs index 489107b6e..bec7228dd 100644 --- a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/Types/AssetGraphType.cs +++ b/src/Squidex.Domain.Apps.Read/Contents/GraphQL/Types/AssetGraphType.cs @@ -10,6 +10,7 @@ using System; using GraphQL.Resolvers; using GraphQL.Types; using Squidex.Domain.Apps.Read.Assets; +using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Read.Contents.GraphQL.Types { @@ -99,6 +100,14 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL.Types Description = "The file name." }); + AddField(new FieldType + { + Name = "fileType", + Resolver = Resolver(x => x.FileName.FileType()), + ResolvedType = new NonNullGraphType(new StringGraphType()), + Description = "The file type." + }); + AddField(new FieldType { Name = "fileSize", diff --git a/src/Squidex.Infrastructure/FileExtensions.cs b/src/Squidex.Infrastructure/FileExtensions.cs new file mode 100644 index 000000000..4435f5e47 --- /dev/null +++ b/src/Squidex.Infrastructure/FileExtensions.cs @@ -0,0 +1,31 @@ +// ========================================================================== +// FileExtensions.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System.IO; + +// ReSharper disable InvertIf + +namespace Squidex.Infrastructure +{ + public static class FileExtensions + { + public static string FileType(this string fileName) + { + try + { + var fileInfo = new FileInfo(fileName); + + return fileInfo.Extension.Substring(1).ToLowerInvariant(); + } + catch + { + return "blob"; + } + } + } +} diff --git a/src/Squidex/Controllers/Api/Assets/AssetsController.cs b/src/Squidex/Controllers/Api/Assets/AssetsController.cs index 28b737087..96ec4386e 100644 --- a/src/Squidex/Controllers/Api/Assets/AssetsController.cs +++ b/src/Squidex/Controllers/Api/Assets/AssetsController.cs @@ -108,7 +108,7 @@ namespace Squidex.Controllers.Api.Assets var response = new AssetsDto { Total = taskForCount.Result, - Items = taskForItems.Result.Select(x => SimpleMapper.Map(x, new AssetDto())).ToArray() + Items = taskForItems.Result.Select(x => SimpleMapper.Map(x, new AssetDto { FileType = x.FileName.FileType() })).ToArray() }; return Ok(response); @@ -137,7 +137,7 @@ namespace Squidex.Controllers.Api.Assets return NotFound(); } - var response = SimpleMapper.Map(entity, new AssetDto()); + var response = SimpleMapper.Map(entity, new AssetDto { FileType = entity.FileName.FileType() }); Response.Headers["ETag"] = new StringValues(entity.Version.ToString()); diff --git a/src/Squidex/Controllers/Api/Assets/Models/AssetCreatedDto.cs b/src/Squidex/Controllers/Api/Assets/Models/AssetCreatedDto.cs index e7c50e238..d4ea54220 100644 --- a/src/Squidex/Controllers/Api/Assets/Models/AssetCreatedDto.cs +++ b/src/Squidex/Controllers/Api/Assets/Models/AssetCreatedDto.cs @@ -20,6 +20,12 @@ namespace Squidex.Controllers.Api.Assets.Models /// public Guid Id { get; set; } + /// + /// The file type. + /// + [Required] + public string FileType { get; set; } + /// /// The file name. /// diff --git a/src/Squidex/Controllers/Api/Assets/Models/AssetDto.cs b/src/Squidex/Controllers/Api/Assets/Models/AssetDto.cs index 1e9dad0d0..2052c12a0 100644 --- a/src/Squidex/Controllers/Api/Assets/Models/AssetDto.cs +++ b/src/Squidex/Controllers/Api/Assets/Models/AssetDto.cs @@ -31,6 +31,12 @@ namespace Squidex.Controllers.Api.Assets.Models /// [Required] public string MimeType { get; set; } + + /// + /// The file type. + /// + [Required] + public string FileType { get; set; } /// /// The size of the file in bytes. diff --git a/src/Squidex/Controllers/Api/Assets/Models/AssetReplacedDto.cs b/src/Squidex/Controllers/Api/Assets/Models/AssetReplacedDto.cs index c4e1dc5de..6f4f8113a 100644 --- a/src/Squidex/Controllers/Api/Assets/Models/AssetReplacedDto.cs +++ b/src/Squidex/Controllers/Api/Assets/Models/AssetReplacedDto.cs @@ -8,6 +8,7 @@ using System.ComponentModel.DataAnnotations; using Squidex.Domain.Apps.Write.Assets.Commands; +using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Commands; namespace Squidex.Controllers.Api.Assets.Models diff --git a/src/Squidex/app/features/administration/pages/users/user-page.component.ts b/src/Squidex/app/features/administration/pages/users/user-page.component.ts index 5e29f10ca..c8f3de8d2 100644 --- a/src/Squidex/app/features/administration/pages/users/user-page.component.ts +++ b/src/Squidex/app/features/administration/pages/users/user-page.component.ts @@ -79,7 +79,7 @@ export class UserPageComponent extends ComponentBase implements OnInit { created.pictureUrl!, false); - this.sendUserCreated(this.user); + this.emitUserCreated(this.user); this.notifyInfo('User created successfully.'); this.back(); }, error => { @@ -93,7 +93,7 @@ export class UserPageComponent extends ComponentBase implements OnInit { requestDto.email, requestDto.displayMessage); - this.sendUserUpdated(this.user); + this.emitUserUpdated(this.user); this.notifyInfo('User saved successfully.'); this.resetUserForm(); }, error => { @@ -107,12 +107,12 @@ export class UserPageComponent extends ComponentBase implements OnInit { this.router.navigate(['../'], { relativeTo: this.route, replaceUrl: true }); } - private sendUserCreated(user: UserDto) { - this.messageBus.publish(new UserCreated(user)); + private emitUserCreated(user: UserDto) { + this.messageBus.emit(new UserCreated(user)); } - private sendUserUpdated(user: UserDto) { - this.messageBus.publish(new UserUpdated(user)); + private emitUserUpdated(user: UserDto) { + this.messageBus.emit(new UserUpdated(user)); } private setupAndPopulateForm() { 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 eb8c4e4f0..c0d266855 100644 --- a/src/Squidex/app/features/assets/pages/assets-page.component.ts +++ b/src/Squidex/app/features/assets/pages/assets-page.component.ts @@ -102,7 +102,7 @@ export class AssetsPageComponent extends AppComponentBase implements OnDestroy, } public onAssetUpdated(asset: AssetDto) { - this.messageBus.publish(new AssetUpdated(asset, this)); + this.messageBus.emit(new AssetUpdated(asset, this)); } public onAssetFailed(file: File) { diff --git a/src/Squidex/app/features/content/pages/content/content-page.component.ts b/src/Squidex/app/features/content/pages/content/content-page.component.ts index 12216b49b..b24ebe0f4 100644 --- a/src/Squidex/app/features/content/pages/content/content-page.component.ts +++ b/src/Squidex/app/features/content/pages/content/content-page.component.ts @@ -146,7 +146,7 @@ export class ContentPageComponent extends AppComponentBase implements CanCompone .subscribe(dto => { this.content = dto; - this.sendContentCreated(this.content); + this.emitContentCreated(this.content); this.notifyInfo('Content created successfully.'); this.back(); }, error => { @@ -159,7 +159,7 @@ export class ContentPageComponent extends AppComponentBase implements CanCompone .subscribe(() => { this.content = this.content.update(requestDto, this.authService.user.token); - this.sendContentUpdated(this.content); + this.emitContentUpdated(this.content); this.notifyInfo('Content saved successfully.'); this.enableContentForm(); }, error => { @@ -172,16 +172,16 @@ export class ContentPageComponent extends AppComponentBase implements CanCompone } } - private sendContentCreated(content: ContentDto) { - this.messageBus.publish(new ContentCreated(content)); + private back() { + this.router.navigate(['../'], { relativeTo: this.route, replaceUrl: true }); } - private sendContentUpdated(content: ContentDto) { - this.messageBus.publish(new ContentUpdated(content)); + private emitContentCreated(content: ContentDto) { + this.messageBus.emit(new ContentCreated(content)); } - private back() { - this.router.navigate(['../'], { relativeTo: this.route, replaceUrl: true }); + private emitContentUpdated(content: ContentDto) { + this.messageBus.emit(new ContentUpdated(content)); } private disableContentForm() { diff --git a/src/Squidex/app/features/content/pages/contents/contents-page.component.ts b/src/Squidex/app/features/content/pages/contents/contents-page.component.ts index e72b8c569..32a9203bb 100644 --- a/src/Squidex/app/features/content/pages/contents/contents-page.component.ts +++ b/src/Squidex/app/features/content/pages/contents/contents-page.component.ts @@ -105,6 +105,10 @@ export class ContentsPageComponent extends AppComponentBase implements OnDestroy this.isReadOnly = routeData['isReadOnly']; } + public dropData(content: ContentDto) { + return { content, schemaId: this.schema.id }; + } + public search() { this.contentsQuery = this.contentsFilter.value; this.contentsPager = new Pager(0); @@ -139,7 +143,7 @@ export class ContentsPageComponent extends AppComponentBase implements OnDestroy this.contentItems = this.contentItems.removeAll(x => x.id === content.id); this.contentsPager = this.contentsPager.decrementCount(); - this.sendContentDeleted(content); + this.emitContentDeleted(content); }, error => { this.notifyError(error); }); @@ -164,10 +168,6 @@ export class ContentsPageComponent extends AppComponentBase implements OnDestroy this.languageSelected = language; } - public dropData(content: ContentDto) { - return { content, schemaId: this.schema.id }; - } - public goNext() { this.contentsPager = this.contentsPager.goNext(); @@ -180,6 +180,10 @@ export class ContentsPageComponent extends AppComponentBase implements OnDestroy this.load(); } + private emitContentDeleted(content: ContentDto) { + this.messageBus.emit(new ContentDeleted(content)); + } + private resetContents() { this.contentItems = ImmutableArray.empty(); this.contentsQuery = ''; @@ -202,9 +206,5 @@ export class ContentsPageComponent extends AppComponentBase implements OnDestroy this.columnWidth = 100; } } - - private sendContentDeleted(content: ContentDto) { - this.messageBus.publish(new ContentDeleted(content)); - } } diff --git a/src/Squidex/app/features/content/shared/assets-editor.component.ts b/src/Squidex/app/features/content/shared/assets-editor.component.ts index 57159dfed..b870691f9 100644 --- a/src/Squidex/app/features/content/shared/assets-editor.component.ts +++ b/src/Squidex/app/features/content/shared/assets-editor.component.ts @@ -129,7 +129,7 @@ export class AssetsEditorComponent extends AppComponentBase implements ControlVa } public onAssetUpdated(asset: AssetDto) { - this.messageBus.publish(new AssetUpdated(asset, this)); + this.messageBus.emit(new AssetUpdated(asset, this)); } public onAssetFailed(file: File) { diff --git a/src/Squidex/app/features/dashboard/pages/dashboard-page.component.html b/src/Squidex/app/features/dashboard/pages/dashboard-page.component.html index 8c7b61880..169545bcb 100644 --- a/src/Squidex/app/features/dashboard/pages/dashboard-page.component.html +++ b/src/Squidex/app/features/dashboard/pages/dashboard-page.component.html @@ -84,8 +84,8 @@
API calls this month
-
{{callsCurrent}}
-
Monthly limit: {{callsMax}}
+
{{callsCurrent | sqxKNumber}}
+
Monthly limit: {{callsMax | sqxKNumber}}
@@ -100,8 +100,8 @@
Asset size today
-
{{assetsCurrent}}
-
Total limit: {{assetsMax}}
+
{{assetsCurrent | sqxFileSize}}
+
Total limit: {{assetsMax | sqxFileSize}}
diff --git a/src/Squidex/app/features/dashboard/pages/dashboard-page.component.ts b/src/Squidex/app/features/dashboard/pages/dashboard-page.component.ts index 31b4cffde..a60f9b9e6 100644 --- a/src/Squidex/app/features/dashboard/pages/dashboard-page.component.ts +++ b/src/Squidex/app/features/dashboard/pages/dashboard-page.component.ts @@ -13,7 +13,6 @@ import { AuthService, DateTime, fadeAnimation, - FileHelper, NotificationService, UsagesService } from 'shared'; @@ -55,11 +54,11 @@ export class DashboardPageComponent extends AppComponentBase implements OnInit { maintainAspectRatio: false }; - public assetsCurrent: string | null = null; - public assetsMax: string | null = null; + public assetsCurrent = 0; + public assetsMax = 0; - public callsCurrent: string | null = null; - public callsMax: string | null = null; + public callsCurrent = 0; + public callsMax = 0; constructor(apps: AppsStoreService, notifications: NotificationService, private readonly authService: AuthService, @@ -72,15 +71,15 @@ export class DashboardPageComponent extends AppComponentBase implements OnInit { this.appName() .switchMap(app => this.usagesService.getTodayStorage(app)) .subscribe(dto => { - this.assetsCurrent = FileHelper.fileSize(dto.size); - this.assetsMax = FileHelper.fileSize(dto.maxAllowed); + this.assetsCurrent = dto.size; + this.assetsMax = dto.maxAllowed; }); this.appName() .switchMap(app => this.usagesService.getMonthCalls(app)) .subscribe(dto => { - this.callsCurrent = formatCalls(dto.count); - this.callsMax = formatCalls(dto.maxAllowed); + this.callsCurrent = dto.count; + this.callsMax = dto.maxAllowed; }); this.appName() @@ -155,24 +154,6 @@ export class DashboardPageComponent extends AppComponentBase implements OnInit { } } -function formatCalls(count: number): string | null { - if (count > 1000) { - count = count / 1000; - - if (count < 10) { - count = Math.round(count * 10) / 10; - } else { - count = Math.round(count); - } - - return count + 'k'; - } else if (count < 0) { - return null; - } else { - return count.toString(); - } -} - function createLabels(dtos: { date: DateTime }[]): string[] { return dtos.map(d => d.date.toStringFormat('M-DD')); } diff --git a/src/Squidex/app/features/schemas/pages/schema/field.component.ts b/src/Squidex/app/features/schemas/pages/schema/field.component.ts index 958c505cb..58e18c3d3 100644 --- a/src/Squidex/app/features/schemas/pages/schema/field.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/field.component.ts @@ -109,11 +109,11 @@ export class FieldComponent implements OnInit { this.field.partitioning, properties); - this.sendSaving(field); + this.emitSaving(field); } } - private sendSaving(field: FieldDto) { + private emitSaving(field: FieldDto) { this.saving.emit(field); } diff --git a/src/Squidex/app/features/schemas/pages/schema/schema-edit-form.component.ts b/src/Squidex/app/features/schemas/pages/schema/schema-edit-form.component.ts index 217f03d17..d44fe3e53 100644 --- a/src/Squidex/app/features/schemas/pages/schema/schema-edit-form.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/schema-edit-form.component.ts @@ -65,7 +65,7 @@ export class SchemaEditFormComponent extends ComponentBase implements OnInit { } public cancel() { - this.sendCancelled(); + this.emitCancelled(); this.resetEditForm(); } @@ -79,7 +79,7 @@ export class SchemaEditFormComponent extends ComponentBase implements OnInit { this.schemas.putSchema(this.appName, this.name, requestDto, this.version) .subscribe(dto => { - this.sendSaved(requestDto); + this.emitSaved(requestDto); this.resetEditForm(); }, error => { this.notifyError(error); @@ -88,11 +88,11 @@ export class SchemaEditFormComponent extends ComponentBase implements OnInit { } } - private sendCancelled() { + private emitCancelled() { this.cancelled.emit(); } - private sendSaved(requestDto: any) { + private emitSaved(requestDto: any) { this.saved.emit(new SchemaPropertiesDto(requestDto.label, requestDto.hints)); } diff --git a/src/Squidex/app/features/schemas/pages/schema/schema-page.component.ts b/src/Squidex/app/features/schemas/pages/schema/schema-page.component.ts index e76e93bf2..63ee20367 100644 --- a/src/Squidex/app/features/schemas/pages/schema/schema-page.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/schema-page.component.ts @@ -201,7 +201,7 @@ export class SchemaPageComponent extends AppComponentBase implements OnInit { this.appNameOnce() .switchMap(app => this.schemasService.deleteSchema(app, this.schema.name, this.schema.version)).retry(2) .subscribe(() => { - this.sendSchemaDeleted(this.schema); + this.emitSchemaDeleted(this.schema); this.hideDeleteDialog(); this.back(); }, error => { @@ -252,7 +252,7 @@ export class SchemaPageComponent extends AppComponentBase implements OnInit { private updateSchema(schema: SchemaDetailsDto) { this.schema = schema; - this.sendSchemaUpdated(schema); + this.emitSchemaUpdated(schema); this.notify(); this.export(); } @@ -288,24 +288,24 @@ export class SchemaPageComponent extends AppComponentBase implements OnInit { this.schemaExport = result; } - private hideDeleteDialog() { - this.confirmDeleteDialog.hide(); - } - private back() { this.router.navigate(['../'], { relativeTo: this.route }); } - private sendSchemaDeleted(schema: SchemaDto) { - this.messageBus.publish(new SchemaDeleted(schema)); + private emitSchemaDeleted(schema: SchemaDto) { + this.messageBus.emit(new SchemaDeleted(schema)); } - private sendSchemaUpdated(schema: SchemaDto) { - this.messageBus.publish(new SchemaUpdated(schema)); + private emitSchemaUpdated(schema: SchemaDto) { + this.messageBus.emit(new SchemaUpdated(schema)); + } + + private hideDeleteDialog() { + this.confirmDeleteDialog.hide(); } private notify() { - this.messageBus.publish(new HistoryChannelUpdated()); + this.messageBus.emit(new HistoryChannelUpdated()); } } diff --git a/src/Squidex/app/features/schemas/pages/schemas/schema-form.component.ts b/src/Squidex/app/features/schemas/pages/schemas/schema-form.component.ts index 62036c346..0a52c03e9 100644 --- a/src/Squidex/app/features/schemas/pages/schemas/schema-form.component.ts +++ b/src/Squidex/app/features/schemas/pages/schemas/schema-form.component.ts @@ -72,7 +72,7 @@ export class SchemaFormComponent { } public cancel() { - this.sendCancelled(); + this.emitCancelled(); this.resetCreateForm(); } @@ -91,7 +91,7 @@ export class SchemaFormComponent { this.schemas.postSchema(this.appName, requestDto, me, undefined, schemaVersion) .subscribe(dto => { - this.sendCreated(dto); + this.emitCreated(dto); this.resetCreateForm(); }, error => { this.enableCreateForm(error.displayMessage); @@ -99,11 +99,11 @@ export class SchemaFormComponent { } } - private sendCancelled() { + private emitCancelled() { this.cancelled.emit(); } - private sendCreated(schema: SchemaDto) { + private emitCreated(schema: SchemaDto) { this.created.emit(schema); } diff --git a/src/Squidex/app/features/settings/pages/clients/clients-page.component.ts b/src/Squidex/app/features/settings/pages/clients/clients-page.component.ts index f2530e352..115a1d6bf 100644 --- a/src/Squidex/app/features/settings/pages/clients/clients-page.component.ts +++ b/src/Squidex/app/features/settings/pages/clients/clients-page.component.ts @@ -136,6 +136,6 @@ export class ClientsPageComponent extends AppComponentBase implements OnInit { private updateClients(clients: ImmutableArray) { this.appClients = clients; - this.messageBus.publish(new HistoryChannelUpdated()); + this.messageBus.emit(new HistoryChannelUpdated()); } } \ No newline at end of file diff --git a/src/Squidex/app/features/settings/pages/contributors/contributors-page.component.ts b/src/Squidex/app/features/settings/pages/contributors/contributors-page.component.ts index bbedb5f85..12515f6ee 100644 --- a/src/Squidex/app/features/settings/pages/contributors/contributors-page.component.ts +++ b/src/Squidex/app/features/settings/pages/contributors/contributors-page.component.ts @@ -137,13 +137,17 @@ export class ContributorsPageComponent extends AppComponentBase implements OnIni .switchMap(app => this.appContributorsService.postContributor(app, requestDto, this.version)) .subscribe(() => { this.updateContributors(this.appContributors.push(requestDto)); + this.resetContributorForm(); }, error => { this.notifyError(error); - }, () => { - this.addContributorForm.reset(); + this.resetContributorForm(); }); } + private resetContributorForm() { + this.addContributorForm.reset(); + } + private updateContributorsFromDto(dto: AppContributorsDto) { this.updateContributors(ImmutableArray.of(dto.contributors)); @@ -153,6 +157,6 @@ export class ContributorsPageComponent extends AppComponentBase implements OnIni private updateContributors(contributors: ImmutableArray) { this.appContributors = contributors; - this.messageBus.publish(new HistoryChannelUpdated()); + this.messageBus.emit(new HistoryChannelUpdated()); } } diff --git a/src/Squidex/app/features/settings/pages/languages/language.component.ts b/src/Squidex/app/features/settings/pages/languages/language.component.ts index 427a8d5d6..90d33a4dd 100644 --- a/src/Squidex/app/features/settings/pages/languages/language.component.ts +++ b/src/Squidex/app/features/settings/pages/languages/language.component.ts @@ -119,11 +119,11 @@ export class LanguageComponent implements OnInit, OnChanges, OnDestroy { this.editForm.controls['isOptional'].value, this.fallbackLanguages.map(l => l.iso2Code)); - this.sendSaving(newLanguage); + this.emitSaving(newLanguage); } } - private sendSaving(language: AppLanguageDto) { + private emitSaving(language: AppLanguageDto) { this.saving.emit(language); } diff --git a/src/Squidex/app/features/settings/pages/languages/languages-page.component.ts b/src/Squidex/app/features/settings/pages/languages/languages-page.component.ts index 33fc6cf3d..e1a122ae2 100644 --- a/src/Squidex/app/features/settings/pages/languages/languages-page.component.ts +++ b/src/Squidex/app/features/settings/pages/languages/languages-page.component.ts @@ -135,7 +135,7 @@ export class LanguagesPageComponent extends AppComponentBase implements OnInit { this.updateNewLanguages(); - this.messageBus.publish(new HistoryChannelUpdated()); + this.messageBus.emit(new HistoryChannelUpdated()); } private updateNewLanguages() { diff --git a/src/Squidex/app/features/settings/pages/plans/plans-page.component.html b/src/Squidex/app/features/settings/pages/plans/plans-page.component.html index 5b8153591..49f935c2c 100644 --- a/src/Squidex/app/features/settings/pages/plans/plans-page.component.html +++ b/src/Squidex/app/features/settings/pages/plans/plans-page.component.html @@ -45,10 +45,10 @@
- {{formatCalls(plan.maxApiCalls)}} API Calls + {{plan.maxApiCalls | sqxKNumber}} API Calls
- {{formatSize(plan.maxAssetSize)}} Storage + {{plan.maxAssetSize | sqxFileSize}} Storage
{{plan.maxContributors}} Contributors diff --git a/src/Squidex/app/features/settings/pages/plans/plans-page.component.ts b/src/Squidex/app/features/settings/pages/plans/plans-page.component.ts index 71345cd2f..fdb019845 100644 --- a/src/Squidex/app/features/settings/pages/plans/plans-page.component.ts +++ b/src/Squidex/app/features/settings/pages/plans/plans-page.component.ts @@ -14,7 +14,6 @@ import { AppsStoreService, AuthService, ChangePlanDto, - FileHelper, NotificationService, PlansService, Version @@ -80,27 +79,5 @@ export class PlansPageComponent extends AppComponentBase implements OnInit { this.isDisabled = false; }); } - - public formatSize(count: number): string { - return FileHelper.fileSize(count); - } - - public formatCalls(count: number): string | null { - if (count > 1000) { - count = count / 1000; - - if (count < 10) { - count = Math.round(count * 10) / 10; - } else { - count = Math.round(count); - } - - return count + 'k'; - } else if (count < 0) { - return null; - } else { - return count.toString(); - } - } } diff --git a/src/Squidex/app/framework/angular/numbers.pipes.spec.ts b/src/Squidex/app/framework/angular/numbers.pipes.spec.ts new file mode 100644 index 000000000..bcc786b00 --- /dev/null +++ b/src/Squidex/app/framework/angular/numbers.pipes.spec.ts @@ -0,0 +1,30 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Sebastian Stehle. All rights reserved + */ + +import { FileSizePipe, KNumberPipe } from './..'; + +describe('FileSizePipe', () => { + it('should calculate correct human file size', () => { + const pipe = new FileSizePipe(); + + expect(pipe.transform(50)).toBe('50 B'); + expect(pipe.transform(1024)).toBe('1.0 kB'); + expect(pipe.transform(1260000)).toBe('1.2 MB'); + }); +}); + +describe('KNumberPipe', () => { + it('should calculate correct human string', () => { + const pipe = new KNumberPipe(); + + expect(pipe.transform(0)).toBe('0'); + expect(pipe.transform(-1)).toBe(''); + expect(pipe.transform(50)).toBe('50'); + expect(pipe.transform(1024)).toBe('1k'); + expect(pipe.transform(1260000)).toBe('1000k'); + }); +}); \ No newline at end of file diff --git a/src/Squidex/app/framework/angular/numbers.pipes.ts b/src/Squidex/app/framework/angular/numbers.pipes.ts new file mode 100644 index 000000000..129ab650e --- /dev/null +++ b/src/Squidex/app/framework/angular/numbers.pipes.ts @@ -0,0 +1,50 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Sebastian Stehle. All rights reserved + */ + +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'sqxKNumber', + pure: true +}) +export class KNumberPipe implements PipeTransform { + public transform(value: number) { + if (value > 1000) { + value = value / 1000; + + if (value < 10) { + value = Math.round(value * 10) / 10; + } else { + value = Math.round(value); + } + + return value + 'k'; + } else if (value < 0) { + return ''; + } else { + return value.toString(); + } + } +} + +@Pipe({ + name: 'sqxFileSize', + pure: true +}) +export class FileSizePipe implements PipeTransform { + public transform(value: number) { + let u = 0, s = 1024; + + while (value >= s || -value >= s) { + value /= s; + u++; + } + + return (u ? value.toFixed(1) + ' ' : value) + ' kMGTPEZY'[u] + 'B'; + } +} + diff --git a/src/Squidex/app/framework/declarations.ts b/src/Squidex/app/framework/declarations.ts index bab4a1762..2352082bb 100644 --- a/src/Squidex/app/framework/declarations.ts +++ b/src/Squidex/app/framework/declarations.ts @@ -26,6 +26,7 @@ export * from './angular/modal-target.directive'; export * from './angular/modal-view.directive'; export * from './angular/money.pipe'; export * from './angular/name.pipe'; +export * from './angular/numbers.pipes'; export * from './angular/panel.component'; export * from './angular/panel-container.directive'; export * from './angular/parent-link.directive'; diff --git a/src/Squidex/app/framework/module.ts b/src/Squidex/app/framework/module.ts index fa6a19e8e..b255de2f1 100644 --- a/src/Squidex/app/framework/module.ts +++ b/src/Squidex/app/framework/module.ts @@ -24,12 +24,14 @@ import { DropdownComponent, DurationPipe, FileDropDirective, + FileSizePipe, FocusOnInitDirective, FromNowPipe, GeolocationEditorComponent, ImageSourceDirective, IndeterminateValueDirective, JsonEditorComponent, + KNumberPipe, LocalStoreService, LowerCaseInputDirective, MarkdownEditorComponent, @@ -83,12 +85,14 @@ import { DropdownComponent, DurationPipe, FileDropDirective, + FileSizePipe, FocusOnInitDirective, FromNowPipe, GeolocationEditorComponent, ImageSourceDirective, IndeterminateValueDirective, JsonEditorComponent, + KNumberPipe, LowerCaseInputDirective, MarkdownEditorComponent, ModalTargetDirective, @@ -126,12 +130,14 @@ import { DropdownComponent, DurationPipe, FileDropDirective, + FileSizePipe, FocusOnInitDirective, FromNowPipe, GeolocationEditorComponent, ImageSourceDirective, IndeterminateValueDirective, JsonEditorComponent, + KNumberPipe, LowerCaseInputDirective, MarkdownEditorComponent, ModalTargetDirective, diff --git a/src/Squidex/app/framework/services/message-bus.spec.ts b/src/Squidex/app/framework/services/message-bus.spec.ts index c592ba287..b40b0c406 100644 --- a/src/Squidex/app/framework/services/message-bus.spec.ts +++ b/src/Squidex/app/framework/services/message-bus.spec.ts @@ -34,8 +34,8 @@ describe('MessageBus', () => { lastEvent = event; }); - messageBus.publish(event1); - messageBus.publish(event2); + messageBus.emit(event1); + messageBus.emit(event2); expect(lastEvent).toBe(event1); }); diff --git a/src/Squidex/app/framework/services/message-bus.ts b/src/Squidex/app/framework/services/message-bus.ts index 5951651b4..4bfe3d7a1 100644 --- a/src/Squidex/app/framework/services/message-bus.ts +++ b/src/Squidex/app/framework/services/message-bus.ts @@ -21,7 +21,7 @@ export const MessageBusFactory = () => { export class MessageBus { private message$ = new Subject(); - public publish(message: T): void { + public emit(message: T): void { const channel = (message.constructor).name; this.message$.next({ channel: channel, data: message }); diff --git a/src/Squidex/app/shared/components/app-form.component.ts b/src/Squidex/app/shared/components/app-form.component.ts index 78ff7af98..5123d4e4b 100644 --- a/src/Squidex/app/shared/components/app-form.component.ts +++ b/src/Squidex/app/shared/components/app-form.component.ts @@ -54,7 +54,7 @@ export class AppFormComponent { } public cancel() { - this.sendCancelled(); + this.emitCancelled(); this.resetCreateForm(); } @@ -69,18 +69,18 @@ export class AppFormComponent { this.appsStore.createApp(request) .subscribe(dto => { this.resetCreateForm(); - this.sendCreated(dto); + this.emitCreated(dto); }, error => { this.enableCreateForm(error.displayMessage); }); } } - private sendCancelled() { + private emitCancelled() { this.cancelled.emit(); } - private sendCreated(app: AppDto) { + private emitCreated(app: AppDto) { this.created.emit(app); } diff --git a/src/Squidex/app/shared/components/asset.component.html b/src/Squidex/app/shared/components/asset.component.html index 5a8b228d4..e392bcc6a 100644 --- a/src/Squidex/app/shared/components/asset.component.html +++ b/src/Squidex/app/shared/components/asset.component.html @@ -1,15 +1,15 @@
- - {{fileType}} + + {{asset.fileType}}
- +
- +
@@ -18,7 +18,7 @@ - + @@ -29,8 +29,8 @@ - - {{fileType}} + + {{asset.fileType}} {{asset.lastModifiedBy | sqxUserNameRef}} @@ -42,11 +42,11 @@