Browse Source

Panel style improvement.

pull/342/head
Sebastian Stehle 7 years ago
parent
commit
185e5e829f
  1. 1
      src/Squidex/app/features/assets/declarations.ts
  2. 10
      src/Squidex/app/features/assets/module.ts
  3. 38
      src/Squidex/app/features/assets/pages/assets-filters-page.component.html
  4. 2
      src/Squidex/app/features/assets/pages/assets-filters-page.component.scss
  5. 50
      src/Squidex/app/features/assets/pages/assets-filters-page.component.ts
  6. 44
      src/Squidex/app/features/assets/pages/assets-page.component.html
  7. 12
      src/Squidex/app/features/assets/pages/assets-page.component.ts
  8. 3
      src/Squidex/app/features/content/declarations.ts
  9. 16
      src/Squidex/app/features/content/module.ts
  10. 0
      src/Squidex/app/features/content/pages/content/content-history-page.component.html
  11. 0
      src/Squidex/app/features/content/pages/content/content-history-page.component.scss
  12. 6
      src/Squidex/app/features/content/pages/content/content-history-page.component.ts
  13. 25
      src/Squidex/app/features/content/pages/contents/contents-filters-page.component.html
  14. 2
      src/Squidex/app/features/content/pages/contents/contents-filters-page.component.scss
  15. 62
      src/Squidex/app/features/content/pages/contents/contents-filters-page.component.ts
  16. 27
      src/Squidex/app/features/content/pages/contents/contents-page.component.html
  17. 12
      src/Squidex/app/features/content/pages/contents/contents-page.component.ts
  18. 2
      src/Squidex/app/features/content/pages/schemas/schemas-page.component.html
  19. 23
      src/Squidex/app/shared/components/schema-category.component.ts
  20. 2
      src/Squidex/app/shell/pages/app/left-menu.component.html
  21. 11
      src/Squidex/app/theme/_panels.scss

1
src/Squidex/app/features/assets/declarations.ts

@ -5,4 +5,5 @@
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
export * from './pages/assets-filters-page.component';
export * from './pages/assets-page.component';

10
src/Squidex/app/features/assets/module.ts

@ -11,13 +11,20 @@ import { RouterModule, Routes } from '@angular/router';
import { SqxFrameworkModule, SqxSharedModule } from '@app/shared';
import {
AssetsFiltersPageComponent,
AssetsPageComponent
} from './declarations';
const routes: Routes = [
{
path: '',
component: AssetsPageComponent
component: AssetsPageComponent,
children: [
{
path: 'filters',
component: AssetsFiltersPageComponent
}
]
}
];
@ -28,6 +35,7 @@ const routes: Routes = [
RouterModule.forChild(routes)
],
declarations: [
AssetsFiltersPageComponent,
AssetsPageComponent
]
})

38
src/Squidex/app/features/assets/pages/assets-filters-page.component.html

@ -0,0 +1,38 @@
<sqx-panel desiredWidth="20rem" isBlank="true" [isLazyLoaded]="false">
<ng-container title>
Filters
</ng-container>
<ng-container content>
<h3>Tags</h3>
<a class="sidebar-item" (click)="resetTags()" [class.active]="assetsState.isTagSelectionEmpty()">
<div class="row">
<div class="col">
All tags
</div>
</div>
</a>
<a class="sidebar-item" *ngFor="let tag of assetsState.tags | async" (click)="toggleTag(tag.name)" [class.active]="assetsState.isTagSelected(tag.name)">
<div class="row">
<div class="col">
{{tag.name}}
</div>
<div class="col-auto">
{{tag.count}}
</div>
</div>
</a>
<hr />
<h3>Saved queries</h3>
<a class="sidebar-item" *ngFor="let query of queries.queries | async" (click)="search(query.filter)" [class.active]="isSelectedQuery(query.filter)">
<a class="sidebar-item-remove float-right" (click)="queries.remove(query.name)">
<i class="icon-close"></i>
</a>
</a>
</ng-container>
</sqx-panel>

2
src/Squidex/app/features/assets/pages/assets-filters-page.component.scss

