File

src/lib/changelog/changelog.component.ts

Implements

OnInit

Metadata

Index

Properties

Properties

Public Readonly activeIndex
Default value : signal(-1)
Public Readonly application
Default value : inject(RXAP_ENVIRONMENT).app
Public Readonly availableVersions
Default value : signal<string[]>([])
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], }), ); })
Public Readonly error
Default value : signal<string | null>(null)
Public Readonly getChangelogMethod
Default value : inject(ChangelogControllerGetVersionRemoteMethod)
Public Readonly getChangelogMethodParameters
Default value : computed(() => ({ parameters: { version: this.selectedVersion(), application: this.application, }, }))
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'; })
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

Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""