diff --git a/frontend/app/features/administration/administration-area.component.html b/frontend/app/features/administration/administration-area.component.html index 0c1fa7eee..295d1ae8d 100644 --- a/frontend/app/features/administration/administration-area.component.html +++ b/frontend/app/features/administration/administration-area.component.html @@ -2,16 +2,16 @@ \ No newline at end of file diff --git a/frontend/app/features/apps/pages/app.component.ts b/frontend/app/features/apps/pages/app.component.ts index f5efe63d8..be3830096 100644 --- a/frontend/app/features/apps/pages/app.component.ts +++ b/frontend/app/features/apps/pages/app.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; -import { AppDto, fadeAnimation, ModalModel } from '@app/shared'; +import { AppDto, ModalModel } from '@app/shared'; @Component({ selector: 'sqx-app[app]', styleUrls: ['./app.component.scss'], templateUrl: './app.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppComponent { diff --git a/frontend/app/features/apps/pages/onboarding-dialog.component.html b/frontend/app/features/apps/pages/onboarding-dialog.component.html index f2c0ec95a..4a669bc6b 100644 --- a/frontend/app/features/apps/pages/onboarding-dialog.component.html +++ b/frontend/app/features/apps/pages/onboarding-dialog.component.html @@ -8,7 +8,7 @@

{{ 'tour.welcome' | sqxTranslate }} {{ 'tour.welcomeProduct' | sqxTranslate }}

-
+
@@ -19,7 +19,7 @@
-
+
@@ -37,7 +37,7 @@
-
+
@@ -55,7 +55,7 @@
-
+
@@ -73,7 +73,7 @@
-
+
@@ -91,7 +91,7 @@ diff --git a/frontend/app/features/content/pages/content/content-history-page.component.ts b/frontend/app/features/content/pages/content/content-history-page.component.ts index d751377ea..3df215c29 100644 --- a/frontend/app/features/content/pages/content/content-history-page.component.ts +++ b/frontend/app/features/content/pages/content/content-history-page.component.ts @@ -6,7 +6,7 @@ */ import { Component, OnInit, ViewChild } from '@angular/core'; -import { AppsState, ContentDto, ContentsState, defined, fadeAnimation, HistoryEventDto, HistoryService, ModalModel, ResourceOwner, SchemasState, switchSafe } from '@app/shared'; +import { AppsState, ContentDto, ContentsState, defined, HistoryEventDto, HistoryService, ModalModel, ResourceOwner, SchemasState, switchSafe } from '@app/shared'; import { Observable, timer } from 'rxjs'; import { map } from 'rxjs/operators'; import { DueTimeSelectorComponent } from './../../shared/due-time-selector.component'; @@ -16,9 +16,6 @@ import { ContentPageComponent } from './content-page.component'; selector: 'sqx-history', styleUrls: ['./content-history-page.component.scss'], templateUrl: './content-history-page.component.html', - animations: [ - fadeAnimation, - ], }) export class ContentHistoryPageComponent extends ResourceOwner implements OnInit { @ViewChild('dueTimeSelector', { static: false }) diff --git a/frontend/app/features/content/pages/content/content-page.component.html b/frontend/app/features/content/pages/content/content-page.component.html index 69bc38342..24a25d656 100644 --- a/frontend/app/features/content/pages/content/content-page.component.html +++ b/frontend/app/features/content/pages/content/content-page.component.html @@ -65,7 +65,7 @@ - + diff --git a/frontend/app/features/content/pages/content/content-page.component.ts b/frontend/app/features/content/pages/content/content-page.component.ts index 8bb646064..112a22425 100644 --- a/frontend/app/features/content/pages/content/content-page.component.ts +++ b/frontend/app/features/content/pages/content/content-page.component.ts @@ -7,7 +7,7 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { ApiUrlConfig, AppLanguageDto, AppsState, AuthService, AutoSaveKey, AutoSaveService, CanComponentDeactivate, ContentDto, ResolveContents, ContentsState, defined, DialogService, EditContentForm, fadeAnimation, LanguagesState, ModalModel, ResourceOwner, SchemaDto, SchemasState, TempService, ToolbarService, Types, Version, ResolveAssets } from '@app/shared'; +import { ApiUrlConfig, AppLanguageDto, AppsState, AuthService, AutoSaveKey, AutoSaveService, CanComponentDeactivate, ContentDto, ResolveContents, ContentsState, defined, DialogService, EditContentForm, LanguagesState, ModalModel, ResourceOwner, SchemaDto, SchemasState, TempService, ToolbarService, Types, Version, ResolveAssets } from '@app/shared'; import { Observable, of } from 'rxjs'; import { filter, map, tap } from 'rxjs/operators'; @@ -15,9 +15,6 @@ import { filter, map, tap } from 'rxjs/operators'; selector: 'sqx-content-page', styleUrls: ['./content-page.component.scss'], templateUrl: './content-page.component.html', - animations: [ - fadeAnimation, - ], providers: [ ResolveAssets, ResolveContents, diff --git a/frontend/app/features/content/pages/content/editor/content-editor.component.html b/frontend/app/features/content/pages/content/editor/content-editor.component.html index 98ee73d6f..d296ab077 100644 --- a/frontend/app/features/content/pages/content/editor/content-editor.component.html +++ b/frontend/app/features/content/pages/content/editor/content-editor.component.html @@ -7,7 +7,7 @@ {{ 'contents.viewLatest' | sqxTranslate }}
-
+
diff --git a/frontend/app/features/content/pages/content/editor/content-section.component.html b/frontend/app/features/content/pages/content/editor/content-section.component.html index afe805f96..23a5093e6 100644 --- a/frontend/app/features/content/pages/content/editor/content-section.component.html +++ b/frontend/app/features/content/pages/content/editor/content-section.component.html @@ -10,7 +10,7 @@

{{separator.displayName}}

- +
diff --git a/frontend/app/features/content/pages/content/editor/field-copy-button.component.html b/frontend/app/features/content/pages/content/editor/field-copy-button.component.html index 22aac33ca..8d7054241 100644 --- a/frontend/app/features/content/pages/content/editor/field-copy-button.component.html +++ b/frontend/app/features/content/pages/content/editor/field-copy-button.component.html @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/frontend/app/features/content/pages/content/editor/field-copy-button.component.ts b/frontend/app/features/content/pages/content/editor/field-copy-button.component.ts index d0f99d505..6954dfbc5 100644 --- a/frontend/app/features/content/pages/content/editor/field-copy-button.component.ts +++ b/frontend/app/features/content/pages/content/editor/field-copy-button.component.ts @@ -6,15 +6,12 @@ */ import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; -import { AppLanguageDto, fadeAnimation, FieldForm, ModalModel } from '@app/shared'; +import { AppLanguageDto, FieldForm, ModalModel } from '@app/shared'; @Component({ selector: 'sqx-field-copy-button[formModel][languages]', styleUrls: ['./field-copy-button.component.scss'], templateUrl: './field-copy-button.component.html', - animations: [ - fadeAnimation, - ], }) export class FieldCopyButtonComponent implements OnChanges { @Input() diff --git a/frontend/app/features/content/pages/contents/contents-page.component.html b/frontend/app/features/content/pages/contents/contents-page.component.html index 4325facd9..a8d951a01 100644 --- a/frontend/app/features/content/pages/contents/contents-page.component.html +++ b/frontend/app/features/content/pages/contents/contents-page.component.html @@ -62,13 +62,13 @@ - +
diff --git a/frontend/app/features/content/pages/contents/contents-page.component.ts b/frontend/app/features/content/pages/contents/contents-page.component.ts index 5eb386160..5dacf225e 100644 --- a/frontend/app/features/content/pages/contents/contents-page.component.ts +++ b/frontend/app/features/content/pages/contents/contents-page.component.ts @@ -9,7 +9,7 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { AppLanguageDto, AppsState, ContentDto, ContentsState, ContributorsState, defined, fadeAnimation, LanguagesState, ModalModel, Queries, Query, queryModelFromSchema, QuerySynchronizer, ResourceOwner, Router2State, SchemaDto, SchemasState, switchSafe, TableFields, TempService, UIState } from '@app/shared'; +import { AppLanguageDto, AppsState, ContentDto, ContentsState, ContributorsState, defined, LanguagesState, ModalModel, Queries, Query, queryModelFromSchema, QuerySynchronizer, ResourceOwner, Router2State, SchemaDto, SchemasState, switchSafe, TableFields, TempService, UIState } from '@app/shared'; import { combineLatest } from 'rxjs'; import { distinctUntilChanged, map, switchMap, take, tap } from 'rxjs/operators'; import { DueTimeSelectorComponent } from './../../shared/due-time-selector.component'; @@ -21,9 +21,6 @@ import { DueTimeSelectorComponent } from './../../shared/due-time-selector.compo providers: [ Router2State, ], - animations: [ - fadeAnimation, - ], }) export class ContentsPageComponent extends ResourceOwner implements OnInit { @ViewChild('dueTimeSelector', { static: false }) diff --git a/frontend/app/features/content/shared/forms/array-editor.component.html b/frontend/app/features/content/shared/forms/array-editor.component.html index b5a68ccaf..e337944ae 100644 --- a/frontend/app/features/content/shared/forms/array-editor.component.html +++ b/frontend/app/features/content/shared/forms/array-editor.component.html @@ -74,11 +74,11 @@ - + diff --git a/frontend/app/features/content/shared/forms/array-editor.component.ts b/frontend/app/features/content/shared/forms/array-editor.component.ts index 2ac0135d0..9cde50447 100644 --- a/frontend/app/features/content/shared/forms/array-editor.component.ts +++ b/frontend/app/features/content/shared/forms/array-editor.component.ts @@ -6,8 +6,8 @@ */ import { CdkDragDrop } from '@angular/cdk/drag-drop'; -import { ChangeDetectionStrategy, Component, Input, OnChanges, QueryList, SimpleChanges, ViewChildren } from '@angular/core'; -import { AppLanguageDto, ComponentsFieldPropertiesDto, disabled$, EditContentForm, fadeAnimation, FieldArrayForm, LocalStoreService, ModalModel, ObjectFormBase, SchemaDto, Settings, sorted, Types } from '@app/shared'; +import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, QueryList, SimpleChanges, ViewChildren } from '@angular/core'; +import { AppLanguageDto, ComponentsFieldPropertiesDto, disabled$, EditContentForm, FieldArrayForm, LocalStoreService, ModalModel, ObjectFormBase, SchemaDto, Settings, sorted, Types } from '@app/shared'; import { combineLatest, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { ArrayItemComponent } from './array-item.component'; @@ -17,11 +17,8 @@ import { ArrayItemComponent } from './array-item.component'; styleUrls: ['./array-editor.component.scss'], templateUrl: './array-editor.component.html', changeDetection: ChangeDetectionStrategy.OnPush, - animations: [ - fadeAnimation, - ], }) -export class ArrayEditorComponent implements OnChanges { +export class ArrayEditorComponent implements OnChanges, OnInit { @Input() public form: EditContentForm; @@ -65,6 +62,10 @@ export class ArrayEditorComponent implements OnChanges { ) { } + public ngOnInit() { + this.isCollapsedInitial = this.formLevel > 0; + } + public ngOnChanges(changes: SimpleChanges) { if (changes['formModel']) { const maxItems = this.formModel.field.properties['maxItems'] || Number.MAX_VALUE; @@ -84,7 +85,9 @@ export class ArrayEditorComponent implements OnChanges { return disabled || items.length >= maxItems; })); - this.isCollapsedInitial = this.formLevel > 0 || this.localStore.getBoolean(this.expandedKey()); + if (this.formLevel === 0) { + this.isCollapsedInitial = this.localStore.getBoolean(this.expandedKey()); + } } } @@ -125,7 +128,9 @@ export class ArrayEditorComponent implements OnChanges { child.collapse(); }); - this.localStore.setBoolean(this.expandedKey(), true); + if (this.formLevel === 0) { + this.localStore.setBoolean(this.expandedKey(), true); + } } public expandAll() { @@ -133,7 +138,9 @@ export class ArrayEditorComponent implements OnChanges { child.expand(); }); - this.localStore.setBoolean(this.expandedKey(), false); + if (this.formLevel === 0) { + this.localStore.setBoolean(this.expandedKey(), false); + } } private reset() { diff --git a/frontend/app/features/content/shared/forms/array-item.component.html b/frontend/app/features/content/shared/forms/array-item.component.html index 0378ca05e..5b37e9629 100644 --- a/frontend/app/features/content/shared/forms/array-item.component.html +++ b/frontend/app/features/content/shared/forms/array-item.component.html @@ -23,10 +23,10 @@ - -
@@ -42,7 +42,7 @@
-
+
implements OnCh constructor(changeDetector: ChangeDetectorRef, ) { super(changeDetector, { - isCollapsed: false, + isExpanded: false, + isExpandedOnce: false, }); } public ngOnInit() { - this.next({ isCollapsed: this.isCollapsedInitial }); + if (!this.isCollapsedInitial) { + this.expand(); + } } public ngOnChanges(changes: SimpleChanges) { @@ -103,11 +109,11 @@ export class ArrayItemComponent extends StatefulComponent implements OnCh } public collapse() { - this.next({ isCollapsed: true }); + this.next({ isExpanded: false }); } public expand() { - this.next({ isCollapsed: false }); + this.next({ isExpanded: true, isExpandedOnce: true }); } public moveTop() { diff --git a/frontend/app/features/content/shared/forms/component-section.component.html b/frontend/app/features/content/shared/forms/component-section.component.html index d1f58b8dd..f4043debb 100644 --- a/frontend/app/features/content/shared/forms/component-section.component.html +++ b/frontend/app/features/content/shared/forms/component-section.component.html @@ -3,7 +3,7 @@

{{separator!.displayName}}

- +
diff --git a/frontend/app/features/content/shared/forms/component.component.html b/frontend/app/features/content/shared/forms/component.component.html index 4651c8c5f..ab84b7d80 100644 --- a/frontend/app/features/content/shared/forms/component.component.html +++ b/frontend/app/features/content/shared/forms/component.component.html @@ -24,11 +24,11 @@ - + diff --git a/frontend/app/features/content/shared/forms/component.component.ts b/frontend/app/features/content/shared/forms/component.component.ts index e7e3c06d4..9647f4672 100644 --- a/frontend/app/features/content/shared/forms/component.component.ts +++ b/frontend/app/features/content/shared/forms/component.component.ts @@ -6,7 +6,7 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, QueryList, SimpleChanges, ViewChildren } from '@angular/core'; -import { AppLanguageDto, ComponentFieldPropertiesDto, ComponentForm, EditContentForm, fadeAnimation, FieldDto, FieldSection, ModalModel, ResourceOwner, SchemaDto, Types } from '@app/shared'; +import { AppLanguageDto, ComponentFieldPropertiesDto, ComponentForm, EditContentForm, FieldDto, FieldSection, ModalModel, ResourceOwner, SchemaDto, Types } from '@app/shared'; import { ComponentSectionComponent } from './component-section.component'; @Component({ @@ -14,9 +14,6 @@ import { ComponentSectionComponent } from './component-section.component'; styleUrls: ['./component.component.scss'], templateUrl: './component.component.html', changeDetection: ChangeDetectionStrategy.OnPush, - animations: [ - fadeAnimation, - ], }) export class ComponentComponent extends ResourceOwner implements OnChanges { @Input() diff --git a/frontend/app/features/content/shared/forms/field-editor.component.html b/frontend/app/features/content/shared/forms/field-editor.component.html index 210123f16..9c1242a08 100644 --- a/frontend/app/features/content/shared/forms/field-editor.component.html +++ b/frontend/app/features/content/shared/forms/field-editor.component.html @@ -225,6 +225,6 @@
- +
diff --git a/frontend/app/features/content/shared/list/content.component.html b/frontend/app/features/content/shared/list/content.component.html index 0b84d980b..e80fdf9c4 100644 --- a/frontend/app/features/content/shared/list/content.component.html +++ b/frontend/app/features/content/shared/list/content.component.html @@ -27,7 +27,7 @@ - + diff --git a/frontend/app/features/content/shared/list/content.component.ts b/frontend/app/features/content/shared/list/content.component.ts index bb921ceef..f54d4cd12 100644 --- a/frontend/app/features/content/shared/list/content.component.ts +++ b/frontend/app/features/content/shared/list/content.component.ts @@ -6,7 +6,7 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, QueryList, SimpleChanges, ViewChildren } from '@angular/core'; -import { AppLanguageDto, ContentDto, ContentListFieldComponent, ContentsState, fadeAnimation, ModalModel, PatchContentForm, RootFieldDto, TableField, Types } from '@app/shared'; +import { AppLanguageDto, ContentDto, ContentListFieldComponent, ContentsState, ModalModel, PatchContentForm, RootFieldDto, TableField, Types } from '@app/shared'; /* tslint:disable: component-selector */ @@ -14,9 +14,6 @@ import { AppLanguageDto, ContentDto, ContentListFieldComponent, ContentsState, f selector: '[sqxContent][language][listFields]', styleUrls: ['./content.component.scss'], templateUrl: './content.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentComponent implements OnChanges { diff --git a/frontend/app/features/content/shared/preview-button.component.html b/frontend/app/features/content/shared/preview-button.component.html index 0b917d648..f14b10c3c 100644 --- a/frontend/app/features/content/shared/preview-button.component.html +++ b/frontend/app/features/content/shared/preview-button.component.html @@ -10,9 +10,9 @@ - +
diff --git a/frontend/app/features/content/shared/preview-button.component.ts b/frontend/app/features/content/shared/preview-button.component.ts index 04da7b467..018cc8fb7 100644 --- a/frontend/app/features/content/shared/preview-button.component.ts +++ b/frontend/app/features/content/shared/preview-button.component.ts @@ -6,7 +6,7 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; -import { ContentDto, fadeAnimation, interpolate, LocalStoreService, ModalModel, SchemaDto, Settings, StatefulComponent } from '@app/shared'; +import { ContentDto, interpolate, LocalStoreService, ModalModel, SchemaDto, Settings, StatefulComponent } from '@app/shared'; import { Observable } from 'rxjs'; import { take } from 'rxjs/operators'; @@ -22,9 +22,6 @@ interface State { selector: 'sqx-preview-button[content][schema]', styleUrls: ['./preview-button.component.scss'], templateUrl: './preview-button.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class PreviewButtonComponent extends StatefulComponent implements OnInit { diff --git a/frontend/app/features/content/shared/references/reference-dropdown.component.html b/frontend/app/features/content/shared/references/reference-dropdown.component.html index 28c20bd38..acaa15e61 100644 --- a/frontend/app/features/content/shared/references/reference-dropdown.component.html +++ b/frontend/app/features/content/shared/references/reference-dropdown.component.html @@ -1,5 +1,8 @@ - + + + + {{content.name}} \ No newline at end of file diff --git a/frontend/app/features/dashboard/pages/cards/api-calls-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-calls-card.component.ts index 85dfe4263..99f11cd44 100644 --- a/frontend/app/features/dashboard/pages/cards/api-calls-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-calls-card.component.ts @@ -6,16 +6,13 @@ */ import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; -import { AppDto, CallsUsageDto, fadeAnimation, UsagesService } from '@app/shared'; +import { AppDto, CallsUsageDto, UsagesService } from '@app/shared'; import { ChartHelpers, ChartOptions } from './shared'; @Component({ selector: 'sqx-api-calls-card[app][usage]', styleUrls: ['./api-calls-card.component.scss'], templateUrl: './api-calls-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiCallsCardComponent implements OnChanges { diff --git a/frontend/app/features/dashboard/pages/cards/api-calls-summary-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-calls-summary-card.component.ts index 0e2e3367d..13ae97765 100644 --- a/frontend/app/features/dashboard/pages/cards/api-calls-summary-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-calls-summary-card.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; -import { AppDto, CallsUsageDto, fadeAnimation } from '@app/shared'; +import { AppDto, CallsUsageDto } from '@app/shared'; @Component({ selector: 'sqx-api-calls-summary-card[app][usage]', styleUrls: ['./api-calls-summary-card.component.scss'], templateUrl: './api-calls-summary-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiCallsSummaryCardComponent implements OnChanges { diff --git a/frontend/app/features/dashboard/pages/cards/api-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-card.component.ts index 21222278f..127960640 100644 --- a/frontend/app/features/dashboard/pages/cards/api-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-card.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { AppDto, fadeAnimation } from '@app/shared'; +import { AppDto } from '@app/shared'; @Component({ selector: 'sqx-api-card[app]', styleUrls: ['./api-card.component.scss'], templateUrl: './api-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiCardComponent { diff --git a/frontend/app/features/dashboard/pages/cards/api-performance-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-performance-card.component.ts index 088aa7614..330fef221 100644 --- a/frontend/app/features/dashboard/pages/cards/api-performance-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-performance-card.component.ts @@ -6,16 +6,13 @@ */ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output } from '@angular/core'; -import { AppDto, CallsUsageDto, fadeAnimation } from '@app/shared'; +import { AppDto, CallsUsageDto } from '@app/shared'; import { ChartHelpers, ChartOptions } from './shared'; @Component({ selector: 'sqx-api-performance-card[app][usage]', styleUrls: ['./api-performance-card.component.scss'], templateUrl: './api-performance-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiPerformanceCardComponent implements OnChanges { diff --git a/frontend/app/features/dashboard/pages/cards/api-traffic-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-traffic-card.component.ts index 7651cb887..2e62f66f7 100644 --- a/frontend/app/features/dashboard/pages/cards/api-traffic-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-traffic-card.component.ts @@ -6,16 +6,13 @@ */ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; -import { AppDto, CallsUsageDto, fadeAnimation } from '@app/shared'; +import { AppDto, CallsUsageDto } from '@app/shared'; import { ChartHelpers, ChartOptions } from './shared'; @Component({ selector: 'sqx-api-traffic-card[app][usage]', styleUrls: ['./api-traffic-card.component.scss'], templateUrl: './api-traffic-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiTrafficCardComponent implements OnChanges { diff --git a/frontend/app/features/dashboard/pages/cards/api-traffic-summary-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-traffic-summary-card.component.ts index 8540cc8b0..a55623da9 100644 --- a/frontend/app/features/dashboard/pages/cards/api-traffic-summary-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-traffic-summary-card.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; -import { AppDto, CallsUsageDto, fadeAnimation } from '@app/shared'; +import { AppDto, CallsUsageDto } from '@app/shared'; @Component({ selector: 'sqx-api-traffic-summary-card[app][usage]', styleUrls: ['./api-traffic-summary-card.component.scss'], templateUrl: './api-traffic-summary-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiTrafficSummaryCardComponent implements OnChanges { diff --git a/frontend/app/features/dashboard/pages/cards/asset-uploads-count-card.component.ts b/frontend/app/features/dashboard/pages/cards/asset-uploads-count-card.component.ts index efe1df21d..033b9f44c 100644 --- a/frontend/app/features/dashboard/pages/cards/asset-uploads-count-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/asset-uploads-count-card.component.ts @@ -6,16 +6,13 @@ */ import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; -import { AppDto, fadeAnimation, StorageUsagePerDateDto } from '@app/shared'; +import { AppDto, StorageUsagePerDateDto } from '@app/shared'; import { ChartHelpers, ChartOptions } from './shared'; @Component({ selector: 'sqx-asset-uploads-count-card[app][usage]', styleUrls: ['./asset-uploads-count-card.component.scss'], templateUrl: './asset-uploads-count-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetUploadsCountCardComponent implements OnChanges { diff --git a/frontend/app/features/dashboard/pages/cards/asset-uploads-size-card.component.ts b/frontend/app/features/dashboard/pages/cards/asset-uploads-size-card.component.ts index 3b0fc1e2f..f5d5f93a4 100644 --- a/frontend/app/features/dashboard/pages/cards/asset-uploads-size-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/asset-uploads-size-card.component.ts @@ -6,16 +6,13 @@ */ import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; -import { AppDto, fadeAnimation, StorageUsagePerDateDto } from '@app/shared'; +import { AppDto, StorageUsagePerDateDto } from '@app/shared'; import { ChartHelpers, ChartOptions } from './shared'; @Component({ selector: 'sqx-asset-uploads-size-card[app][usage]', styleUrls: ['./asset-uploads-size-card.component.scss'], templateUrl: './asset-uploads-size-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetUploadsSizeCardComponent implements OnChanges { diff --git a/frontend/app/features/dashboard/pages/cards/asset-uploads-size-summary-card.component.ts b/frontend/app/features/dashboard/pages/cards/asset-uploads-size-summary-card.component.ts index 38e9d6657..31b95cd84 100644 --- a/frontend/app/features/dashboard/pages/cards/asset-uploads-size-summary-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/asset-uploads-size-summary-card.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; -import { AppDto, CurrentStorageDto, fadeAnimation } from '@app/shared'; +import { AppDto, CurrentStorageDto } from '@app/shared'; @Component({ selector: 'sqx-asset-uploads-size-summary-card[app][usage]', styleUrls: ['./asset-uploads-size-summary-card.component.scss'], templateUrl: './asset-uploads-size-summary-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetUploadsSizeSummaryCardComponent implements OnChanges { diff --git a/frontend/app/features/dashboard/pages/cards/content-summary-card.component.ts b/frontend/app/features/dashboard/pages/cards/content-summary-card.component.ts index a97d050af..879c7a37c 100644 --- a/frontend/app/features/dashboard/pages/cards/content-summary-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/content-summary-card.component.ts @@ -6,7 +6,7 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; -import { AppDto, ContentsService, fadeAnimation, StatefulComponent, Types } from '@app/shared'; +import { AppDto, ContentsService, StatefulComponent, Types } from '@app/shared'; interface State { // The number of items. @@ -17,9 +17,6 @@ interface State { selector: 'sqx-content-summary-card', styleUrls: ['./content-summary-card.component.scss'], templateUrl: './content-summary-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentSummaryCardComponent extends StatefulComponent implements OnInit { diff --git a/frontend/app/features/dashboard/pages/cards/github-card.component.ts b/frontend/app/features/dashboard/pages/cards/github-card.component.ts index ce49f1b4c..20747f44b 100644 --- a/frontend/app/features/dashboard/pages/cards/github-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/github-card.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { AppDto, fadeAnimation } from '@app/shared'; +import { AppDto } from '@app/shared'; @Component({ selector: 'sqx-github-card[app]', styleUrls: ['./github-card.component.scss'], templateUrl: './github-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class GithubCardComponent { diff --git a/frontend/app/features/dashboard/pages/cards/history-card.component.ts b/frontend/app/features/dashboard/pages/cards/history-card.component.ts index 8edbe775b..8c24ced77 100644 --- a/frontend/app/features/dashboard/pages/cards/history-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/history-card.component.ts @@ -6,16 +6,13 @@ */ import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; -import { AppDto, fadeAnimation, HistoryEventDto, HistoryService } from '@app/shared'; +import { AppDto, HistoryEventDto, HistoryService } from '@app/shared'; import { Observable } from 'rxjs'; @Component({ selector: 'sqx-history-card[app]', styleUrls: ['./history-card.component.scss'], templateUrl: './history-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class HistoryCardComponent implements OnChanges { diff --git a/frontend/app/features/dashboard/pages/cards/iframe-card.component.ts b/frontend/app/features/dashboard/pages/cards/iframe-card.component.ts index 973b91ada..fbea2871b 100644 --- a/frontend/app/features/dashboard/pages/cards/iframe-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/iframe-card.component.ts @@ -6,15 +6,12 @@ */ import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, ViewChild } from '@angular/core'; -import { AppDto, fadeAnimation } from '@app/shared'; +import { AppDto } from '@app/shared'; @Component({ selector: 'sqx-iframe-card[app]', styleUrls: ['./iframe-card.component.scss'], templateUrl: './iframe-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class IFrameCardComponent implements AfterViewInit { diff --git a/frontend/app/features/dashboard/pages/cards/schema-card.component.ts b/frontend/app/features/dashboard/pages/cards/schema-card.component.ts index 781687bb6..96d98b5d6 100644 --- a/frontend/app/features/dashboard/pages/cards/schema-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/schema-card.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { AppDto, fadeAnimation } from '@app/shared'; +import { AppDto } from '@app/shared'; @Component({ selector: 'sqx-schema-card[app]', styleUrls: ['./schema-card.component.scss'], templateUrl: './schema-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class SchemaCardComponent { diff --git a/frontend/app/features/dashboard/pages/cards/support-card.component.ts b/frontend/app/features/dashboard/pages/cards/support-card.component.ts index 9094d6b2a..0c6266d67 100644 --- a/frontend/app/features/dashboard/pages/cards/support-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/support-card.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { AppDto, fadeAnimation } from '@app/shared'; +import { AppDto } from '@app/shared'; @Component({ selector: 'sqx-support-card[app]', styleUrls: ['./support-card.component.scss'], templateUrl: './support-card.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class SupportCardComponent { diff --git a/frontend/app/features/dashboard/pages/dashboard-config.component.html b/frontend/app/features/dashboard/pages/dashboard-config.component.html index 6526f08cd..ed9599393 100644 --- a/frontend/app/features/dashboard/pages/dashboard-config.component.html +++ b/frontend/app/features/dashboard/pages/dashboard-config.component.html @@ -4,7 +4,7 @@ -
diff --git a/frontend/app/features/rules/pages/rules/rule.component.ts b/frontend/app/features/rules/pages/rules/rule.component.ts index dee2ed782..0ecc425ed 100644 --- a/frontend/app/features/rules/pages/rules/rule.component.ts +++ b/frontend/app/features/rules/pages/rules/rule.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { ActionsDto, fadeAnimation, ModalModel, RuleDto, RulesState, TriggersDto } from '@app/shared'; +import { ActionsDto, ModalModel, RuleDto, RulesState, TriggersDto } from '@app/shared'; @Component({ selector: 'sqx-rule[rule][ruleActions][ruleTriggers]', styleUrls: ['./rule.component.scss'], templateUrl: './rule.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class RuleComponent { diff --git a/frontend/app/features/rules/pages/rules/rules-page.component.html b/frontend/app/features/rules/pages/rules/rules-page.component.html index e895bad40..43ed1ac9e 100644 --- a/frontend/app/features/rules/pages/rules/rules-page.component.html +++ b/frontend/app/features/rules/pages/rules/rules-page.component.html @@ -52,7 +52,7 @@ - +
diff --git a/frontend/app/features/rules/shared/actions/generic-action.component.html b/frontend/app/features/rules/shared/actions/generic-action.component.html index 1d88103b6..578f7468c 100644 --- a/frontend/app/features/rules/shared/actions/generic-action.component.html +++ b/frontend/app/features/rules/shared/actions/generic-action.component.html @@ -37,7 +37,7 @@ - +
You can use advanced formatting: Documentation diff --git a/frontend/app/features/schemas/pages/schema/fields/field.component.html b/frontend/app/features/schemas/pages/schema/fields/field.component.html index 97d460d98..33890131c 100644 --- a/frontend/app/features/schemas/pages/schema/fields/field.component.html +++ b/frontend/app/features/schemas/pages/schema/fields/field.component.html @@ -46,7 +46,7 @@ - +
diff --git a/frontend/app/features/schemas/pages/schema/fields/field.component.ts b/frontend/app/features/schemas/pages/schema/fields/field.component.ts index 68f50515c..3727d2f4d 100644 --- a/frontend/app/features/schemas/pages/schema/fields/field.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/field.component.ts @@ -7,15 +7,12 @@ import { CdkDragDrop } from '@angular/cdk/drag-drop'; import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; -import { AppSettingsDto, createProperties, DialogModel, EditFieldForm, fadeAnimation, LanguageDto, ModalModel, NestedFieldDto, RootFieldDto, SchemaDto, SchemasState, sorted } from '@app/shared'; +import { AppSettingsDto, createProperties, DialogModel, EditFieldForm, LanguageDto, ModalModel, NestedFieldDto, RootFieldDto, SchemaDto, SchemasState, sorted } from '@app/shared'; @Component({ selector: 'sqx-field[field][languages][schema][settings]', styleUrls: ['./field.component.scss'], templateUrl: './field.component.html', - animations: [ - fadeAnimation, - ], }) export class FieldComponent implements OnChanges { @Input() diff --git a/frontend/app/features/schemas/pages/schema/fields/types/date-time-ui.component.html b/frontend/app/features/schemas/pages/schema/fields/types/date-time-ui.component.html index 1cfb72510..e57c9a606 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/date-time-ui.component.html +++ b/frontend/app/features/schemas/pages/schema/fields/types/date-time-ui.component.html @@ -17,7 +17,7 @@ - + diff --git a/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.html b/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.html index 535d1e571..df50a2b55 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.html +++ b/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.html @@ -36,14 +36,14 @@ -
+

{{ 'schemas.fieldTypes.string.suggestions' | sqxTranslate }}

{{pattern.name}}
{{pattern.regex}}
-
+
diff --git a/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.ts index 1fd322b3a..c98e19bc3 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.ts @@ -7,16 +7,13 @@ import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; import { FormGroup } from '@angular/forms'; -import { AppSettingsDto, fadeAnimation, FieldDto, hasNoValue$, hasValue$, LanguageDto, ModalModel, PatternDto, ResourceOwner, RootFieldDto, SchemaDto, StringFieldPropertiesDto, STRING_CONTENT_TYPES, Types, value$ } from '@app/shared'; +import { AppSettingsDto, FieldDto, hasNoValue$, hasValue$, LanguageDto, ModalModel, PatternDto, ResourceOwner, RootFieldDto, SchemaDto, StringFieldPropertiesDto, STRING_CONTENT_TYPES, Types, value$ } from '@app/shared'; import { Observable } from 'rxjs'; @Component({ selector: 'sqx-string-validation[field][fieldForm][properties][schema]', styleUrls: ['string-validation.component.scss'], templateUrl: 'string-validation.component.html', - animations: [ - fadeAnimation, - ], }) export class StringValidationComponent extends ResourceOwner implements OnChanges { public readonly contentTypes = STRING_CONTENT_TYPES; diff --git a/frontend/app/features/schemas/pages/schema/schema-page.component.html b/frontend/app/features/schemas/pages/schema/schema-page.component.html index e01e8c228..d5246dd6d 100644 --- a/frontend/app/features/schemas/pages/schema/schema-page.component.html +++ b/frontend/app/features/schemas/pages/schema/schema-page.component.html @@ -46,7 +46,7 @@ - + diff --git a/frontend/app/features/schemas/pages/schema/schema-page.component.ts b/frontend/app/features/schemas/pages/schema/schema-page.component.ts index 090392575..982e3538b 100644 --- a/frontend/app/features/schemas/pages/schema/schema-page.component.ts +++ b/frontend/app/features/schemas/pages/schema/schema-page.component.ts @@ -7,7 +7,7 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { defined, fadeAnimation, MessageBus, ModalModel, ResourceOwner, SchemaDto, SchemasState } from '@app/shared'; +import { defined, MessageBus, ModalModel, ResourceOwner, SchemaDto, SchemasState } from '@app/shared'; import { map } from 'rxjs/operators'; import { SchemaCloning } from './../messages'; @@ -15,9 +15,6 @@ import { SchemaCloning } from './../messages'; selector: 'sqx-schema-page', styleUrls: ['./schema-page.component.scss'], templateUrl: './schema-page.component.html', - animations: [ - fadeAnimation, - ], }) export class SchemaPageComponent extends ResourceOwner implements OnInit { public readonly exact = { exact: true }; diff --git a/frontend/app/features/settings/pages/clients/client-connect-form.component.html b/frontend/app/features/settings/pages/clients/client-connect-form.component.html index 08c78bb03..038030ae4 100644 --- a/frontend/app/features/settings/pages/clients/client-connect-form.component.html +++ b/frontend/app/features/settings/pages/clients/client-connect-form.component.html @@ -34,7 +34,7 @@

{{ 'clients.connectWizard.step1Title' | sqxTranslate }}

- +
@@ -97,7 +97,7 @@
1 {{ 'clients.connectWizard.cliStep1' | sqxTranslate }}
-
+
{{ 'clients.connectWizard.cliStep1Hint' | sqxTranslate }} @@ -105,7 +105,7 @@
-
2
+
2
@@ -132,7 +132,7 @@
1 {{ 'clients.connectWizard.sdkStep1' | sqxTranslate }}
-
+

dotnet add package Squidex.ClientLibrary diff --git a/frontend/app/framework/angular/animations.ts b/frontend/app/framework/angular/animations.ts index b9c8940f4..8deab7800 100644 --- a/frontend/app/framework/angular/animations.ts +++ b/frontend/app/framework/angular/animations.ts @@ -76,30 +76,6 @@ export function buildFadeAnimation(name = 'fade', timing = '150ms'): AnimationTr ); } -export function buildHeightAnimation(name = 'height', timing = '200ms'): AnimationTriggerMetadata { - return trigger( - name, [ - transition(':enter', [ - style({ height: '0px' }), - animate(timing, style({ height: '*' })), - ]), - transition(':leave', [ - style({ height: '*' }), - animate(timing, style({ height: '0px' })), - ]), - state('true', - style({ height: '*' }), - ), - state('false', - style({ height: '0px' }), - ), - transition('1 => 0', animate(timing)), - transition('0 => 1', animate(timing)), - ], - ); -} - export const fadeAnimation = buildFadeAnimation(); -export const heightAnimation = buildHeightAnimation(); export const slideAnimation = buildSlideAnimation(); export const slideRightAnimation = buildSlideRightAnimation(); diff --git a/frontend/app/framework/angular/dropdown-menu.component.html b/frontend/app/framework/angular/dropdown-menu.component.html new file mode 100644 index 000000000..95a0b70bd --- /dev/null +++ b/frontend/app/framework/angular/dropdown-menu.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/app/framework/angular/dropdown-menu.component.scss b/frontend/app/framework/angular/dropdown-menu.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/app/framework/angular/dropdown-menu.component.ts b/frontend/app/framework/angular/dropdown-menu.component.ts new file mode 100644 index 000000000..5e3b8a5a3 --- /dev/null +++ b/frontend/app/framework/angular/dropdown-menu.component.ts @@ -0,0 +1,37 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. + */ + +import { ChangeDetectionStrategy, Component, ElementRef, HostBinding } from '@angular/core'; +import { fadeAnimation } from './animations'; + +@Component({ + selector: 'sqx-dropdown-menu', + styleUrls: ['./dropdown-menu.component.scss'], + templateUrl: './dropdown-menu.component.html', + host: { + class: 'dropdown-menu', + }, + animations: [ + fadeAnimation, + ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DropdownMenuComponent { + @HostBinding('@fade') + public get fade() { + return true; + } + + public get nativeElement() { + return this.element.nativeElement; + } + + constructor( + private readonly element: ElementRef, + ) { + } +} diff --git a/frontend/app/framework/angular/forms/control-errors-messages.component.html b/frontend/app/framework/angular/forms/control-errors-messages.component.html new file mode 100644 index 000000000..9069f3986 --- /dev/null +++ b/frontend/app/framework/angular/forms/control-errors-messages.component.html @@ -0,0 +1,7 @@ +

+
+ + {{message}} + +
+
\ No newline at end of file diff --git a/frontend/app/framework/angular/forms/control-errors-messages.component.scss b/frontend/app/framework/angular/forms/control-errors-messages.component.scss new file mode 100644 index 000000000..bef9e52d5 --- /dev/null +++ b/frontend/app/framework/angular/forms/control-errors-messages.component.scss @@ -0,0 +1,4 @@ +:host { + @include force-width(100%); + align-self: flex-start; +} \ No newline at end of file diff --git a/frontend/app/framework/angular/forms/control-errors-messages.component.ts b/frontend/app/framework/angular/forms/control-errors-messages.component.ts new file mode 100644 index 000000000..aa1956849 --- /dev/null +++ b/frontend/app/framework/angular/forms/control-errors-messages.component.ts @@ -0,0 +1,23 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Sebastian Stehle. All rights r vbeserved + */ + +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { fadeAnimation } from '@app/framework/internal'; + +@Component({ + selector: 'sqx-errors-messages', + styleUrls: ['./control-errors-messages.component.scss'], + templateUrl: './control-errors-messages.component.html', + animations: [ + fadeAnimation, + ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ControlErrorsMessagesComponent { + @Input() + public errorMessages: ReadonlyArray; +} diff --git a/frontend/app/framework/angular/forms/control-errors.component.html b/frontend/app/framework/angular/forms/control-errors.component.html index 5cba6075b..14f156722 100644 --- a/frontend/app/framework/angular/forms/control-errors.component.html +++ b/frontend/app/framework/angular/forms/control-errors.component.html @@ -1,7 +1 @@ -
-
- - {{message}} - -
-
\ No newline at end of file + \ No newline at end of file diff --git a/frontend/app/framework/angular/forms/control-errors.component.ts b/frontend/app/framework/angular/forms/control-errors.component.ts index 4cd45a692..ec99dcd00 100644 --- a/frontend/app/framework/angular/forms/control-errors.component.ts +++ b/frontend/app/framework/angular/forms/control-errors.component.ts @@ -7,7 +7,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Host, Input, OnChanges, OnDestroy, Optional } from '@angular/core'; import { AbstractControl, FormArray, FormGroupDirective } from '@angular/forms'; -import { fadeAnimation, LocalizerService, StatefulComponent, Types } from '@app/framework/internal'; +import { LocalizerService, StatefulComponent, Types } from '@app/framework/internal'; import { merge } from 'rxjs'; import { touchedChange$ } from './forms-helper'; import { formatError } from './error-formatting'; @@ -21,9 +21,6 @@ interface State { selector: 'sqx-control-errors[for]', styleUrls: ['./control-errors.component.scss'], templateUrl: './control-errors.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ControlErrorsComponent extends StatefulComponent implements OnChanges, OnDestroy { @@ -115,6 +112,10 @@ export class ControlErrorsComponent extends StatefulComponent implements } } + if (errorMessages.length === 0 && this.snapshot.errorMessages.length === 0) { + return; + } + this.next({ errorMessages }); } } diff --git a/frontend/app/framework/angular/forms/editors/autocomplete.component.html b/frontend/app/framework/angular/forms/editors/autocomplete.component.html index 4c7349207..768bdbca2 100644 --- a/frontend/app/framework/angular/forms/editors/autocomplete.component.html +++ b/frontend/app/framework/angular/forms/editors/autocomplete.component.html @@ -16,18 +16,18 @@
-
+
+ [sqxScrollContainer]="$any(container)"> {{item}}
-
+
\ No newline at end of file diff --git a/frontend/app/framework/angular/forms/editors/autocomplete.component.ts b/frontend/app/framework/angular/forms/editors/autocomplete.component.ts index 5561cf270..b27f58fd5 100644 --- a/frontend/app/framework/angular/forms/editors/autocomplete.component.ts +++ b/frontend/app/framework/angular/forms/editors/autocomplete.component.ts @@ -7,7 +7,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, forwardRef, Input, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; -import { fadeAnimation, Keys, StatefulControlComponent, Types } from '@app/framework/internal'; +import { Keys, StatefulControlComponent, Types } from '@app/framework/internal'; import { RelativePosition } from '@app/shared'; import { Observable, of } from 'rxjs'; import { catchError, debounceTime, distinctUntilChanged, finalize, map, switchMap, tap } from 'rxjs/operators'; @@ -43,9 +43,6 @@ const NO_EMIT = { emitEvent: false }; providers: [ SQX_AUTOCOMPLETE_CONTROL_VALUE_ACCESSOR, ], - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class AutocompleteComponent extends StatefulControlComponent> implements OnInit, OnDestroy { diff --git a/frontend/app/framework/angular/forms/editors/dropdown.component.html b/frontend/app/framework/angular/forms/editors/dropdown.component.html index 1ee6c89dc..87a58107f 100644 --- a/frontend/app/framework/angular/forms/editors/dropdown.component.html +++ b/frontend/app/framework/angular/forms/editors/dropdown.component.html @@ -15,7 +15,7 @@
-
+
@@ -32,6 +32,6 @@
-
+ \ No newline at end of file diff --git a/frontend/app/framework/angular/forms/editors/localized-input.component.ts b/frontend/app/framework/angular/forms/editors/localized-input.component.ts index 540ebfe5a..23b3947cc 100644 --- a/frontend/app/framework/angular/forms/editors/localized-input.component.ts +++ b/frontend/app/framework/angular/forms/editors/localized-input.component.ts @@ -7,7 +7,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, Input } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; -import { fadeAnimation, ModalModel, StatefulControlComponent, Types } from '@app/framework/internal'; +import { ModalModel, StatefulControlComponent, Types } from '@app/framework/internal'; import { Language } from './../../language-selector.component'; export const SQX_LOCALIZED_INPUT_CONTROL_VALUE_ACCESSOR: any = { @@ -28,9 +28,6 @@ interface State { providers: [ SQX_LOCALIZED_INPUT_CONTROL_VALUE_ACCESSOR, ], - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class LocalizedInputComponent extends StatefulControlComponent { diff --git a/frontend/app/framework/angular/forms/editors/tag-editor.component.html b/frontend/app/framework/angular/forms/editors/tag-editor.component.html index 75604afa0..9bfb2ddc0 100644 --- a/frontend/app/framework/angular/forms/editors/tag-editor.component.html +++ b/frontend/app/framework/angular/forms/editors/tag-editor.component.html @@ -29,22 +29,22 @@ -
+
+ [sqxScrollContainer]="container.nativeElement"> {{item}}
-
+
-
+
@@ -59,7 +59,7 @@
-
+
\ No newline at end of file diff --git a/frontend/app/framework/angular/forms/editors/tag-editor.component.ts b/frontend/app/framework/angular/forms/editors/tag-editor.component.ts index 2117a8914..b9de84231 100644 --- a/frontend/app/framework/angular/forms/editors/tag-editor.component.ts +++ b/frontend/app/framework/angular/forms/editors/tag-editor.component.ts @@ -7,7 +7,7 @@ import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core'; import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; -import { fadeAnimation, getTagValues, Keys, ModalModel, StatefulControlComponent, StringConverter, TagValue, Types } from '@app/framework/internal'; +import { getTagValues, Keys, ModalModel, StatefulControlComponent, StringConverter, TagValue, Types } from '@app/framework/internal'; import { distinctUntilChanged, map, tap } from 'rxjs/operators'; export const SQX_TAG_EDITOR_CONTROL_VALUE_ACCESSOR: any = { @@ -37,13 +37,11 @@ interface State { providers: [ SQX_TAG_EDITOR_CONTROL_VALUE_ACCESSOR, ], - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class TagEditorComponent extends StatefulControlComponent> implements AfterViewInit, OnChanges, OnInit { private latestValue: any; + private latestInput: string; @ViewChild('form', { static: false }) public formElement: ElementRef; @@ -104,6 +102,17 @@ export class TagEditorComponent extends StatefulControlComponent | undefined | null) { this.suggestionsSorted = getTagValues(value); + + if (this.addInput.value) { + const query = this.addInput.value; + + const items = this.suggestionsSorted.filter(s => s.lowerCaseName.indexOf(query) >= 0 && !this.snapshot.items.find(x => x.id === s.id)); + + this.next({ + suggestedIndex: -1, + suggestedItems: items || [], + }); + } } public suggestionsSorted: ReadonlyArray = []; @@ -126,7 +135,7 @@ export class TagEditorComponent extends StatefulControlComponent { if (!query) { this.resetAutocompletion(); + } else if (!this.latestInput) { + this.open.emit(); } + + this.latestInput = query; }), distinctUntilChanged(), map(query => { @@ -158,19 +171,21 @@ export class TagEditorComponent extends StatefulControlComponent { + .subscribe(suggestedItems => { this.next({ suggestedIndex: -1, - suggestedItems: items || [], + suggestedItems, }); })); } - public writeValue(obj: any) { + public writeValue(obj: any, noForm = false) { this.latestValue = obj; - this.resetForm(); - this.resetSize(); + if (!noForm) { + this.resetForm(); + this.resetSize(); + } const items: any[] = []; diff --git a/frontend/app/framework/angular/forms/form-error.component.html b/frontend/app/framework/angular/forms/form-error.component.html index e0d27e879..be5a4cba5 100644 --- a/frontend/app/framework/angular/forms/form-error.component.html +++ b/frontend/app/framework/angular/forms/form-error.component.html @@ -5,7 +5,7 @@ -
+
\ No newline at end of file diff --git a/frontend/app/framework/angular/language-selector.component.html b/frontend/app/framework/angular/language-selector.component.html index 2a9e5e21d..2de094009 100644 --- a/frontend/app/framework/angular/language-selector.component.html +++ b/frontend/app/framework/angular/language-selector.component.html @@ -10,7 +10,7 @@ - + \ No newline at end of file diff --git a/frontend/app/framework/angular/language-selector.component.ts b/frontend/app/framework/angular/language-selector.component.ts index e4ce14a76..777a61cde 100644 --- a/frontend/app/framework/angular/language-selector.component.ts +++ b/frontend/app/framework/angular/language-selector.component.ts @@ -6,7 +6,7 @@ */ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core'; -import { fadeAnimation, ModalModel } from '@app/framework/internal'; +import { ModalModel } from '@app/framework/internal'; export interface Language { iso2Code: string; englishName: string; isMasterLanguage?: boolean } @@ -14,9 +14,6 @@ export interface Language { iso2Code: string; englishName: string; isMasterLangu selector: 'sqx-language-selector[language][languages]', styleUrls: ['./language-selector.component.scss'], templateUrl: './language-selector.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class LanguageSelectorComponent implements OnChanges, OnInit { diff --git a/frontend/app/framework/angular/list-view.component.ts b/frontend/app/framework/angular/list-view.component.ts index 2d3e4c7fb..4a7f95fbd 100644 --- a/frontend/app/framework/angular/list-view.component.ts +++ b/frontend/app/framework/angular/list-view.component.ts @@ -6,7 +6,7 @@ */ import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, Input, Renderer2, ViewChild } from '@angular/core'; -import { fadeAnimation, StatefulComponent } from '@app/framework/internal'; +import { StatefulComponent } from '@app/framework/internal'; interface State { // True when loading. @@ -17,9 +17,6 @@ interface State { selector: 'sqx-list-view', styleUrls: ['./list-view.component.scss'], templateUrl: './list-view.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.Default, }) export class ListViewComponent extends StatefulComponent implements AfterViewInit { diff --git a/frontend/app/framework/angular/markdown.directive.ts b/frontend/app/framework/angular/markdown.directive.ts new file mode 100644 index 000000000..c17871c93 --- /dev/null +++ b/frontend/app/framework/angular/markdown.directive.ts @@ -0,0 +1,68 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. + */ + +import { Directive, ElementRef, Input, OnChanges, Renderer2 } from '@angular/core'; +import marked from 'marked'; + +const RENDERER_DEFAULT = new marked.Renderer(); +const RENDERER_INLINE = new marked.Renderer(); + +RENDERER_DEFAULT.link = (href, _, text) => { + if (href && href.startsWith('mailto')) { + return text; + } else { + return `${text} `; + } +}; + +RENDERER_INLINE.paragraph = (text) => { + return text; +}; + +RENDERER_INLINE.link = RENDERER_DEFAULT.link; + +@Directive({ + selector: '[sqxMarkdown]', +}) +export class MarkdownDirective implements OnChanges { + @Input('sqxMarkdown') + public markdown: string; + + @Input() + public inline = true; + + @Input() + public optional = false; + + constructor( + private readonly element: ElementRef, + private readonly renderer: Renderer2, + ) { + } + + public ngOnChanges() { + let html = ''; + + const markdown = this.markdown; + + if (!markdown) { + html = markdown; + } else if (this.optional && markdown.indexOf('!') !== 0) { + html = markdown; + } else if (this.markdown) { + const renderer = this.inline ? RENDERER_INLINE : RENDERER_DEFAULT; + + html = marked(this.markdown, { renderer }); + } + + if (!html || html === this.markdown || html.indexOf('<') < 0) { + this.renderer.setProperty(this.element.nativeElement, 'textContent', html); + } else { + this.renderer.setProperty(this.element.nativeElement, 'innerHTML', html); + } + } +} diff --git a/frontend/app/framework/angular/modals/dialog-renderer.component.html b/frontend/app/framework/angular/modals/dialog-renderer.component.html index e81780cb0..bfebfa993 100644 --- a/frontend/app/framework/angular/modals/dialog-renderer.component.html +++ b/frontend/app/framework/angular/modals/dialog-renderer.component.html @@ -7,7 +7,7 @@ - +
@@ -35,7 +35,7 @@
-
+
diff --git a/frontend/app/framework/declarations.ts b/frontend/app/framework/declarations.ts index 290a69549..8045a19a7 100644 --- a/frontend/app/framework/declarations.ts +++ b/frontend/app/framework/declarations.ts @@ -7,9 +7,11 @@ export * from './angular/avatar.component'; export * from './angular/code.component'; +export * from './angular/dropdown-menu.component'; export * from './angular/external-link.directive'; export * from './angular/forms/confirm-click.directive'; export * from './angular/forms/control-errors.component'; +export * from './angular/forms/control-errors-messages.component'; export * from './angular/forms/copy.directive'; export * from './angular/forms/editable-title.component'; export * from './angular/forms/editors/autocomplete.component'; @@ -45,6 +47,7 @@ export * from './angular/language-selector.component'; export * from './angular/layout-container.directive'; export * from './angular/layout.component'; export * from './angular/list-view.component'; +export * from './angular/markdown.directive'; export * from './angular/modals/dialog-renderer.component'; export * from './angular/modals/modal-dialog.component'; export * from './angular/modals/modal-placement.directive'; diff --git a/frontend/app/framework/module.ts b/frontend/app/framework/module.ts index 91d3bd6f9..326d70b2f 100644 --- a/frontend/app/framework/module.ts +++ b/frontend/app/framework/module.ts @@ -11,7 +11,7 @@ import { ModuleWithProviders, NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { ColorPickerModule } from 'ngx-color-picker'; -import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterceptor, CanDeactivateGuard, CheckboxGroupComponent, ClipboardService, CodeComponent, CodeEditorComponent, ColorPickerComponent, ConfirmClickDirective, ControlErrorsComponent, CopyDirective, DarkenPipe, DatePipe, DateTimeEditorComponent, DayOfWeekPipe, DayPipe, DialogRendererComponent, DialogService, DisplayNamePipe, DropdownComponent, DurationPipe, EditableTitleComponent, ExternalLinkDirective, FileDropDirective, FileSizePipe, FocusOnInitDirective, FormAlertComponent, FormErrorComponent, FormHintComponent, FromNowPipe, FullDateTimePipe, HighlightPipe, HoverBackgroundDirective, ImageSourceDirective, IndeterminateValueDirective, ISODatePipe, KeysPipe, KNumberPipe, LanguageSelectorComponent, LayoutComponent, LayoutContainerDirective, LightenPipe, ListViewComponent, LoadingInterceptor, LoadingService, LocalizedInputComponent, LocalStoreService, MarkdownInlinePipe, MarkdownPipe, MessageBus, ModalDialogComponent, ModalDirective, ModalPlacementDirective, MoneyPipe, MonthPipe, OnboardingService, OnboardingTooltipComponent, PagerComponent, ParentLinkDirective, PopupLinkDirective, ProgressBarComponent, ResizedDirective, ResizeService, ResourceLoaderService, RootViewComponent, SafeHtmlPipe, SafeResourceUrlPipe, SafeUrlPipe, ScrollActiveDirective, ShortcutComponent, ShortcutDirective, ShortcutService, ShortDatePipe, ShortTimePipe, StarsComponent, StatusIconComponent, StopClickDirective, StopDragDirective, SyncScollingDirective, SyncWidthDirective, TabRouterlinkDirective, TagEditorComponent, TemplateWrapperDirective, TempService, TitleComponent, TitleService, ToggleComponent, ToolbarComponent, TooltipDirective, TransformInputDirective, TranslatePipe, VideoPlayerComponent } from './declarations'; +import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterceptor, CanDeactivateGuard, CheckboxGroupComponent, ClipboardService, CodeComponent, CodeEditorComponent, ColorPickerComponent, ConfirmClickDirective, ControlErrorsComponent, ControlErrorsMessagesComponent, CopyDirective, DarkenPipe, DatePipe, DateTimeEditorComponent, DayOfWeekPipe, DayPipe, DialogRendererComponent, DialogService, DisplayNamePipe, DropdownComponent, DropdownMenuComponent, DurationPipe, EditableTitleComponent, ExternalLinkDirective, FileDropDirective, FileSizePipe, FocusOnInitDirective, FormAlertComponent, FormErrorComponent, FormHintComponent, FromNowPipe, FullDateTimePipe, HighlightPipe, HoverBackgroundDirective, ImageSourceDirective, IndeterminateValueDirective, ISODatePipe, KeysPipe, KNumberPipe, LanguageSelectorComponent, LayoutComponent, LayoutContainerDirective, LightenPipe, ListViewComponent, LoadingInterceptor, LoadingService, LocalizedInputComponent, LocalStoreService, MarkdownDirective, MarkdownInlinePipe, MarkdownPipe, MessageBus, ModalDialogComponent, ModalDirective, ModalPlacementDirective, MoneyPipe, MonthPipe, OnboardingService, OnboardingTooltipComponent, PagerComponent, ParentLinkDirective, PopupLinkDirective, ProgressBarComponent, ResizedDirective, ResizeService, ResourceLoaderService, RootViewComponent, SafeHtmlPipe, SafeResourceUrlPipe, SafeUrlPipe, ScrollActiveDirective, ShortcutComponent, ShortcutDirective, ShortcutService, ShortDatePipe, ShortTimePipe, StarsComponent, StatusIconComponent, StopClickDirective, StopDragDirective, SyncScollingDirective, SyncWidthDirective, TabRouterlinkDirective, TagEditorComponent, TemplateWrapperDirective, TempService, TitleComponent, TitleService, ToggleComponent, ToolbarComponent, TooltipDirective, TransformInputDirective, TranslatePipe, VideoPlayerComponent } from './declarations'; @NgModule({ imports: [ @@ -30,6 +30,7 @@ import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterc ColorPickerComponent, ConfirmClickDirective, ControlErrorsComponent, + ControlErrorsMessagesComponent, CopyDirective, DarkenPipe, DatePipe, @@ -39,6 +40,7 @@ import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterc DialogRendererComponent, DisplayNamePipe, DropdownComponent, + DropdownMenuComponent, DurationPipe, EditableTitleComponent, ExternalLinkDirective, @@ -63,6 +65,7 @@ import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterc LightenPipe, ListViewComponent, LocalizedInputComponent, + MarkdownDirective, MarkdownInlinePipe, MarkdownPipe, ModalDialogComponent, @@ -121,6 +124,7 @@ import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterc DialogRendererComponent, DisplayNamePipe, DropdownComponent, + DropdownMenuComponent, DurationPipe, EditableTitleComponent, ExternalLinkDirective, @@ -146,6 +150,7 @@ import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterc LightenPipe, ListViewComponent, LocalizedInputComponent, + MarkdownDirective, MarkdownInlinePipe, MarkdownPipe, ModalDialogComponent, diff --git a/frontend/app/shared/components/assets/asset-folder.component.html b/frontend/app/shared/components/assets/asset-folder.component.html index 61950d89a..11d0d8da7 100644 --- a/frontend/app/shared/components/assets/asset-folder.component.html +++ b/frontend/app/shared/components/assets/asset-folder.component.html @@ -14,7 +14,7 @@ - +
diff --git a/frontend/app/shared/components/assets/asset-folder.component.ts b/frontend/app/shared/components/assets/asset-folder.component.ts index 3b8b01156..06e742581 100644 --- a/frontend/app/shared/components/assets/asset-folder.component.ts +++ b/frontend/app/shared/components/assets/asset-folder.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; -import { AssetFolderDto, AssetPathItem, DialogModel, fadeAnimation, ModalModel, Types } from '@app/shared/internal'; +import { AssetFolderDto, AssetPathItem, DialogModel, ModalModel, Types } from '@app/shared/internal'; @Component({ selector: 'sqx-asset-folder', styleUrls: ['./asset-folder.component.scss'], templateUrl: './asset-folder.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetFolderComponent { diff --git a/frontend/app/shared/components/assets/asset-uploader.component.html b/frontend/app/shared/components/assets/asset-uploader.component.html index 750109f85..59501dfc2 100644 --- a/frontend/app/shared/components/assets/asset-uploader.component.html +++ b/frontend/app/shared/components/assets/asset-uploader.component.html @@ -9,7 +9,7 @@ - - + diff --git a/frontend/app/shared/components/assets/asset-uploader.component.ts b/frontend/app/shared/components/assets/asset-uploader.component.ts index 3f809908b..311ff5265 100644 --- a/frontend/app/shared/components/assets/asset-uploader.component.ts +++ b/frontend/app/shared/components/assets/asset-uploader.component.ts @@ -6,15 +6,12 @@ */ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { AppsState, AssetsState, AssetUploaderState, fadeAnimation, ModalModel, Upload } from '@app/shared/internal'; +import { AppsState, AssetsState, AssetUploaderState, ModalModel, Upload } from '@app/shared/internal'; @Component({ selector: 'sqx-asset-uploader', styleUrls: ['./asset-uploader.component.scss'], templateUrl: './asset-uploader.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetUploaderComponent { diff --git a/frontend/app/shared/components/comments/comment.component.html b/frontend/app/shared/components/comments/comment.component.html index fb2b393d9..d8da95b5a 100644 --- a/frontend/app/shared/components/comments/comment.component.html +++ b/frontend/app/shared/components/comments/comment.component.html @@ -10,7 +10,7 @@
{{comment.user | sqxUserNameRef}}
-
+
diff --git a/frontend/app/shared/components/schema-category.component.ts b/frontend/app/shared/components/schema-category.component.ts index 02cd0b852..367c00c33 100644 --- a/frontend/app/shared/components/schema-category.component.ts +++ b/frontend/app/shared/components/schema-category.component.ts @@ -7,7 +7,7 @@ import { CdkDragDrop, CdkDragStart } from '@angular/cdk/drag-drop'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output } from '@angular/core'; -import { fadeAnimation, LocalStoreService, SchemaCategory, SchemaDto, SchemasState } from '@app/shared/internal'; +import { LocalStoreService, SchemaCategory, SchemaDto, SchemasState } from '@app/shared/internal'; const ITEM_HEIGHT = 2.5; @@ -15,9 +15,6 @@ const ITEM_HEIGHT = 2.5; selector: 'sqx-schema-category[schemaCategory]', styleUrls: ['./schema-category.component.scss'], templateUrl: './schema-category.component.html', - animations: [ - fadeAnimation, - ], changeDetection: ChangeDetectionStrategy.OnPush, }) export class SchemaCategoryComponent implements OnChanges { diff --git a/frontend/app/shared/components/search/search-form.component.html b/frontend/app/shared/components/search/search-form.component.html index 555d1c412..916ba9a35 100644 --- a/frontend/app/shared/components/search/search-form.component.html +++ b/frontend/app/shared/components/search/search-form.component.html @@ -81,7 +81,7 @@ [languages]="languages"> - +
diff --git a/frontend/app/shell/pages/internal/apps-menu.component.html b/frontend/app/shell/pages/internal/apps-menu.component.html index 0e3184ab3..2133958a8 100644 --- a/frontend/app/shell/pages/internal/apps-menu.component.html +++ b/frontend/app/shell/pages/internal/apps-menu.component.html @@ -12,7 +12,7 @@ -