@ -0,0 +1,2 @@
@import '_vars';
@import '_mixins';

50
src/Squidex/app/features/assets/pages/assets-filters-page.component.ts

@ -0,0 +1,50 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Component } from '@angular/core';
import { onErrorResumeNext } from 'rxjs/operators';
import {
AssetsState,
Queries,
UIState
} from '@app/shared';
@Component({
selector: 'sqx-assets-filters-page',
styleUrls: ['./assets-filters-page.component.scss'],
templateUrl: './assets-filters-page.component.html'
})
export class AssetsFiltersPageComponent {
public queries = new Queries(this.uiState, 'assets');
constructor(
public readonly assetsState: AssetsState,
private readonly uiState: UIState
) {
}
public search(query: string) {
this.assetsState.search(query).pipe(onErrorResumeNext()).subscribe();
}
public selectTags(tags: string[]) {
this.assetsState.selectTags(tags).pipe(onErrorResumeNext()).subscribe();
}
public toggleTag(tag: string) {
this.assetsState.toggleTag(tag).pipe(onErrorResumeNext()).subscribe();
}
public resetTags() {
this.assetsState.resetTags().pipe(onErrorResumeNext()).subscribe();
}
public isSelectedQuery(query: string) {
return query === this.assetsState.snapshot.assetsQuery || (!query && !this.assetsState.assetsQuery);
}
}

44
src/Squidex/app/features/assets/pages/assets-page.component.html

@ -1,6 +1,6 @@
<sqx-title message="{app} | Assets" parameter1="app" [value1]="appsState.appName"></sqx-title>
<sqx-panel desiredWidth="*" showSidebar="true" sidebarClass="wide">
<sqx-panel desiredWidth="*" showSidebar="true">
<ng-container title>
Assets
</ng-container>
@ -52,44 +52,12 @@
</ng-container>
<ng-container sidebar>
<div class="sidebar-section">
<h3>Tags</h3>
<sqx-tooltip position="leftTop" [target]="filtersLink">Filters</sqx-tooltip>
<a class="sidebar-item" (click)="resetTags()" [class.active]="assetsState.isTagSelectionEmpty()">
<div class="row">
<div class="col">
All tags
</div>
</div>
<a class="panel-link" routerLink="filters" routerLinkActive="active" #filtersLink>
<i class="icon-filter"></i>
</a>
<a class="sidebar-item" *ngFor="let tag of assetsState.tags | async" (click)="toggleTag(tag.name)" [class.active]="assetsState.isTagSelected(tag.name)">
<div class="row">
<div class="col">
{{tag.name}}
</div>
<div class="col-auto">
{{tag.count}}
</div>
</div>
</a>
</div>
<div class="sidebar-section">
<h3>Saved queries</h3>
<a class="sidebar-item" *ngFor="let query of queries.queries | async" (click)="search(query.filter)" [class.active]="isSelectedQuery(query.filter)">
<div class="row">
<div class="col truncate">
{{query.name}}
</div>
<div class="col-auto">
<a class="sidebar-item-remove" (click)="queries.remove(query.name)">
<i class="icon-close"></i>
</a>
</div>
</div>
</a>
</div>
</ng-container>
</sqx-panel>
<router-outlet></router-outlet>

12
src/Squidex/app/features/assets/pages/assets-page.component.ts

