src/lib/changelog/changelog.component.ts
OnInit
| selector | rxap-changelog |
| imports |
MethodTemplateDirective
MarkdownModule
NgForOf
NgIf
NgClass
|
| styleUrls | ./changelog.component.scss |
| templateUrl | ./changelog.component.html |
Properties |
|
| Public Readonly activeIndex |
Default value : signal(-1)
|
|
Defined in src/lib/changelog/changelog.component.ts:35
|
| Public Readonly application |
Default value : inject(RXAP_ENVIRONMENT).app
|
|
Defined in src/lib/changelog/changelog.component.ts:70
|
| Public Readonly availableVersions |
Default value : signal<string[]>([])
|
|
Defined in src/lib/changelog/changelog.component.ts:33
|
| Public Readonly displayedButtons |
Default value : computed(() => {
let activeIndex = this.activeIndex();
if (activeIndex === -1) {
activeIndex = this.availableVersions().length - 1;
}
let start = Math.max(0, activeIndex - 2);
let end = Math.min(this.availableVersions().length, activeIndex + 3);
if (end - start < 5) {
if (start === 0) {
end += 5 - (end - start);
} else {
start -= 5 - (end - start);
}
}
end = Math.min(this.availableVersions().length, end);
start = Math.max(0, start);
return Array.from(
{ length: end - start },
(_, i) => ({
index: start + i,
version: this.availableVersions()[start + i],
}),
);
})
|
|
Defined in src/lib/changelog/changelog.component.ts:45
|
| Public Readonly error |
Default value : signal<string | null>(null)
|
|
Defined in src/lib/changelog/changelog.component.ts:34
|
| Public Readonly getChangelogMethod |
Default value : inject(ChangelogControllerGetVersionRemoteMethod)
|
|
Defined in src/lib/changelog/changelog.component.ts:72
|
| Public Readonly getChangelogMethodParameters |
Default value : computed(() => ({
parameters: {
version: this.selectedVersion(),
application: this.application,
},
}))
|
|
Defined in src/lib/changelog/changelog.component.ts:74
|
| Public Readonly selectedVersion |
Default value : computed(() => {
const activeIndex = this.activeIndex();
const availableVersions = this.availableVersions();
if (activeIndex > -1) {
return availableVersions[activeIndex] ?? 'latest';
}
return availableVersions[availableVersions.length - 1] ?? 'latest';
})
|
|
Defined in src/lib/changelog/changelog.component.ts:36
|
import {
NgClass,
NgForOf,
NgIf,
} from '@angular/common';
import {
Component,
computed,
inject,
OnInit,
signal,
} from '@angular/core';
import { MethodTemplateDirective } from '@rxap/directives';
import { RXAP_ENVIRONMENT } from '@rxap/environment';
import { MarkdownModule } from 'ngx-markdown';
import { ChangelogControllerGetVersionRemoteMethod } from '../openapi/remote-methods/changelog-controller-get-version.remote-method';
import { ChangelogControllerListRemoteMethod } from '../openapi/remote-methods/changelog-controller-list.remote-method';
@Component({
selector: 'rxap-changelog',
imports: [
MethodTemplateDirective,
MarkdownModule,
NgForOf,
NgIf,
NgClass,
],
templateUrl: './changelog.component.html',
styleUrls: ['./changelog.component.scss']
})
export class ChangelogComponent implements OnInit {
public readonly availableVersions = signal<string[]>([]);
public readonly error = signal<string | null>(null);
public readonly activeIndex = signal(-1);
public readonly selectedVersion = computed(() => {
const activeIndex = this.activeIndex();
const availableVersions = this.availableVersions();
if (activeIndex > -1) {
return availableVersions[activeIndex] ?? 'latest';
}
return availableVersions[availableVersions.length - 1] ?? 'latest';
});
public readonly displayedButtons = computed(() => {
let activeIndex = this.activeIndex();
if (activeIndex === -1) {
activeIndex = this.availableVersions().length - 1;
}
let start = Math.max(0, activeIndex - 2);
let end = Math.min(this.availableVersions().length, activeIndex + 3);
if (end - start < 5) {
if (start === 0) {
end += 5 - (end - start);
} else {
start -= 5 - (end - start);
}
}
end = Math.min(this.availableVersions().length, end);
start = Math.max(0, start);
return Array.from(
{ length: end - start },
(_, i) => ({
index: start + i,
version: this.availableVersions()[start + i],
}),
);
});
public readonly application = inject(RXAP_ENVIRONMENT).app;
public readonly getChangelogMethod = inject(ChangelogControllerGetVersionRemoteMethod);
public readonly getChangelogMethodParameters = computed(() => ({
parameters: {
version: this.selectedVersion(),
application: this.application,
},
}));
private readonly getAvailableVersionsMethod = inject(ChangelogControllerListRemoteMethod);
ngOnInit() {
this.loadAvailableVersions();
}
private async loadAvailableVersions() {
try {
const availableVersions = await this.getAvailableVersionsMethod.call();
this.availableVersions.set(availableVersions);
this.activeIndex.set(availableVersions.length - 1);
} catch (e: any) {
this.error.set(e.message);
}
}
}
<ng-container *ngIf="error(); else noError">
<h2 class="text-2xl pb-2" i18n>Something has gone wrong!</h2>
<p i18n>Unable to load the application changelog</p>
</ng-container>
<ng-template #noError>
<div class="flex flex-col gap-3">
<ng-container *ngIf="availableVersions().length">
<div class="controls flex justify-center space-x-2 my-4">
<button
(click)="activeIndex.set(activeIndex() - 1)"
[disabled]="activeIndex() <= 0"
[ngClass]="{
'bg-gray-100 dark:bg-gray-900': activeIndex() <= 0,
'hover:bg-gray-300': activeIndex() > 0,
}"
class="px-4 py-2 bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-900 transition-colors duration-150 rounded">Previous
</button>
<button (click)="activeIndex.set(item.index)"
*ngFor="let item of displayedButtons()"
[ngClass]="{
'bg-primary-500': item.index === activeIndex(),
'bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-900 hover:bg-gray-300 transition-colors duration-150': item.index !== activeIndex()
}"
class="px-4 py-2 rounded">
{{ item.version }}
</button>
<button
(click)="activeIndex.set(activeIndex() + 1)"
[disabled]="activeIndex() >= availableVersions().length - 1"
[ngClass]="{
'bg-gray-100 dark:bg-gray-900': activeIndex() >= availableVersions().length - 1,
'hover:bg-gray-300': activeIndex() < availableVersions().length - 1,
}"
class="px-4 py-2 bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-900 hover:bg-gray-300 transition-colors duration-150 rounded">Next
</button>
</div>
<hr>
</ng-container>
<div class="flex flex-col gap-6 p-8 overflow-auto" style="max-height: 60vh">
<ng-container *rxapMethod="let changelog call getChangelogMethod; parameters: getChangelogMethodParameters()">
<markdown *ngFor="let general of changelog.general" [data]="general" class="prose dark:prose-invert">
</markdown>
<markdown *ngFor="let application of changelog.application" [data]="application" class="prose dark:prose-invert">
</markdown>
</ng-container>
</div>
</div>
</ng-template>
./changelog.component.scss