mirror of https://github.com/Squidex/squidex.git
Browse Source
* First implementation. * Tests simplified. * API test and UI fixes * References view. * Improve tests. * Formatting. * Fix formatting.pull/965/head
committed by
GitHub
26 changed files with 572 additions and 335 deletions
@ -0,0 +1,52 @@ |
|||||
|
<sqx-title message="i18n:common.references"></sqx-title> |
||||
|
|
||||
|
<sqx-layout layout="main" titleText="i18n:common.references" titleIcon="contents"> |
||||
|
<ng-container menu> |
||||
|
<div class="row flex-nowrap flex-grow-1 gx-2"> |
||||
|
<div class="col-auto ms-8"> |
||||
|
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="i18n:contents.refreshTooltip" shortcut="CTRL + B"> |
||||
|
<i class="icon-reset"></i> {{ 'common.refresh' | sqxTranslate }} |
||||
|
</button> |
||||
|
</div> |
||||
|
<div class="col-auto" *ngIf="languages.length > 1"> |
||||
|
<sqx-language-selector class="languages-buttons" |
||||
|
(languageChange)="changeLanguage($event)" |
||||
|
[language]="language" |
||||
|
[languages]="languages"> |
||||
|
</sqx-language-selector> |
||||
|
</div> |
||||
|
</div> |
||||
|
</ng-container> |
||||
|
|
||||
|
<ng-container> |
||||
|
<sqx-list-view [isLoading]="contentsState.isLoading | async" [table]="true"> |
||||
|
<ng-container> |
||||
|
<table class="table table-items table-fixed" *ngIf="contentsState.contents | async; let contents"> |
||||
|
<tbody *ngFor="let content of contents; trackBy: trackByContent" |
||||
|
[sqxReferenceItem]="content" |
||||
|
[canRemove]="false" |
||||
|
[columns]="contents | sqxContentsColumns" |
||||
|
[isCompact]="false" |
||||
|
[isDisabled]="false" |
||||
|
[language]="language" |
||||
|
[languages]="languages" |
||||
|
[validations]="(contentsState.validationResults | async)!" |
||||
|
[validityVisible]="true"> |
||||
|
</tbody> |
||||
|
|
||||
|
<tbody *ngIf="(contentsState.isLoaded | async) && contents.length === 0"> |
||||
|
<tr> |
||||
|
<td class="table-items-row-empty"> |
||||
|
{{ 'contents.noReferencing' | sqxTranslate }} |
||||
|
</td> |
||||
|
</tr> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</ng-container> |
||||
|
|
||||
|
<ng-container footer> |
||||
|
<sqx-pager [paging]="contentsState.paging | async" (pagingChange)="contentsState.page($event)"></sqx-pager> |
||||
|
</ng-container> |
||||
|
</sqx-list-view> |
||||
|
</ng-container> |
||||
|
</sqx-layout> |
||||
@ -0,0 +1,78 @@ |
|||||
|
/* |
||||
|
* Squidex Headless CMS |
||||
|
* |
||||
|
* @license |
||||
|
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. |
||||
|
*/ |
||||
|
|
||||
|
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; |
||||
|
import { ActivatedRoute } from '@angular/router'; |
||||
|
import { distinctUntilChanged, map } from 'rxjs/operators'; |
||||
|
import { AppLanguageDto, ComponentContentsState, ContentDto, LanguagesState, QuerySynchronizer, ResourceOwner, Router2State } from '@app/shared'; |
||||
|
|
||||
|
@Component({ |
||||
|
selector: 'sqx-references-page', |
||||
|
styleUrls: ['./references-page.component.scss'], |
||||
|
templateUrl: './references-page.component.html', |
||||
|
changeDetection: ChangeDetectionStrategy.OnPush, |
||||
|
providers: [ |
||||
|
Router2State, ComponentContentsState, |
||||
|
], |
||||
|
}) |
||||
|
export class ReferencesPageComponent extends ResourceOwner implements OnInit { |
||||
|
public language!: AppLanguageDto; |
||||
|
public languages!: ReadonlyArray<AppLanguageDto>; |
||||
|
|
||||
|
constructor( |
||||
|
public readonly contentsRoute: Router2State, |
||||
|
public readonly contentsState: ComponentContentsState, |
||||
|
public readonly languagesState: LanguagesState, |
||||
|
private readonly route: ActivatedRoute, |
||||
|
) { |
||||
|
super(); |
||||
|
} |
||||
|
|
||||
|
public ngOnInit() { |
||||
|
this.own( |
||||
|
this.languagesState.isoMasterLanguage |
||||
|
.subscribe(language => { |
||||
|
this.language = language; |
||||
|
})); |
||||
|
|
||||
|
this.own( |
||||
|
this.languagesState.isoLanguages |
||||
|
.subscribe(languages => { |
||||
|
this.languages = languages; |
||||
|
})); |
||||
|
|
||||
|
this.own( |
||||
|
getReferenceId(this.route) |
||||
|
.subscribe(referenceId => { |
||||
|
const initial = |
||||
|
this.contentsRoute.mapTo(this.contentsState) |
||||
|
.withPaging('contents', 10) |
||||
|
.withSynchronizer(QuerySynchronizer.INSTANCE) |
||||
|
.getInitial(); |
||||
|
|
||||
|
this.contentsState.schema = { name: null! }; |
||||
|
this.contentsState.loadReferences(referenceId, initial); |
||||
|
this.contentsRoute.listen(); |
||||
|
})); |
||||
|
} |
||||
|
|
||||
|
public reload() { |
||||
|
this.contentsState.load(true); |
||||
|
} |
||||
|
|
||||
|
public changeLanguage(language: AppLanguageDto) { |
||||
|
this.language = language; |
||||
|
} |
||||
|
|
||||
|
public trackByContent(_index: number, content: ContentDto) { |
||||
|
return content.id; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function getReferenceId(route: ActivatedRoute) { |
||||
|
return route.params.pipe(map(x => x['referenceId'] as string), distinctUntilChanged()); |
||||
|
} |
||||
Loading…
Reference in new issue