import { Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MatTable, MatTableModule } from '@angular/material/table';
import { MatTooltipModule } from '@angular/material/tooltip';
import { Router } from '@angular/router';
import { CobblerApiService, Package } from 'cobbler-api';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { DialogItemRenameComponent } from '../../../common/dialog-item-rename/dialog-item-rename.component';
import { UserService } from '../../../services/user.service';
import Utils from '../../../utils';
import { PackageCreateComponent } from '../create/package-create.component';
@Component({
selector: 'cobbler-package-overview',
standalone: true,
imports: [
MatTableModule,
MatIconModule,
MatButtonModule,
MatMenuModule,
MatTooltipModule,
],
templateUrl: './package-overview.component.html',
styleUrl: './package-overview.component.scss',
})
export class PackageOverviewComponent implements OnInit, OnDestroy {
private ngUnsubscribe = new Subject<void>();
displayedColumns: string[] = ['name', 'installer', 'version', 'actions'];
dataSource: Array<Package> = [];
@ViewChild(MatTable) table: MatTable<Package>;
constructor(
public userService: UserService,
private cobblerApiService: CobblerApiService,
private _snackBar: MatSnackBar,
private router: Router,
@Inject(MatDialog) readonly dialog: MatDialog,
) {}
ngOnInit(): void {
this.retrievePackages();
}
ngOnDestroy(): void {
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}
private retrievePackages(): void {
this.cobblerApiService
.get_packages()
.pipe(takeUntil(this.ngUnsubscribe))
.subscribe({
next: (value) => {
this.dataSource = value;
},
error: (error) => {
this._snackBar.open(Utils.toHTML(error.message), 'Close');
},
});
}
addPackage(): void {
const dialogRef = this.dialog.open(PackageCreateComponent, {
width: '40%',
});
dialogRef.afterClosed().subscribe((result) => {
if (typeof result === 'string') {
this.router.navigate(['/items', 'package', result]);
}
});
}
showPackage(uid: string, name: string): void {
this.router.navigate(['/items', 'package', name]);
}
renamePackage(uid: string, name: string): void {
const dialogRef = this.dialog.open(DialogItemRenameComponent, {
data: {
itemType: 'Repository',
itemName: name,
itemUid: uid,
},
});
dialogRef.afterClosed().subscribe((newItemName) => {
if (newItemName === undefined) {
return;
}
this.cobblerApiService
.get_package_handle(name, this.userService.token)
.pipe(takeUntil(this.ngUnsubscribe))
.subscribe({
next: (packageHandle) => {
this.cobblerApiService
.rename_package(
packageHandle,
newItemName,
this.userService.token,
)
.pipe(takeUntil(this.ngUnsubscribe))
.subscribe({
next: () => {
this.retrievePackages();
},
error: (error) => {
this._snackBar.open(Utils.toHTML(error.message), 'Close');
},
});
},
error: (error) => {
this._snackBar.open(Utils.toHTML(error.message), 'Close');
},
});
});
}
deletePackage(uid: string, name: string): void {
this.cobblerApiService
.remove_package(name, this.userService.token, false)
.pipe(takeUntil(this.ngUnsubscribe))
.subscribe({
next: () => {
this.retrievePackages();
},
error: (error) => {
this._snackBar.open(Utils.toHTML(error.message), 'Close');
},
});
}
}