@ -52,16 +52,12 @@ export class AssetsPageComponent implements OnInit {
this.assetsState.search(query).pipe(onErrorResumeNext()).subscribe();
}
public toggleTag(tag: string) {
this.assetsState.toggleTag(tag).pipe(onErrorResumeNext()).subscribe();
}
public selectTags(tags: string[]) {
this.assetsState.selectTags(tags).pipe(onErrorResumeNext()).subscribe();
}
public resetTags() {
this.assetsState.resetTags().pipe(onErrorResumeNext()).subscribe();
public toggleTag(tag: string) {
this.assetsState.toggleTag(tag).pipe(onErrorResumeNext()).subscribe();
}
public goNext() {
@ -72,10 +68,6 @@ export class AssetsPageComponent implements OnInit {
this.assetsState.goPrev().pipe(onErrorResumeNext()).subscribe();
}
public isSelectedQuery(query: string) {
return query === this.assetsState.snapshot.assetsQuery || (!query && !this.assetsState.assetsQuery);
}
public changeView(isListView: boolean) {
this.isListView = isListView;

3
src/Squidex/app/features/content/declarations.ts

@ -7,8 +7,9 @@
export * from './pages/comments/comments-page.component';
export * from './pages/content/content-field.component';
export * from './pages/content/content-history.component';
export * from './pages/content/content-history-page.component';
export * from './pages/content/content-page.component';
export * from './pages/contents/contents-filters-page.component';
export * from './pages/contents/contents-page.component';
export * from './pages/schemas/schemas-page.component';

16
src/Squidex/app/features/content/module.ts

@ -27,9 +27,10 @@ import {
AssetsEditorComponent,
CommentsPageComponent,
ContentFieldComponent,
ContentHistoryComponent,
ContentHistoryPageComponent,
ContentItemComponent,
ContentPageComponent,
ContentsFiltersPageComponent,
ContentsPageComponent,
ContentsSelectorComponent,
ContentStatusComponent,
@ -57,7 +58,13 @@ const routes: Routes = [
path: '',
component: ContentsPageComponent,
canActivate: [SchemaMustNotBeSingletonGuard],
canDeactivate: [CanDeactivateGuard]
canDeactivate: [CanDeactivateGuard],
children: [
{
path: 'filters',
component: ContentsFiltersPageComponent
}
]
},
{
path: 'new',
@ -73,7 +80,7 @@ const routes: Routes = [
children: [
{
path: 'history',
component: ContentHistoryComponent,
component: ContentHistoryPageComponent,
data: {
channel: 'contents.{contentId}'
}
@ -103,9 +110,10 @@ const routes: Routes = [
AssetsEditorComponent,
CommentsPageComponent,
ContentFieldComponent,
ContentHistoryComponent,
ContentHistoryPageComponent,
ContentItemComponent,
ContentPageComponent,
ContentsFiltersPageComponent,
ContentStatusComponent,
ContentsPageComponent,
ContentsSelectorComponent,

0
src/Squidex/app/features/content/pages/content/content-history.component.html → src/Squidex/app/features/content/pages/content/content-history-page.component.html

0
src/Squidex/app/features/content/pages/content/content-history.component.scss → src/Squidex/app/features/content/pages/content/content-history-page.component.scss

6
src/Squidex/app/features/content/pages/content/content-history.component.ts → src/Squidex/app/features/content/pages/content/content-history-page.component.ts

@ -24,10 +24,10 @@ import { ContentVersionSelected } from './../messages';
@Component({
selector: 'sqx-history',
styleUrls: ['./content-history.component.scss'],
templateUrl: './content-history.component.html'
styleUrls: ['./content-history-page.component.scss'],
templateUrl: './content-history-page.component.html'
})
export class ContentHistoryComponent {
export class ContentHistoryPageComponent {
public get channel(): string {
let channelPath = this.route.snapshot.data['channel'];

25
src/Squidex/app/features/content/pages/contents/contents-filters-page.component.html

@ -0,0 +1,25 @@
<sqx-panel desiredWidth="20rem" isBlank="true" [isLazyLoaded]="false">
<ng-container title>
Filters
</ng-container>
<ng-container content>
<a class="sidebar-item" *ngFor="let query of schemaQueries.defaultQueries" (click)="search(query.filter)" [class.active]="isSelectedQuery(query.filter)">
{{query.name}}
</a>
<hr />
<div class="sidebar-section">
<h3>Saved queries</h3>
<a class="sidebar-item" *ngFor="let query of schemaQueries.queries | async" (click)="search(query.filter)" [class.active]="isSelectedQuery(query.filter)">
{{query.name}}
<a class="sidebar-item-remove float-right" (click)="schemaQueries.remove(query.name)">
<i class="icon-close"></i>
</a>
</a>
</div>
</ng-container>
</sqx-panel>

2
src/Squidex/app/features/content/pages/contents/contents-filters-page.component.scss

@ -0,0 +1,2 @@
@import '_vars';
@import '_mixins';

62
src/Squidex/app/features/content/pages/contents/contents-filters-page.component.ts

@ -0,0 +1,62 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Subscription } from 'rxjs';
import { filter, onErrorResumeNext, takeUntil } from 'rxjs/operators';
import {
ContentsState,
navigatedToOtherComponent,
Queries,
SchemasState,
UIState
} from '@app/shared';
@Component({
selector: 'sqx-contents-filters-page',
styleUrls: ['./contents-filters-page.component.scss'],
templateUrl: './contents-filters-page.component.html'
})
export class ContentsFiltersPageComponent implements OnDestroy, OnInit {
private selectedSchemaSubscription: Subscription;
public schemaQueries: Queries;
constructor(
private readonly contentsState: ContentsState,
private readonly schemasState: SchemasState,
private readonly router: Router,
private readonly uiState: UIState
) {
}
public ngOnDestroy() {
this.selectedSchemaSubscription.unsubscribe();
}
public ngOnInit() {
const routeChanged = this.router.events.pipe(filter(navigatedToOtherComponent(this.router)));
this.selectedSchemaSubscription =
this.schemasState.selectedSchema.pipe(takeUntil(routeChanged))
.subscribe(schema => {
if (schema) {
this.schemaQueries = new Queries(this.uiState, `schemas.${schema.name}`);
}
});
}
public search(query: string) {
this.contentsState.search(query).pipe(onErrorResumeNext()).subscribe();
}
public isSelectedQuery(query: string) {
return query === this.contentsState.snapshot.contentsQuery || (!query && !this.contentsState.snapshot.contentsQuery);
}
}

27
src/Squidex/app/features/content/pages/contents/contents-page.component.html

@ -1,6 +1,6 @@
<sqx-title message="{app} | {schema} | Contents" parameter1="app" parameter2="schema" [value1]="appsState.appName" [value2]="schema.displayName"></sqx-title>
<sqx-panel desiredWidth="*" contentClass="grid" showSidebar="true" sidebarClass="wide">
<sqx-panel desiredWidth="*" contentClass="grid" showSidebar="true">
<ng-container title>
<ng-container *ngIf="contentsState.isArchive | async; else noArchive">
Archive
@ -125,29 +125,14 @@
</ng-container>
<ng-container sidebar>
<div class="sidebar-section">
<a class="row sidebar-item" *ngFor="let query of schemaQueries.defaultQueries" (click)="search(query.filter)" [class.active]="isSelectedQuery(query.filter)">
<div class="col truncate">
{{query.name}}
</div>
</a>
</div>
<sqx-tooltip position="leftTop" [target]="filtersLink">Filters</sqx-tooltip>
<div class="sidebar-section">
<h3>Saved queries</h3>
<a class="row sidebar-item" *ngFor="let query of schemaQueries.queries | async" (click)="search(query.filter)" [class.active]="isSelectedQuery(query.filter)">
<div class="col truncate">
{{query.name}}
</div>
<div class="col-auto">
<a class="sidebar-item-remove" (click)="schemaQueries.remove(query.name)">
<i class="icon-close"></i>
<a class="panel-link" routerLink="filters" routerLinkActive="active" #filtersLink>
<i class="icon-filter"></i>
</a>
</div>
</a>
</div>
</ng-container>
</sqx-panel>
<router-outlet></router-outlet>
<sqx-due-time-selector #dueTimeSelector></sqx-due-time-selector>

12
src/Squidex/app/features/content/pages/contents/contents-page.component.ts

@ -148,10 +148,6 @@ export class ContentsPageComponent implements OnDestroy, OnInit {
this.contentsState.create(content.dataDraft, false).pipe(onErrorResumeNext()).subscribe();
}
public isSelectedQuery(query: string) {
return query === this.contentsState.snapshot.contentsQuery || (!query && !this.contentsState.snapshot.contentsQuery);
}
private changeContentItems(contents: ContentDto[], action: string) {
if (contents.length === 0) {
return;
@ -167,26 +163,18 @@ export class ContentsPageComponent implements OnDestroy, OnInit {
}
public goArchive(isArchive: boolean) {
this.resetSelection();
this.contentsState.goArchive(isArchive).pipe(onErrorResumeNext()).subscribe();
}
public goPrev() {
this.resetSelection();
this.contentsState.goPrev().pipe(onErrorResumeNext()).subscribe();
}
public goNext() {
this.resetSelection();
this.contentsState.goNext().pipe(onErrorResumeNext()).subscribe();
}
public search(query: string) {
this.resetSelection();
this.contentsState.search(query).pipe(onErrorResumeNext()).subscribe();
}

2
src/Squidex/app/features/content/pages/schemas/schemas-page.component.html

@ -17,7 +17,7 @@
<ng-container content>
<ng-container *ngIf="schemasState.publishedSchemas | async; let schemas">
<sqx-schema-category *ngFor="let category of schemasState.categories | async; trackBy: trackByCategory"
<sqx-schema-category *ngFor="let category of schemasState.categories | async; trackBy: trackByCategory" suffix="filters"
[name]="category"
[schemas]="schemas"
[schemasFilter]="schemasFilter.valueChanges | async"

23
src/Squidex/app/shared/components/schema-category.component.ts

@ -46,6 +46,9 @@ export class SchemaCategoryComponent implements OnInit, OnChanges {
@Input()
public schemas: ImmutableArray<SchemaDto>;
@Input()
public suffix: string;
public displayName: string;
public schemasFiltered: ImmutableArray<SchemaDto>;
@ -75,9 +78,13 @@ export class SchemaCategoryComponent implements OnInit, OnChanges {
public ngOnChanges(changes: SimpleChanges): void {
if (changes['schemas'] || changes['schemasFilter']) {
const isSameCategory = (schema: SchemaDto) => {
return (!this.name && !schema.category) || schema.category === this.name;
};
const query = this.schemasFilter;
this.schemasForCategory = this.schemas.filter(x => this.isSameCategory(x));
this.schemasForCategory = this.schemas.filter(x => isSameCategory(x));
this.schemasFiltered = this.schemasForCategory.filter(x => !query || x.name.indexOf(query) >= 0);
if (query) {
@ -96,6 +103,16 @@ export class SchemaCategoryComponent implements OnInit, OnChanges {
}
}
public schemaRoute(schema: SchemaDto) {
if (schema.isSingleton && this.routeSingletonToContent) {
return [schema.name, schema.id];
} else if (this.suffix) {
return [schema.name, this.suffix];
} else {
return [schema.name];
}
}
private isSameCategory(schema: SchemaDto): boolean {
return (!this.name && !schema.category) || schema.category === this.name;
}
@ -108,10 +125,6 @@ export class SchemaCategoryComponent implements OnInit, OnChanges {
return `?squidex.apps.{app}.schemas.${schema.name}.*;squidex.apps.{app}.contents.${schema.name}.*`;
}
public schemaRoute(schema: SchemaDto) {
return schema.isSingleton && this.routeSingletonToContent ? [schema.name, schema.id] : [schema.name];
}
public trackBySchema(index: number, schema: SchemaDto) {
return schema.id;
}

2
src/Squidex/app/shell/pages/app/left-menu.component.html

@ -10,7 +10,7 @@
</a>
</li>
<li class="nav-item" *sqxPermission="'squidex.apps.{app}.assets.read'">
<a class="nav-link" routerLink="assets" routerLinkActive="active">
<a class="nav-link" routerLink="assets/filters" routerLinkActive="active">
<i class="nav-icon icon-assets"></i> <div class="nav-text">Assets</div>
</a>
</li>

11
src/Squidex/app/theme/_panels.scss

@ -292,17 +292,14 @@
}
}
&-section {
border-top: 1px solid $color-border;
padding: 15px;
padding-bottom: 30px;
}
&-item {
& {
padding: .25rem 0;
@include border-radius;
padding: .25rem 1rem;
display: block;
font-size: .9rem;
font-weight: normal;
margin-bottom: .25rem;
}
&-remove {

Loading…
Cancel
Save