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 @@
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}}
+
-
+
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",