From 6dfcde52dac795ff11b8fe1de4f50d7060a0bc78 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 27 Apr 2017 22:29:08 +0200 Subject: [PATCH] Dragging improved --- .../apps/pages/apps-page.component.ts | 3 +- .../assets/pages/assets-page.component.scss | 6 +- .../assets/pages/assets-page.component.ts | 2 +- .../content/content-field.component.html | 6 +- .../pages/content/content-page.component.html | 7 +- .../pages/content/content-page.component.ts | 10 +- .../pages/contents/contents-page.component.ts | 6 +- .../pages/schema/schema-page.component.ts | 8 +- .../types/boolean-validation.component.ts | 2 +- .../types/date-time-validation.component.ts | 4 +- .../pages/schema/types/number-ui.component.ts | 4 +- .../types/number-validation.component.ts | 2 +- .../pages/schema/types/string-ui.component.ts | 4 +- .../types/string-validation.component.ts | 8 +- .../pages/schemas/schema-form.component.ts | 4 +- .../pages/schemas/schemas-page.component.ts | 2 +- .../pages/clients/client.component.ts | 4 +- .../pages/clients/clients-page.component.ts | 2 +- .../contributors-page.component.ts | 4 +- .../languages/languages-page.component.ts | 2 +- .../angular/control-errors.component.ts | 2 +- .../angular/date-time-editor.component.ts | 2 +- .../framework/angular/file-drop.directive.ts | 3 +- .../framework/angular/modal-view.directive.ts | 2 +- .../app/framework/angular/square.directive.ts | 35 ------ .../app/framework/angular/stars.component.ts | 2 +- src/Squidex/app/framework/declarations.ts | 1 - src/Squidex/app/framework/module.ts | 3 - .../services/resource-loader.service.ts | 4 +- src/Squidex/app/framework/utils/modal-view.ts | 6 +- .../shared/components/app-form.component.ts | 4 +- .../shared/components/app.component-base.ts | 6 +- .../shared/components/asset.component.html | 109 +++++++++--------- .../shared/components/asset.component.scss | 5 +- .../app/shared/components/asset.component.ts | 2 - .../components/assets-editor.component.html | 8 +- .../components/assets-editor.component.scss | 44 ++++--- .../components/assets-editor.component.ts | 14 +-- .../shared/components/history.component.ts | 2 +- src/Squidex/app/shared/components/pipes.ts | 18 +-- .../resolve-app-languages.guard.spec.ts | 6 +- .../guards/resolve-app-languages.guard.ts | 4 +- .../guards/resolve-content.guard.spec.ts | 6 +- .../shared/guards/resolve-content.guard.ts | 4 +- .../resolve-published-schema.guard.spec.ts | 8 +- .../guards/resolve-published-schema.guard.ts | 4 +- .../guards/resolve-schema.guard.spec.ts | 6 +- .../app/shared/guards/resolve-schema.guard.ts | 4 +- .../shared/services/app-clients.service.ts | 8 +- .../services/app-contributors.service.ts | 6 +- .../shared/services/app-languages.service.ts | 8 +- .../shared/services/assets.service.spec.ts | 16 +-- .../app/shared/services/assets.service.ts | 12 +- .../app/shared/services/auth.service.ts | 2 +- .../shared/services/contents.service.spec.ts | 2 +- .../app/shared/services/contents.service.ts | 14 +-- .../app/shared/services/schemas.service.ts | 34 +++--- .../app/shared/services/users.service.ts | 2 +- src/Squidex/app/theme/_vars.scss | 4 +- src/Squidex/package.json | 26 ++--- 60 files changed, 263 insertions(+), 275 deletions(-) delete mode 100644 src/Squidex/app/framework/angular/square.directive.ts diff --git a/src/Squidex/app/features/apps/pages/apps-page.component.ts b/src/Squidex/app/features/apps/pages/apps-page.component.ts index 6eea47f09..197e5bc17 100644 --- a/src/Squidex/app/features/apps/pages/apps-page.component.ts +++ b/src/Squidex/app/features/apps/pages/apps-page.component.ts @@ -24,8 +24,7 @@ import { export class AppsPageComponent implements OnInit { public addAppDialog = new ModalView(); - public apps = - this.appsStore.apps.map(a => a || []); + public apps = this.appsStore.apps.map(a => a || []); constructor( private readonly appsStore: AppsStoreService diff --git a/src/Squidex/app/features/assets/pages/assets-page.component.scss b/src/Squidex/app/features/assets/pages/assets-page.component.scss index e90403286..80feaf783 100644 --- a/src/Squidex/app/features/assets/pages/assets-page.component.scss +++ b/src/Squidex/app/features/assets/pages/assets-page.component.scss @@ -23,7 +23,7 @@ } &-info { - color: $color-subtext; + color: darken($color-border, 30%); } &-button { @@ -52,8 +52,4 @@ .col-3 { padding-left: 8px; padding-right: 8px; -} - -.dnd-sortable-drag { - border: 0; } \ No newline at end of file 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 49e93b7a9..216e2761b 100644 --- a/src/Squidex/app/features/assets/pages/assets-page.component.ts +++ b/src/Squidex/app/features/assets/pages/assets-page.component.ts @@ -56,7 +56,7 @@ export class AssetsPageComponent extends AppComponentBase implements OnInit { private load() { this.appName() - .switchMap(app => this.assetsService.getAssets(app, this.assetsPager.pageSize, this.assetsPager.skip, this.assertQuery, null, null)) + .switchMap(app => this.assetsService.getAssets(app, this.assetsPager.pageSize, this.assetsPager.skip, this.assertQuery)) .subscribe(dtos => { this.assetsItems = ImmutableArray.of(dtos.items); this.assetsPager = this.assetsPager.setCount(dtos.total); diff --git a/src/Squidex/app/features/content/pages/content/content-field.component.html b/src/Squidex/app/features/content/pages/content/content-field.component.html index df2ffb2b6..eb74ff397 100644 --- a/src/Squidex/app/features/content/pages/content/content-field.component.html +++ b/src/Squidex/app/features/content/pages/content/content-field.component.html @@ -90,11 +90,7 @@
-
- - - Show Assets -
+
diff --git a/src/Squidex/app/features/content/pages/content/content-page.component.html b/src/Squidex/app/features/content/pages/content/content-page.component.html index 909ef43ba..40d8526f0 100644 --- a/src/Squidex/app/features/content/pages/content/content-page.component.html +++ b/src/Squidex/app/features/content/pages/content/content-page.component.html @@ -40,10 +40,13 @@ -
- +
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 732f0fb77..0f527e064 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 @@ -46,7 +46,7 @@ export class ContentPageComponent extends AppComponentBase implements OnDestroy, public contentFormSubmitted = false; public contentForm: FormGroup; public contentData: any = null; - public contentId: string; + public contentId: string | undefined; public isNewMode = true; @@ -75,12 +75,12 @@ export class ContentPageComponent extends AppComponentBase implements OnDestroy, } }); - this.route.parent.data.map(p => p['appLanguages']) + this.route.parent!.data.map(p => p['appLanguages']) .subscribe((languages: AppLanguageDto[]) => { this.languages = languages; }); - this.route.parent.data.map(p => p['schema']) + this.route.parent!.data.map(p => p['schema']) .subscribe((schema: SchemaDetailsDto) => { this.setupForm(schema); }); @@ -125,9 +125,9 @@ export class ContentPageComponent extends AppComponentBase implements OnDestroy, }); } else { this.appName() - .switchMap(app => this.contentsService.putContent(app, this.schema.name, this.contentId, data, this.version)) + .switchMap(app => this.contentsService.putContent(app, this.schema.name, this.contentId!, data, this.version)) .subscribe(() => { - this.messageBus.publish(new ContentUpdated(this.contentId, data, this.version.value)); + this.messageBus.publish(new ContentUpdated(this.contentId!, data, this.version.value)); this.notifyInfo('Content saved successfully.'); this.enable(); 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 b53c8d94b..5b324ea70 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 @@ -53,9 +53,7 @@ export class ContentsPageComponent extends AppComponentBase implements OnDestroy public languages: AppLanguageDto[] = []; public languageSelected: AppLanguageDto; - public get columnWidth() { - return 100 / this.contentFields.length; - } + public columnWidth: number; constructor(apps: AppsStoreService, notifications: NotificationService, private readonly authService: AuthService, @@ -154,6 +152,8 @@ export class ContentsPageComponent extends AppComponentBase implements OnDestroy private loadFields() { this.contentFields = this.schema.fields.filter(x => x.properties.isListField); + this.columnWidth = 100 / this.contentFields.length; + if (this.contentFields.length === 0 && this.schema.fields.length > 0) { this.contentFields = [this.schema.fields[0]]; } 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 da3b8b47a..1c5170456 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 @@ -221,12 +221,12 @@ export class SchemaPageComponent extends AppComponentBase implements OnInit { if (this.addFieldForm.valid) { this.addFieldForm.disable(); - const properties = createProperties(this.addFieldForm.get('type').value); + const properties = createProperties(this.addFieldForm.get('type')!.value); - const requestDto = new AddFieldDto(this.addFieldForm.get('name').value, properties); + const requestDto = new AddFieldDto(this.addFieldForm.get('name')!.value, properties); const reset = () => { - this.addFieldForm.get('name').reset(); + this.addFieldForm.get('name')!.reset(); this.addFieldForm.enable(); this.addFieldFormSubmitted = false; }; @@ -236,7 +236,7 @@ export class SchemaPageComponent extends AppComponentBase implements OnInit { .subscribe(dto => { const newField = new FieldDto(parseInt(dto.id, 10), - this.addFieldForm.get('name').value, + this.addFieldForm.get('name')!.value, false, false, properties); diff --git a/src/Squidex/app/features/schemas/pages/schema/types/boolean-validation.component.ts b/src/Squidex/app/features/schemas/pages/schema/types/boolean-validation.component.ts index 58eff1ab4..268a5d841 100644 --- a/src/Squidex/app/features/schemas/pages/schema/types/boolean-validation.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/types/boolean-validation.component.ts @@ -30,7 +30,7 @@ export class BooleanValidationComponent implements OnInit { new FormControl(this.properties.defaultValue)); this.hideDefaultValue = - this.editForm.get('isRequired').valueChanges + this.editForm.get('isRequired')!.valueChanges .startWith(this.properties.isRequired) .map(x => !!x); } diff --git a/src/Squidex/app/features/schemas/pages/schema/types/date-time-validation.component.ts b/src/Squidex/app/features/schemas/pages/schema/types/date-time-validation.component.ts index 0e0b4e54a..28c723709 100644 --- a/src/Squidex/app/features/schemas/pages/schema/types/date-time-validation.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/types/date-time-validation.component.ts @@ -48,12 +48,12 @@ export class DateTimeValidationComponent implements OnInit { ])); this.hideDefaultValues = - this.editForm.get('isRequired').valueChanges + this.editForm.get('isRequired')!.valueChanges .startWith(this.properties.isRequired) .map(x => !!x); this.hideDefaultValue = - this.editForm.get('calculatedDefaultValue').valueChanges + this.editForm.get('calculatedDefaultValue')!.valueChanges .startWith(this.properties.calculatedDefaultValue) .map(x => !!x); } diff --git a/src/Squidex/app/features/schemas/pages/schema/types/number-ui.component.ts b/src/Squidex/app/features/schemas/pages/schema/types/number-ui.component.ts index 7f8edc9c0..fbad19f19 100644 --- a/src/Squidex/app/features/schemas/pages/schema/types/number-ui.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/types/number-ui.component.ts @@ -46,14 +46,14 @@ export class NumberUIComponent implements OnDestroy, OnInit { new FormControl(this.properties.allowedValues, [])); this.hideAllowedValues = - this.editForm.get('editor').valueChanges + this.editForm.get('editor')!.valueChanges .startWith(this.properties.editor) .map(x => !x || x === 'Input' || x === 'Textarea'); this.editorSubscription = this.hideAllowedValues.subscribe(isSelection => { if (isSelection) { - this.editForm.get('allowedValues').setValue(undefined); + this.editForm.get('allowedValues')!.setValue(undefined); } }); } diff --git a/src/Squidex/app/features/schemas/pages/schema/types/number-validation.component.ts b/src/Squidex/app/features/schemas/pages/schema/types/number-validation.component.ts index 51fc8b779..facd2eafa 100644 --- a/src/Squidex/app/features/schemas/pages/schema/types/number-validation.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/types/number-validation.component.ts @@ -36,7 +36,7 @@ export class NumberValidationComponent implements OnInit { new FormControl(this.properties.defaultValue)); this.hideDefaultValue = - this.editForm.get('isRequired').valueChanges + this.editForm.get('isRequired')!.valueChanges .startWith(this.properties.isRequired) .map(x => !!x); } diff --git a/src/Squidex/app/features/schemas/pages/schema/types/string-ui.component.ts b/src/Squidex/app/features/schemas/pages/schema/types/string-ui.component.ts index bb8a8f923..38e82f309 100644 --- a/src/Squidex/app/features/schemas/pages/schema/types/string-ui.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/types/string-ui.component.ts @@ -46,7 +46,7 @@ export class StringUIComponent implements OnDestroy, OnInit { new FormControl(this.properties.allowedValues)); this.hideAllowedValues = - this.editForm.get('editor').valueChanges + this.editForm.get('editor')!.valueChanges .startWith(this.properties.editor) .map(x => !x || x === 'Input' || x === 'TextArea' || x === 'RichText' || x === 'Markdown'); @@ -54,7 +54,7 @@ export class StringUIComponent implements OnDestroy, OnInit { this.hideAllowedValues .subscribe(isSelection => { if (isSelection) { - this.editForm.get('allowedValues').setValue(undefined); + this.editForm.get('allowedValues')!.setValue(undefined); } }); } diff --git a/src/Squidex/app/features/schemas/pages/schema/types/string-validation.component.ts b/src/Squidex/app/features/schemas/pages/schema/types/string-validation.component.ts index 0387c7099..5094c0199 100644 --- a/src/Squidex/app/features/schemas/pages/schema/types/string-validation.component.ts +++ b/src/Squidex/app/features/schemas/pages/schema/types/string-validation.component.ts @@ -49,19 +49,19 @@ export class StringValidationComponent implements OnDestroy, OnInit { new FormControl(this.properties.defaultValue)); this.hideDefaultValue = - this.editForm.get('isRequired').valueChanges + this.editForm.get('isRequired')!.valueChanges .startWith(this.properties.isRequired) .map(x => !!x); this.hidePatternMessage = - this.editForm.get('pattern').valueChanges + this.editForm.get('pattern')!.valueChanges .startWith('') .map(x => !x || x.trim().length === 0); this.patternSubscription = - this.editForm.get('pattern').valueChanges.subscribe((value: string) => { + this.editForm.get('pattern')!.valueChanges.subscribe((value: string) => { if (!value || value.length === 0) { - this.editForm.get('patternMessage').setValue(undefined); + this.editForm.get('patternMessage')!.setValue(undefined); } }); } 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 baeb2dae0..039743bec 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 @@ -53,7 +53,7 @@ export class SchemaFormComponent { }); public schemaName = - this.createForm.get('name').valueChanges.map(n => n || FALLBACK_NAME) + this.createForm.get('name')!.valueChanges.map(n => n || FALLBACK_NAME) .startWith(FALLBACK_NAME); constructor( @@ -76,7 +76,7 @@ export class SchemaFormComponent { this.createForm.disable(); const schemaVersion = new Version(); - const schemaName = this.createForm.get('name').value; + const schemaName = this.createForm.get('name')!.value; const requestDto = new CreateSchemaDto(schemaName); diff --git a/src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.ts b/src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.ts index 48296e899..4354914af 100644 --- a/src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.ts +++ b/src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.ts @@ -112,7 +112,7 @@ export class SchemasPageComponent extends AppComponentBase implements OnDestroy, query = query || this.schemaQuery; if (query && query.length > 0) { - schemas = schemas.filter(t => t.name.indexOf(query) >= 0); + schemas = schemas.filter(t => t.name.indexOf(query!) >= 0); } schemas = diff --git a/src/Squidex/app/features/settings/pages/clients/client.component.ts b/src/Squidex/app/features/settings/pages/clients/client.component.ts index 30df585ff..d1be4e845 100644 --- a/src/Squidex/app/features/settings/pages/clients/client.component.ts +++ b/src/Squidex/app/features/settings/pages/clients/client.component.ts @@ -73,7 +73,7 @@ export class ClientComponent { } public resetForm() { - this.renameForm.get('name').setValue(this.clientName); + this.renameForm.get('name')!.setValue(this.clientName); } public cancelRename() { @@ -94,7 +94,7 @@ export class ClientComponent { public rename() { try { - const newName = this.renameForm.get('name').value; + const newName = this.renameForm.get('name')!.value; if (newName !== this.clientName) { this.renaming.emit(newName); 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 64b365589..7a38974a3 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 @@ -103,7 +103,7 @@ export class ClientsPageComponent extends AppComponentBase implements OnInit { if (this.addClientForm.valid) { this.addClientForm.disable(); - const requestDto = new CreateAppClientDto(this.addClientForm.get('name').value); + const requestDto = new CreateAppClientDto(this.addClientForm.get('name')!.value); const reset = () => { this.addClientFormSubmitted = false; 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 cd6a6fee3..73ff180f8 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 @@ -43,7 +43,7 @@ export class UsersDataSource implements AutocompleteSource { new AutocompleteItem( user.displayName, user.email, - user.pictureUrl, + user.pictureUrl!, user)); } } @@ -117,7 +117,7 @@ export class ContributorsPageComponent extends AppComponentBase implements OnIni } public assignContributor() { - const newContributor = new AppContributorDto(this.addContributorForm.get('user').value.model.id, 'Editor'); + const newContributor = new AppContributorDto(this.addContributorForm.get('user')!.value.model.id, 'Editor'); this.appName() .switchMap(app => this.appContributorsService.postContributor(app, newContributor, this.version)) 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 fe940c819..de06f4e11 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 @@ -87,7 +87,7 @@ export class LanguagesPageComponent extends AppComponentBase implements OnInit { } public addLanguage() { - const request = new AddAppLanguageDto(this.addLanguageForm.get('language').value.iso2Code); + const request = new AddAppLanguageDto(this.addLanguageForm.get('language')!.value.iso2Code); this.appName() .switchMap(app => this.appLanguagesService.postLanguages(app, request, this.version)) diff --git a/src/Squidex/app/framework/angular/control-errors.component.ts b/src/Squidex/app/framework/angular/control-errors.component.ts index 512941159..001474b55 100644 --- a/src/Squidex/app/framework/angular/control-errors.component.ts +++ b/src/Squidex/app/framework/angular/control-errors.component.ts @@ -55,7 +55,7 @@ export class ControlErrorsComponent implements OnChanges { return null; } - if (this.control.invalid && ((this.control.touched && !this.submitOnly) || this.submitted)) { + if (this.control.invalid && ((this.control.touched && !this.submitOnly) || this.submitted) && this.control.errors) { const errors: string[] = []; for (let key in this.control.errors) { diff --git a/src/Squidex/app/framework/angular/date-time-editor.component.ts b/src/Squidex/app/framework/angular/date-time-editor.component.ts index 5b778964b..2002c49a2 100644 --- a/src/Squidex/app/framework/angular/date-time-editor.component.ts +++ b/src/Squidex/app/framework/angular/date-time-editor.component.ts @@ -156,7 +156,7 @@ export class DateTimeEditorComponent implements ControlValueAccessor, OnInit, Af } private updateValue() { - let result: string = null; + let result: string | null = null; if ((this.dateValue && !this.dateValue.isValid()) || (this.timeValue && !this.timeValue.isValid())) { result = 'Invalid DateTime'; diff --git a/src/Squidex/app/framework/angular/file-drop.directive.ts b/src/Squidex/app/framework/angular/file-drop.directive.ts index 82d4d2627..15dd6c1a9 100644 --- a/src/Squidex/app/framework/angular/file-drop.directive.ts +++ b/src/Squidex/app/framework/angular/file-drop.directive.ts @@ -22,8 +22,9 @@ export class FileDropDirective { ) { } + @HostListener('dragend', ['$event']) @HostListener('dragleave', ['$event']) - public onDragLeave(event: DragDropEvent) { + public onDragEnd(event: DragDropEvent) { const hasFiles = this.hasFiles(event.dataTransfer.types); if (hasFiles) { diff --git a/src/Squidex/app/framework/angular/modal-view.directive.ts b/src/Squidex/app/framework/angular/modal-view.directive.ts index 8fc03fd04..8463f314d 100644 --- a/src/Squidex/app/framework/angular/modal-view.directive.ts +++ b/src/Squidex/app/framework/angular/modal-view.directive.ts @@ -14,7 +14,7 @@ import { ModalView } from './../utils/modal-view'; selector: '[sqxModalView]' }) export class ModalViewDirective implements OnChanges, OnInit, OnDestroy { - private subscription: Subscription; + private subscription: Subscription | null; private isEnabled = true; private clickHandler: Function | null; private renderedView: EmbeddedViewRef | null = null; diff --git a/src/Squidex/app/framework/angular/square.directive.ts b/src/Squidex/app/framework/angular/square.directive.ts deleted file mode 100644 index 943e6e47b..000000000 --- a/src/Squidex/app/framework/angular/square.directive.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Squidex Headless CMS - * - * @license - * Copyright (c) Sebastian Stehle. All rights reserved - */ - -import { Directive, ElementRef, HostListener, OnInit, Renderer } from '@angular/core'; - -@Directive({ - selector: '[sqxSquare]' -}) -export class SquareDirective implements OnInit { - - constructor( - private readonly element: ElementRef, - private readonly renderer: Renderer - ) { - } - - public ngOnInit() { - this.resize(); - } - - @HostListener('resize') - public onResize() { - this.resize(); - } - - private resize() { - const size = this.element.nativeElement.getBoundingClientRect(); - - this.renderer.setElementStyle(this.element.nativeElement, 'height', size.width + 'px'); - } -} \ No newline at end of file diff --git a/src/Squidex/app/framework/angular/stars.component.ts b/src/Squidex/app/framework/angular/stars.component.ts index a3ca5b000..f53cf3fe4 100644 --- a/src/Squidex/app/framework/angular/stars.component.ts +++ b/src/Squidex/app/framework/angular/stars.component.ts @@ -84,7 +84,7 @@ export class StarsComponent implements ControlValueAccessor { return; } - this.stars = this.value; + this.stars = this.value || 0; } public reset() { diff --git a/src/Squidex/app/framework/declarations.ts b/src/Squidex/app/framework/declarations.ts index e609fb0a9..3dd5c2837 100644 --- a/src/Squidex/app/framework/declarations.ts +++ b/src/Squidex/app/framework/declarations.ts @@ -33,7 +33,6 @@ export * from './angular/rich-editor.component'; export * from './angular/scroll-active.directive'; export * from './angular/shortcut.component'; export * from './angular/slider.component'; -export * from './angular/square.directive'; export * from './angular/stars.component'; export * from './angular/tag-editor.component'; export * from './angular/title.component'; diff --git a/src/Squidex/app/framework/module.ts b/src/Squidex/app/framework/module.ts index e169f8ac0..26c737449 100644 --- a/src/Squidex/app/framework/module.ts +++ b/src/Squidex/app/framework/module.ts @@ -50,7 +50,6 @@ import { ShortDatePipe, ShortTimePipe, SliderComponent, - SquareDirective, StarsComponent, TagEditorComponent, TitleService, @@ -99,7 +98,6 @@ import { ShortDatePipe, ShortTimePipe, SliderComponent, - SquareDirective, StarsComponent, TagEditorComponent, TitleComponent, @@ -138,7 +136,6 @@ import { ShortDatePipe, ShortTimePipe, SliderComponent, - SquareDirective, StarsComponent, TagEditorComponent, TitleComponent, diff --git a/src/Squidex/app/framework/services/resource-loader.service.ts b/src/Squidex/app/framework/services/resource-loader.service.ts index a94221bec..a461a968d 100644 --- a/src/Squidex/app/framework/services/resource-loader.service.ts +++ b/src/Squidex/app/framework/services/resource-loader.service.ts @@ -52,7 +52,9 @@ export class ResourceLoaderService { const node = document.getElementsByTagName('script')[0]; - node.parentNode.insertBefore(script, node); + if (node.parentNode) { + node.parentNode.insertBefore(script, node); + } }); this.cache[key] = result; diff --git a/src/Squidex/app/framework/utils/modal-view.ts b/src/Squidex/app/framework/utils/modal-view.ts index 147dcdfad..d9d7e7a07 100644 --- a/src/Squidex/app/framework/utils/modal-view.ts +++ b/src/Squidex/app/framework/utils/modal-view.ts @@ -9,16 +9,18 @@ import { BehaviorSubject, Observable } from 'rxjs'; export class ModalView { private readonly isOpen$: BehaviorSubject; - private static openView: ModalView; + private readonly isOpenChanges$: Observable; + private static openView: ModalView | null = null; public get isOpen(): Observable { - return this.isOpen$.distinctUntilChanged(); + return this.isOpenChanges$; } constructor(isOpen = false, public readonly closeAlways: boolean = false ) { this.isOpen$ = new BehaviorSubject(isOpen); + this.isOpenChanges$ = this.isOpen$.distinctUntilChanged(); } public show() { diff --git a/src/Squidex/app/shared/components/app-form.component.ts b/src/Squidex/app/shared/components/app-form.component.ts index b7211d2fc..c3e4240b8 100644 --- a/src/Squidex/app/shared/components/app-form.component.ts +++ b/src/Squidex/app/shared/components/app-form.component.ts @@ -43,7 +43,7 @@ export class AppFormComponent { }); public appName = - this.createForm.get('name').valueChanges.map(n => n || FALLBACK_NAME) + this.createForm.get('name')!.valueChanges.map(n => n || FALLBACK_NAME) .startWith(FALLBACK_NAME); constructor( @@ -64,7 +64,7 @@ export class AppFormComponent { if (this.createForm.valid) { this.createForm.disable(); - const request = new CreateAppDto(this.createForm.get('name').value); + const request = new CreateAppDto(this.createForm.get('name')!.value); this.appsStore.createApp(request) .subscribe(dto => { diff --git a/src/Squidex/app/shared/components/app.component-base.ts b/src/Squidex/app/shared/components/app.component-base.ts index 9fdbcc2a2..006ceeb4a 100644 --- a/src/Squidex/app/shared/components/app.component-base.ts +++ b/src/Squidex/app/shared/components/app.component-base.ts @@ -12,14 +12,18 @@ import { AppsStoreService, NotificationService } from './../declarations-base'; import { ComponentBase } from './component-base'; export abstract class AppComponentBase extends ComponentBase { + private appName$: Observable; + constructor(notifications: NotificationService, private readonly appsStore: AppsStoreService ) { super(notifications); + + this.appName$ = this.appsStore.selectedApp.map(a => a!.name).take(1); } public appName(): Observable { - return this.appsStore.selectedApp.map(a => a!.name).take(1); + return this.appName$; } } diff --git a/src/Squidex/app/shared/components/asset.component.html b/src/Squidex/app/shared/components/asset.component.html index caeb0c18e..3560b5938 100644 --- a/src/Squidex/app/shared/components/asset.component.html +++ b/src/Squidex/app/shared/components/asset.component.html @@ -1,68 +1,67 @@ -
-
-
-
- - {{fileType}} - +
+
+
+ + {{fileType}} + + +
+ +
+
+ +
+ +
+
-
- -
-
- -
+ + + + + + -
-
- - - + + + - - + + + + + - - - - - - - - - - - - - {{fileType}} - - - {{asset.lastModifiedBy | userNameRef}} - - - {{asset.lastModified | fromNow}} - -
+ + {{fileType}} + + + {{asset.lastModifiedBy | userNameRef}} + + + {{asset.lastModified | fromNow}} +
- + diff --git a/src/Squidex/app/shared/components/asset.component.scss b/src/Squidex/app/shared/components/asset.component.scss index a2f077518..82574e3a1 100644 --- a/src/Squidex/app/shared/components/asset.component.scss +++ b/src/Squidex/app/shared/components/asset.component.scss @@ -9,7 +9,7 @@ @mixin overlay { & { - @include transition(opacity.4s ease); + @include transition(opacity .4s ease); @include absolute(0, 0, 0, 0); @include opacity(0); color: $color-dark-foreground; @@ -70,6 +70,7 @@ .card { & { @include overlay-container; + height: $asset-height; } &.drag { @@ -92,7 +93,7 @@ } .upload-progress { - margin: 60px 70px; + @include absolute(2rem, 2rem, 2rem, 2rem); } .file { diff --git a/src/Squidex/app/shared/components/asset.component.ts b/src/Squidex/app/shared/components/asset.component.ts index 4e3979bc9..b37b0131b 100644 --- a/src/Squidex/app/shared/components/asset.component.ts +++ b/src/Squidex/app/shared/components/asset.component.ts @@ -109,8 +109,6 @@ export class AssetComponent extends AppComponentBase implements OnInit { result.pixelWidth, result.pixelHeight, result.version); - this.updateAsset(asset); - this.loaded.emit(asset); } else { this.progress = result; diff --git a/src/Squidex/app/shared/components/assets-editor.component.html b/src/Squidex/app/shared/components/assets-editor.component.html index 742a2acd5..0a657919d 100644 --- a/src/Squidex/app/shared/components/assets-editor.component.html +++ b/src/Squidex/app/shared/components/assets-editor.component.html @@ -1,5 +1,11 @@ -
+
+
+
+ Drop files or assets here to add them. +
+
+ diff --git a/src/Squidex/app/shared/components/assets-editor.component.scss b/src/Squidex/app/shared/components/assets-editor.component.scss index a57a17949..b04adcfae 100644 --- a/src/Squidex/app/shared/components/assets-editor.component.scss +++ b/src/Squidex/app/shared/components/assets-editor.component.scss @@ -4,29 +4,47 @@ .assets { &-container { & { - border: 2px solid $color-input; - background: $color-input; + background: $color-background; overflow-x: hidden; - overflow-y: auto; + overflow-y: scroll; padding: 1rem; padding-bottom: 0; - height: 240px; + height: $asset-height + 2rem; } + } +} - &.drag { - border-color: darken($color-border, 10%); - border-style: dashed; - cursor: copy; - } +.drop-area { + & { + @include transition(border-color .4s ease); + border: 2px dashed $color-border; + height: $asset-height; + font-size: 1.2rem; + font-weight: normal; + text-align: center; + padding: 3rem 2rem; + color: darken($color-border, 30%); + } + + &-container { + padding-bottom: 1rem; + } + + &.drag, + &.dnd-drag-over, + &.dnd-drag-enter { + border-color: darken($color-border, 10%); + cursor: copy; + color: darken($color-border, 40%); } } .row { - margin-left: -8px; - margin-right: -8px; + margin-left: -.5rem; + margin-right: -.5rem; } .col-4 { - padding-left: 8px; - padding-right: 8px; + padding-left: .5rem; + padding-right: .5rem; } \ No newline at end of file diff --git a/src/Squidex/app/shared/components/assets-editor.component.ts b/src/Squidex/app/shared/components/assets-editor.component.ts index 6bf40d02e..61bbcdcd5 100644 --- a/src/Squidex/app/shared/components/assets-editor.component.ts +++ b/src/Squidex/app/shared/components/assets-editor.component.ts @@ -48,11 +48,11 @@ export class AssetsEditorComponent extends AppComponentBase implements ControlVa } public writeValue(value: any) { - if (!value) { - this.oldAssets = ImmutableArray.empty(); - } else { + this.oldAssets = ImmutableArray.empty(); + + if (value) { this.appName() - .switchMap(app => this.assetsService.getAssets(app, 10000, 0, null, null, value)) + .switchMap(app => this.assetsService.getAssets(app, 10000, 0, undefined, undefined, value)) .subscribe(dtos => { this.oldAssets = ImmutableArray.of(dtos.items); }); @@ -79,13 +79,13 @@ export class AssetsEditorComponent extends AppComponentBase implements ControlVa public onAssetLoaded(file: File, asset: AssetDto) { this.newAssets = this.newAssets.remove(file); - this.oldAssets = this.oldAssets.push(asset); + this.oldAssets = this.oldAssets.pushFront(asset); this.updateValue(); } public onAssetDropped(asset: AssetDto) { - this.oldAssets = this.oldAssets.push(asset); + this.oldAssets = this.oldAssets.pushFront(asset); this.updateValue(); } @@ -99,7 +99,7 @@ export class AssetsEditorComponent extends AppComponentBase implements ControlVa } private updateValue() { - let ids = this.oldAssets.values.map(x => x.id); + let ids: string[] | null = this.oldAssets.values.map(x => x.id); if (ids.length === 0) { ids = null; diff --git a/src/Squidex/app/shared/components/history.component.ts b/src/Squidex/app/shared/components/history.component.ts index 7a93a2856..19238abc2 100644 --- a/src/Squidex/app/shared/components/history.component.ts +++ b/src/Squidex/app/shared/components/history.component.ts @@ -31,7 +31,7 @@ const REPLACEMENT_TEMP = '$TEMP$'; export class HistoryComponent extends AppComponentBase { public get channel(): string { let result = this.route.snapshot.data['channel']; - let params = this.route.parent.snapshot.params; + let params = this.route.parent!.snapshot.params; for (let key in params) { if (params.hasOwnProperty(key)) { diff --git a/src/Squidex/app/shared/components/pipes.ts b/src/Squidex/app/shared/components/pipes.ts index 8ed5915de..af6542d9c 100644 --- a/src/Squidex/app/shared/components/pipes.ts +++ b/src/Squidex/app/shared/components/pipes.ts @@ -12,7 +12,7 @@ import { UsersProviderService } from './../declarations-base'; class UserAsyncPipe implements OnDestroy { private lastUserId: string; - private lastValue: string; + private lastValue: string | null = null; private subscription: Subscription; constructor( @@ -27,7 +27,7 @@ class UserAsyncPipe implements OnDestroy { } } - protected transformInternal(userId: string, transform: (users: UsersProviderService) => Observable): string { + protected transformInternal(userId: string, transform: (users: UsersProviderService) => Observable): string | null { if (this.lastUserId !== userId) { this.lastUserId = userId; @@ -55,7 +55,7 @@ export class UserNamePipe extends UserAsyncPipe implements PipeTransform { super(users, changeDetector); } - public transform(userId: string, placeholder = 'Me'): string { + public transform(userId: string, placeholder = 'Me'): string | null { return super.transformInternal(userId, users => users.getUser(userId, placeholder).map(u => u.displayName)); } } @@ -69,7 +69,7 @@ export class UserNameRefPipe extends UserAsyncPipe implements PipeTransform { super(users, changeDetector); } - public transform(userId: string, placeholder = 'Me'): string { + public transform(userId: string, placeholder = 'Me'): string | null { return super.transformInternal(userId, users => { const parts = userId.split(':'); @@ -95,7 +95,7 @@ export class UserEmailPipe extends UserAsyncPipe implements PipeTransform { super(users, changeDetector); } - public transform(userId: string): string { + public transform(userId: string): string | null { return super.transformInternal(userId, users => users.getUser(userId).map(u => u.email)); } } @@ -109,14 +109,14 @@ export class UserEmailRefPipe extends UserAsyncPipe implements PipeTransform { super(users, changeDetector); } - public transform(userId: string): string { + public transform(userId: string): string | null { return super.transformInternal(userId, users => { const parts = userId.split(':'); if (parts[0] === 'subject') { return users.getUser(parts[1]).map(u => u.email); } else { - return null; + return Observable.of(null); } }); } @@ -131,7 +131,7 @@ export class UserPicturePipe extends UserAsyncPipe implements PipeTransform { super(users, changeDetector); } - public transform(userId: string): string { + public transform(userId: string): string | null { return super.transformInternal(userId, users => users.getUser(userId).map(u => u.pictureUrl)); } } @@ -145,7 +145,7 @@ export class UserPictureRefPipe extends UserAsyncPipe implements PipeTransform { super(users, changeDetector); } - public transform(userId: string): string { + public transform(userId: string): string | null { return super.transformInternal(userId, users => { const parts = userId.split(':'); diff --git a/src/Squidex/app/shared/guards/resolve-app-languages.guard.spec.ts b/src/Squidex/app/shared/guards/resolve-app-languages.guard.spec.ts index 2ca36223a..40c19615f 100644 --- a/src/Squidex/app/shared/guards/resolve-app-languages.guard.spec.ts +++ b/src/Squidex/app/shared/guards/resolve-app-languages.guard.spec.ts @@ -33,7 +33,7 @@ describe('ResolveAppLanguagesGuard', () => { }); it('should navigate to 404 page if languages are not found', (done) => { - appLanguagesService.setup(x => x.getLanguages('my-app', null)) + appLanguagesService.setup(x => x.getLanguages('my-app')) .returns(() => Observable.of(null!)); const router = new RouterMockup(); @@ -49,7 +49,7 @@ describe('ResolveAppLanguagesGuard', () => { }); it('should navigate to 404 page if languages loading fails', (done) => { - appLanguagesService.setup(x => x.getLanguages('my-app', null)) + appLanguagesService.setup(x => x.getLanguages('my-app')) .returns(() => Observable.throw(null!)); const router = new RouterMockup(); @@ -67,7 +67,7 @@ describe('ResolveAppLanguagesGuard', () => { it('should return schema if loading succeeded', (done) => { const languages: AppLanguageDto[] = []; - appLanguagesService.setup(x => x.getLanguages('my-app', null)) + appLanguagesService.setup(x => x.getLanguages('my-app')) .returns(() => Observable.of(languages)); const router = new RouterMockup(); diff --git a/src/Squidex/app/shared/guards/resolve-app-languages.guard.ts b/src/Squidex/app/shared/guards/resolve-app-languages.guard.ts index ced6111c2..9a52abb39 100644 --- a/src/Squidex/app/shared/guards/resolve-app-languages.guard.ts +++ b/src/Squidex/app/shared/guards/resolve-app-languages.guard.ts @@ -26,7 +26,7 @@ export class ResolveAppLanguagesGuard implements Resolve { } const result = - this.appLanguagesService.getLanguages(appName, null).toPromise() + this.appLanguagesService.getLanguages(appName).toPromise() .then(dto => { if (!dto) { this.router.navigate(['/404']); @@ -50,7 +50,7 @@ export class ResolveAppLanguagesGuard implements Resolve { while (route) { result = route.params[name]; - if (result) { + if (result || !route.parent) { break; } diff --git a/src/Squidex/app/shared/guards/resolve-content.guard.spec.ts b/src/Squidex/app/shared/guards/resolve-content.guard.spec.ts index 52ef46ec9..f0ea8c9b8 100644 --- a/src/Squidex/app/shared/guards/resolve-content.guard.spec.ts +++ b/src/Squidex/app/shared/guards/resolve-content.guard.spec.ts @@ -43,7 +43,7 @@ describe('ResolveContentGuard', () => { }); it('should navigate to 404 page if schema is not found', (done) => { - appsStore.setup(x => x.getContent('my-app', 'my-schema', '123', null)) + appsStore.setup(x => x.getContent('my-app', 'my-schema', '123')) .returns(() => Observable.of(null!)); const router = new RouterMockup(); @@ -59,7 +59,7 @@ describe('ResolveContentGuard', () => { }); it('should navigate to 404 page if schema loading fails', (done) => { - appsStore.setup(x => x.getContent('my-app', 'my-schema', '123', null)) + appsStore.setup(x => x.getContent('my-app', 'my-schema', '123')) .returns(() => Observable.throw(null!)); const router = new RouterMockup(); @@ -77,7 +77,7 @@ describe('ResolveContentGuard', () => { it('should return schema if loading succeeded', (done) => { const schema = {}; - appsStore.setup(x => x.getContent('my-app', 'my-schema', '123', null)) + appsStore.setup(x => x.getContent('my-app', 'my-schema', '123')) .returns(() => Observable.of(schema)); const router = new RouterMockup(); diff --git a/src/Squidex/app/shared/guards/resolve-content.guard.ts b/src/Squidex/app/shared/guards/resolve-content.guard.ts index c4cbbcb90..7ad185e43 100644 --- a/src/Squidex/app/shared/guards/resolve-content.guard.ts +++ b/src/Squidex/app/shared/guards/resolve-content.guard.ts @@ -28,7 +28,7 @@ export class ResolveContentGuard implements Resolve { } const result = - this.contentsService.getContent(appName, schemaName, contentId, null).toPromise() + this.contentsService.getContent(appName, schemaName, contentId).toPromise() .then(dto => { if (!dto) { this.router.navigate(['/404']); @@ -52,7 +52,7 @@ export class ResolveContentGuard implements Resolve { while (route) { result = route.params[name]; - if (result) { + if (result || !route.parent) { break; } diff --git a/src/Squidex/app/shared/guards/resolve-published-schema.guard.spec.ts b/src/Squidex/app/shared/guards/resolve-published-schema.guard.spec.ts index e76b358a2..3b9dfee16 100644 --- a/src/Squidex/app/shared/guards/resolve-published-schema.guard.spec.ts +++ b/src/Squidex/app/shared/guards/resolve-published-schema.guard.spec.ts @@ -38,7 +38,7 @@ describe('ResolvePublishedSchemaGuard', () => { }); it('should navigate to 404 page if schema is not found', (done) => { - schemasService.setup(x => x.getSchema('my-app', 'my-schema', null)) + schemasService.setup(x => x.getSchema('my-app', 'my-schema')) .returns(() => Observable.of(null!)); const router = new RouterMockup(); @@ -54,7 +54,7 @@ describe('ResolvePublishedSchemaGuard', () => { }); it('should navigate to 404 page if schema loading fails', (done) => { - schemasService.setup(x => x.getSchema('my-app', 'my-schema', null)) + schemasService.setup(x => x.getSchema('my-app', 'my-schema')) .returns(() => Observable.throw(null)); const router = new RouterMockup(); @@ -72,7 +72,7 @@ describe('ResolvePublishedSchemaGuard', () => { it('should navigate to 404 page if schema not published', (done) => { const schema = { isPublished: false }; - schemasService.setup(x => x.getSchema('my-app', 'my-schema', null)) + schemasService.setup(x => x.getSchema('my-app', 'my-schema')) .returns(() => Observable.of(schema)); const router = new RouterMockup(); @@ -90,7 +90,7 @@ describe('ResolvePublishedSchemaGuard', () => { it('should return schema if loading succeeded', (done) => { const schema = { isPublished: true }; - schemasService.setup(x => x.getSchema('my-app', 'my-schema', null)) + schemasService.setup(x => x.getSchema('my-app', 'my-schema')) .returns(() => Observable.of(schema)); const router = new RouterMockup(); diff --git a/src/Squidex/app/shared/guards/resolve-published-schema.guard.ts b/src/Squidex/app/shared/guards/resolve-published-schema.guard.ts index 956fc1c4e..032b4e542 100644 --- a/src/Squidex/app/shared/guards/resolve-published-schema.guard.ts +++ b/src/Squidex/app/shared/guards/resolve-published-schema.guard.ts @@ -27,7 +27,7 @@ export class ResolvePublishedSchemaGuard implements Resolve { } const result = - this.schemasService.getSchema(appName, schemaName, null).toPromise() + this.schemasService.getSchema(appName, schemaName).toPromise() .then(dto => { if (!dto || !dto.isPublished) { this.router.navigate(['/404']); @@ -51,7 +51,7 @@ export class ResolvePublishedSchemaGuard implements Resolve { while (route) { result = route.params[name]; - if (result) { + if (result || !route.parent) { break; } diff --git a/src/Squidex/app/shared/guards/resolve-schema.guard.spec.ts b/src/Squidex/app/shared/guards/resolve-schema.guard.spec.ts index 7f7f9ffc6..aaacd1ad7 100644 --- a/src/Squidex/app/shared/guards/resolve-schema.guard.spec.ts +++ b/src/Squidex/app/shared/guards/resolve-schema.guard.spec.ts @@ -38,7 +38,7 @@ describe('ResolveSchemaGuard', () => { }); it('should navigate to 404 page if schema is not found', (done) => { - schemasService.setup(x => x.getSchema('my-app', 'my-schema', null)) + schemasService.setup(x => x.getSchema('my-app', 'my-schema')) .returns(() => Observable.of(null!)); const router = new RouterMockup(); @@ -54,7 +54,7 @@ describe('ResolveSchemaGuard', () => { }); it('should navigate to 404 page if schema loading fails', (done) => { - schemasService.setup(x => x.getSchema('my-app', 'my-schema', null)) + schemasService.setup(x => x.getSchema('my-app', 'my-schema')) .returns(() => Observable.throw(null!)); const router = new RouterMockup(); @@ -72,7 +72,7 @@ describe('ResolveSchemaGuard', () => { it('should return schema if loading succeeded', (done) => { const schema = {}; - schemasService.setup(x => x.getSchema('my-app', 'my-schema', null)) + schemasService.setup(x => x.getSchema('my-app', 'my-schema')) .returns(() => Observable.of(schema)); const router = new RouterMockup(); diff --git a/src/Squidex/app/shared/guards/resolve-schema.guard.ts b/src/Squidex/app/shared/guards/resolve-schema.guard.ts index 293f1ca92..3fbe17889 100644 --- a/src/Squidex/app/shared/guards/resolve-schema.guard.ts +++ b/src/Squidex/app/shared/guards/resolve-schema.guard.ts @@ -27,7 +27,7 @@ export class ResolveSchemaGuard implements Resolve { } const result = - this.schemasService.getSchema(appName, schemaName, null).toPromise() + this.schemasService.getSchema(appName, schemaName).toPromise() .then(dto => { if (!dto) { this.router.navigate(['/404']); @@ -51,7 +51,7 @@ export class ResolveSchemaGuard implements Resolve { while (route) { result = route.params[name]; - if (result) { + if (result || !route.parent) { break; } diff --git a/src/Squidex/app/shared/services/app-clients.service.ts b/src/Squidex/app/shared/services/app-clients.service.ts index cac70d755..2b265091e 100644 --- a/src/Squidex/app/shared/services/app-clients.service.ts +++ b/src/Squidex/app/shared/services/app-clients.service.ts @@ -54,7 +54,7 @@ export class AppClientsService { ) { } - public getClients(appName: string, version: Version): Observable { + public getClients(appName: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/clients`); return this.authService.authGet(url, version) @@ -72,7 +72,7 @@ export class AppClientsService { .catchError('Failed to load clients. Please reload.'); } - public postClient(appName: string, dto: CreateAppClientDto, version: Version): Observable { + public postClient(appName: string, dto: CreateAppClientDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/clients`); return this.authService.authPost(url, dto, version) @@ -86,14 +86,14 @@ export class AppClientsService { .catchError('Failed to add client. Please reload.'); } - public updateClient(appName: string, id: string, dto: UpdateAppClientDto, version: Version): Observable { + public updateClient(appName: string, id: string, dto: UpdateAppClientDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/clients/${id}`); return this.authService.authPut(url, dto, version) .catchError('Failed to revoke client. Please reload.'); } - public deleteClient(appName: string, id: string, version: Version): Observable { + public deleteClient(appName: string, id: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/clients/${id}`); return this.authService.authDelete(url, version) diff --git a/src/Squidex/app/shared/services/app-contributors.service.ts b/src/Squidex/app/shared/services/app-contributors.service.ts index 229db6446..1bf5a3051 100644 --- a/src/Squidex/app/shared/services/app-contributors.service.ts +++ b/src/Squidex/app/shared/services/app-contributors.service.ts @@ -29,7 +29,7 @@ export class AppContributorsService { ) { } - public getContributors(appName: string, version: Version): Observable { + public getContributors(appName: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/contributors`); return this.authService.authGet(url, version) @@ -46,14 +46,14 @@ export class AppContributorsService { .catchError('Failed to load contributors. Please reload.'); } - public postContributor(appName: string, dto: AppContributorDto, version: Version): Observable { + public postContributor(appName: string, dto: AppContributorDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/contributors`); return this.authService.authPost(url, dto, version) .catchError('Failed to add contributors. Please reload.'); } - public deleteContributor(appName: string, contributorId: string, version: Version): Observable { + public deleteContributor(appName: string, contributorId: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/contributors/${contributorId}`); return this.authService.authDelete(url, version) diff --git a/src/Squidex/app/shared/services/app-languages.service.ts b/src/Squidex/app/shared/services/app-languages.service.ts index f0324db1d..0077be52f 100644 --- a/src/Squidex/app/shared/services/app-languages.service.ts +++ b/src/Squidex/app/shared/services/app-languages.service.ts @@ -44,7 +44,7 @@ export class AppLanguagesService { ) { } - public getLanguages(appName: string, version: Version): Observable { + public getLanguages(appName: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/languages`); return this.authService.authGet(url, version) @@ -62,7 +62,7 @@ export class AppLanguagesService { .catchError('Failed to load languages. Please reload.'); } - public postLanguages(appName: string, dto: AddAppLanguageDto, version: Version): Observable { + public postLanguages(appName: string, dto: AddAppLanguageDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/languages`); return this.authService.authPost(url, dto, version) @@ -76,14 +76,14 @@ export class AppLanguagesService { .catchError('Failed to add language. Please reload.'); } - public updateLanguage(appName: string, languageCode: string, dto: UpdateAppLanguageDto, version: Version): Observable { + public updateLanguage(appName: string, languageCode: string, dto: UpdateAppLanguageDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/languages/${languageCode}`); return this.authService.authPut(url, dto, version) .catchError('Failed to change language. Please reload.'); } - public deleteLanguage(appName: string, languageCode: string, version: Version): Observable { + public deleteLanguage(appName: string, languageCode: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/languages/${languageCode}`); return this.authService.authDelete(url, version) diff --git a/src/Squidex/app/shared/services/assets.service.spec.ts b/src/Squidex/app/shared/services/assets.service.spec.ts index c01f9432c..6bf197216 100644 --- a/src/Squidex/app/shared/services/assets.service.spec.ts +++ b/src/Squidex/app/shared/services/assets.service.spec.ts @@ -37,7 +37,7 @@ describe('AssetsService', () => { } }; - progressHttp = Mock.ofInstance(new ProgressHttp(null, null, factory, null)); + progressHttp = Mock.ofInstance(new ProgressHttp(null!, null!, factory, null!)); progressHttp.setup(x => x.withUploadProgressListener(It.isAny())).returns(() => progressHttp.object); authService = Mock.ofType(AuthService); @@ -90,7 +90,7 @@ describe('AssetsService', () => { let assets: AssetsDto | null = null; - assetsService.getAssets('my-app', 17, 13, null, null, null).subscribe(result => { + assetsService.getAssets('my-app', 17, 13).subscribe(result => { assets = result; }).unsubscribe(); @@ -151,7 +151,7 @@ describe('AssetsService', () => { let assets: AssetDto | null = null; - assetsService.getAsset('my-app', '123', null).subscribe(result => { + assetsService.getAsset('my-app', '123').subscribe(result => { assets = result; }).unsubscribe(); @@ -188,7 +188,7 @@ describe('AssetsService', () => { let assets: AssetsDto | null = null; - assetsService.getAssets('my-app', 17, 13, 'my-query', null, null).subscribe(result => { + assetsService.getAssets('my-app', 17, 13, 'my-query').subscribe(result => { assets = result; }).unsubscribe(); @@ -211,7 +211,7 @@ describe('AssetsService', () => { let assets: AssetsDto | null = null; - assetsService.getAssets('my-app', 17, 13, null, ['text/plain', 'image/png'], null).subscribe(result => { + assetsService.getAssets('my-app', 17, 13, undefined, ['text/plain', 'image/png']).subscribe(result => { assets = result; }).unsubscribe(); @@ -234,7 +234,7 @@ describe('AssetsService', () => { let assets: AssetsDto | null = null; - assetsService.getAssets('my-app', 17, 13, null, null, ['12', '23']).subscribe(result => { + assetsService.getAssets('my-app', 17, 13, undefined, undefined, ['12', '23']).subscribe(result => { assets = result; }).unsubscribe(); @@ -264,7 +264,7 @@ describe('AssetsService', () => { let asset: AssetCreatedDto | null = null; - assetsService.uploadFile('my-app', null).subscribe(result => { + assetsService.uploadFile('my-app', null!).subscribe(result => { asset = result; }); @@ -303,7 +303,7 @@ describe('AssetsService', () => { let asset: AssetReplacedDto | null = null; - assetsService.replaceFile('my-app', '123', null, version).subscribe(result => { + assetsService.replaceFile('my-app', '123', null!, version).subscribe(result => { asset = result; }); diff --git a/src/Squidex/app/shared/services/assets.service.ts b/src/Squidex/app/shared/services/assets.service.ts index 7d2e69731..a48b64517 100644 --- a/src/Squidex/app/shared/services/assets.service.ts +++ b/src/Squidex/app/shared/services/assets.service.ts @@ -89,7 +89,7 @@ export class AssetsService { ) { } - public getAssets(appName: string, take: number, skip: number, query: string, mimeTypes: string[], ids: string[]): Observable { + public getAssets(appName: string, take: number, skip: number, query?: string, mimeTypes?: string[], ids?: string[]): Observable { let queries: string[] = []; if (mimeTypes && mimeTypes.length > 0) { @@ -142,7 +142,7 @@ export class AssetsService { const content = new FormData(); const headers = new Headers({ - 'Authorization': `${this.authService.user.user.token_type} ${this.authService.user.user.access_token}` + 'Authorization': `${this.authService.user!.user.token_type} ${this.authService.user!.user.access_token}` }); content.append('file', file); @@ -173,7 +173,7 @@ export class AssetsService { }); } - public getAsset(appName: string, id: string, version: Version): Observable { + public getAsset(appName: string, id: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/${id}`); return this.authService.authGet(url) @@ -203,7 +203,7 @@ export class AssetsService { const content = new FormData(); const headers = new Headers({ - 'Authorization': `${this.authService.user.user.token_type} ${this.authService.user.user.access_token}` + 'Authorization': `${this.authService.user!.user.token_type} ${this.authService.user!.user.access_token}` }); if (version && version.value.length > 0) { @@ -236,14 +236,14 @@ export class AssetsService { }); } - public putAsset(appName: string, id: string, dto: UpdateAssetDto, version: Version): Observable { + public putAsset(appName: string, id: string, dto: UpdateAssetDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/${id}`); return this.authService.authPut(url, dto, version) .catchError('Failed to delete asset. Please reload.'); } - public deleteAsset(appName: string, id: string, version: Version): Observable { + public deleteAsset(appName: string, id: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/${id}`); return this.authService.authDelete(url, version) diff --git a/src/Squidex/app/shared/services/auth.service.ts b/src/Squidex/app/shared/services/auth.service.ts index 37c51848d..e572131aa 100644 --- a/src/Squidex/app/shared/services/auth.service.ts +++ b/src/Squidex/app/shared/services/auth.service.ts @@ -196,7 +196,7 @@ export class AuthService { private checkResponse(responseStream: Observable, version?: Version) { return responseStream .do((response: Response) => { - if (version && response.status.toString().indexOf('2') === 0) { + if (version && response.status.toString().indexOf('2') === 0 && response.headers) { const etag = response.headers.get('etag'); if (etag) { diff --git a/src/Squidex/app/shared/services/contents.service.spec.ts b/src/Squidex/app/shared/services/contents.service.spec.ts index 7f8ee4b09..6455d1efc 100644 --- a/src/Squidex/app/shared/services/contents.service.spec.ts +++ b/src/Squidex/app/shared/services/contents.service.spec.ts @@ -63,7 +63,7 @@ describe('ContentsService', () => { let contents: ContentsDto | null = null; - contentsService.getContents('my-app', 'my-schema', 17, 13, null).subscribe(result => { + contentsService.getContents('my-app', 'my-schema', 17, 13).subscribe(result => { contents = result; }).unsubscribe(); diff --git a/src/Squidex/app/shared/services/contents.service.ts b/src/Squidex/app/shared/services/contents.service.ts index c99f5b3d9..255f34e82 100644 --- a/src/Squidex/app/shared/services/contents.service.ts +++ b/src/Squidex/app/shared/services/contents.service.ts @@ -48,7 +48,7 @@ export class ContentsService { ) { } - public getContents(appName: string, schemaName: string, take: number, skip: number, query: string): Observable { + public getContents(appName: string, schemaName: string, take: number, skip: number, query?: string): Observable { let fullQuery = query ? query.trim() : ''; if (fullQuery.length > 0) { @@ -91,7 +91,7 @@ export class ContentsService { .catchError('Failed to load contents. Please reload.'); } - public getContent(appName: string, schemaName: string, id: string, version: Version): Observable { + public getContent(appName: string, schemaName: string, id: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}?hidden=true`); return this.authService.authGet(url, version) @@ -110,7 +110,7 @@ export class ContentsService { .catchError('Failed to load content. Please reload.'); } - public postContent(appName: string, schemaName: string, dto: any, publish: boolean, version: Version): Observable { + public postContent(appName: string, schemaName: string, dto: any, publish: boolean, version?: Version): Observable { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}?publish=${publish}`); return this.authService.authPost(url, dto, version) @@ -129,28 +129,28 @@ export class ContentsService { .catchError('Failed to create content. Please reload.'); } - public putContent(appName: string, schemaName: string, id: string, dto: any, version: Version): Observable { + public putContent(appName: string, schemaName: string, id: string, dto: any, version?: Version): Observable { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}`); return this.authService.authPut(url, dto, version) .catchError('Failed to update content. Please reload.'); } - public publishContent(appName: string, schemaName: string, id: string, version: Version): Observable { + public publishContent(appName: string, schemaName: string, id: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}/publish`); return this.authService.authPut(url, {}, version) .catchError('Failed to publish content. Please reload.'); } - public unpublishContent(appName: string, schemaName: string, id: string, version: Version): Observable { + public unpublishContent(appName: string, schemaName: string, id: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}/unpublish`); return this.authService.authPut(url, {}, version) .catchError('Failed to unpublish content. Please reload.'); } - public deleteContent(appName: string, schemaName: string, id: string, version: Version): Observable { + public deleteContent(appName: string, schemaName: string, id: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}`); return this.authService.authDelete(url, version) diff --git a/src/Squidex/app/shared/services/schemas.service.ts b/src/Squidex/app/shared/services/schemas.service.ts index 6e5b37c6d..fe6a7d7d7 100644 --- a/src/Squidex/app/shared/services/schemas.service.ts +++ b/src/Squidex/app/shared/services/schemas.service.ts @@ -113,9 +113,9 @@ export class FieldDto { export abstract class FieldPropertiesDto { constructor( public readonly fieldType: string, - public readonly label: string, - public readonly hints: string, - public readonly placeholder: string, + public readonly label: string | undefined, + public readonly hints: string | undefined, + public readonly placeholder: string | undefined, public readonly isRequired: boolean, public readonly isListField: boolean, public readonly isLocalizable: boolean @@ -275,7 +275,7 @@ export class SchemasService { .catchError('Failed to load schemas. Please reload.'); } - public getSchema(appName: string, id: string, version: Version): Observable { + public getSchema(appName: string, id: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${id}`); return this.authService.authGet(url) @@ -311,7 +311,7 @@ export class SchemasService { .catchError('Failed to load schema. Please reload.'); } - public postSchema(appName: string, dto: CreateSchemaDto, version: Version): Observable { + public postSchema(appName: string, dto: CreateSchemaDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas`); return this.authService.authPost(url, dto, version) @@ -322,7 +322,7 @@ export class SchemasService { .catchError('Failed to create schema. Please reload.'); } - public postField(appName: string, schemaName: string, dto: AddFieldDto, version: Version): Observable { + public postField(appName: string, schemaName: string, dto: AddFieldDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields`); return this.authService.authPost(url, dto, version) @@ -333,77 +333,77 @@ export class SchemasService { .catchError('Failed to add field. Please reload.'); } - public putSchema(appName: string, schemaName: string, dto: UpdateSchemaDto, version: Version): Observable { + public putSchema(appName: string, schemaName: string, dto: UpdateSchemaDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}`); return this.authService.authPut(url, dto, version) .catchError('Failed to update schema. Please reload.'); } - public putFieldOrdering(appName: string, schemaName: string, dto: number[], version: Version): Observable { + public putFieldOrdering(appName: string, schemaName: string, dto: number[], version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/ordering`); return this.authService.authPut(url, { fieldIds: dto }, version) .catchError('Failed to reorder fields. Please reload.'); } - public publishSchema(appName: string, schemaName: string, version: Version): Observable { + public publishSchema(appName: string, schemaName: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/publish`); return this.authService.authPut(url, {}, version) .catchError('Failed to publish schema. Please reload.'); } - public unpublishSchema(appName: string, schemaName: string, version: Version): Observable { + public unpublishSchema(appName: string, schemaName: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/unpublish`); return this.authService.authPut(url, {}, version) .catchError('Failed to unpublish schema. Please reload.'); } - public putField(appName: string, schemaName: string, fieldId: number, dto: UpdateFieldDto, version: Version): Observable { + public putField(appName: string, schemaName: string, fieldId: number, dto: UpdateFieldDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}`); return this.authService.authPut(url, dto, version) .catchError('Failed to update field. Please reload.'); } - public enableField(appName: string, schemaName: string, fieldId: number, version: Version): Observable { + public enableField(appName: string, schemaName: string, fieldId: number, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/enable`); return this.authService.authPut(url, {}, version) .catchError('Failed to enable field. Please reload.'); } - public disableField(appName: string, schemaName: string, fieldId: number, version: Version): Observable { + public disableField(appName: string, schemaName: string, fieldId: number, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/disable`); return this.authService.authPut(url, {}, version) .catchError('Failed to disable field. Please reload.'); } - public showField(appName: string, schemaName: string, fieldId: number, version: Version): Observable { + public showField(appName: string, schemaName: string, fieldId: number, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/show`); return this.authService.authPut(url, {}, version) .catchError('Failed to show field. Please reload.'); } - public hideField(appName: string, schemaName: string, fieldId: number, version: Version): Observable { + public hideField(appName: string, schemaName: string, fieldId: number, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}/hide`); return this.authService.authPut(url, {}, version) .catchError('Failed to hide field. Please reload.'); } - public deleteField(appName: string, schemaName: string, fieldId: number, version: Version): Observable { + public deleteField(appName: string, schemaName: string, fieldId: number, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/fields/${fieldId}`); return this.authService.authDelete(url, version) .catchError('Failed to delete field. Please reload.'); } - public deleteSchema(appName: string, schemaName: string, version: Version): Observable { + public deleteSchema(appName: string, schemaName: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}`); return this.authService.authDelete(url, version) diff --git a/src/Squidex/app/shared/services/users.service.ts b/src/Squidex/app/shared/services/users.service.ts index b0e287eb3..6b2688086 100644 --- a/src/Squidex/app/shared/services/users.service.ts +++ b/src/Squidex/app/shared/services/users.service.ts @@ -26,7 +26,7 @@ export class UserDto { public readonly id: string, public readonly email: string, public readonly displayName: string, - public readonly pictureUrl: string, + public readonly pictureUrl: string | null, public readonly isLocked: boolean ) { } diff --git a/src/Squidex/app/theme/_vars.scss b/src/Squidex/app/theme/_vars.scss index f4f1e443b..e21fc5a77 100644 --- a/src/Squidex/app/theme/_vars.scss +++ b/src/Squidex/app/theme/_vars.scss @@ -59,4 +59,6 @@ $size-sidebar-width: 7rem; $panel-padding: 1.5rem; $panel-header: 5.4rem; $panel-sidebar: 3.75rem; -$panel-light-background: #fff; \ No newline at end of file +$panel-light-background: #fff; + +$asset-height: 13rem; \ No newline at end of file diff --git a/src/Squidex/package.json b/src/Squidex/package.json index 977c0dd42..ffdb3bf09 100644 --- a/src/Squidex/package.json +++ b/src/Squidex/package.json @@ -15,15 +15,15 @@ "build:clean": "rimraf wwwroot/build" }, "dependencies": { - "@angular/animations": "4.0.2", - "@angular/common": "4.0.2", - "@angular/compiler": "4.0.2", - "@angular/core": "4.0.2", - "@angular/forms": "4.0.2", - "@angular/http": "4.0.2", - "@angular/platform-browser": "4.0.2", - "@angular/platform-browser-dynamic": "4.0.2", - "@angular/router": "4.0.2", + "@angular/animations": "4.1.0", + "@angular/common": "4.1.0", + "@angular/compiler": "4.1.0", + "@angular/core": "4.1.0", + "@angular/forms": "4.1.0", + "@angular/http": "4.1.0", + "@angular/platform-browser": "4.1.0", + "@angular/platform-browser-dynamic": "4.1.0", + "@angular/router": "4.1.0", "angular-progress-http": "0.5.0", "babel-polyfill": "6.23.0", "bootstrap": "4.0.0-alpha.6", @@ -36,11 +36,11 @@ "progressbar.js": "1.0.1", "redoc": "1.14.0", "rxjs": "5.3.0", - "zone.js": "0.8.8" + "zone.js": "0.8.9" }, "devDependencies": { - "@angular/compiler-cli": "4.0.2", - "@angular/tsc-wrapped": "4.0.2", + "@angular/compiler-cli": "4.1.0", + "@angular/tsc-wrapped": "4.1.0", "@ngtools/webpack": "1.3.1", "@types/core-js": "0.9.35", "@types/jasmine": "2.5.43", @@ -79,7 +79,7 @@ "tslint": "4.5.1", "tslint-loader": "3.5.3", "typemoq": "1.5.0", - "typescript": "2.2.2", + "typescript": "2.3.1", "underscore": "1.8.3", "webpack": "2.4.1", "webpack-dev-server": "2.4.5",