diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index 8785c17..a5db162 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -1489,8 +1489,8 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo-api" -version = "0.17.0" -source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=d81648edc0b6b03f8a0c6ab90854a9e7a3376d00#d81648edc0b6b03f8a0c6ab90854a9e7a3376d00" +version = "0.18.0" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=c5f2bfa48e822e9a761191c9a7ef42e2dbf811b5#c5f2bfa48e822e9a761191c9a7ef42e2dbf811b5" dependencies = [ "async-trait", "bromine", diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index f8a5b20..7da683f 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -25,7 +25,7 @@ features = [ "env-filter" ] [dependencies.mediarepo-api] git = "https://github.com/Trivernis/mediarepo-api.git" -rev = "d81648edc0b6b03f8a0c6ab90854a9e7a3376d00" +rev = "c5f2bfa48e822e9a761191c9a7ef42e2dbf811b5" features = [ "tauri-plugin" ] [features] diff --git a/mediarepo-ui/src/app/components/core/core.module.ts b/mediarepo-ui/src/app/components/core/core.module.ts index b271819..f771cbb 100644 --- a/mediarepo-ui/src/app/components/core/core.module.ts +++ b/mediarepo-ui/src/app/components/core/core.module.ts @@ -45,6 +45,8 @@ import { import { RepositoryModule } from "../shared/repository/repository/repository.module"; +import {MatToolbarModule} from "@angular/material/toolbar"; +import { RepositoryDetailsViewComponent } from './repositories-tab/repository-details-view/repository-details-view.component'; @NgModule({ @@ -57,6 +59,7 @@ import { ImportTabSidebarComponent, RepositoryCardComponent, DownloadDaemonDialogComponent, + RepositoryDetailsViewComponent, ], exports: [ CoreComponent, @@ -88,6 +91,7 @@ import { MatInputModule, TagModule, RepositoryModule, + MatToolbarModule, ] }) export class CoreModule { diff --git a/mediarepo-ui/src/app/components/core/repositories-tab/repositories-tab.component.html b/mediarepo-ui/src/app/components/core/repositories-tab/repositories-tab.component.html index fa06f63..67204d1 100644 --- a/mediarepo-ui/src/app/components/core/repositories-tab/repositories-tab.component.html +++ b/mediarepo-ui/src/app/components/core/repositories-tab/repositories-tab.component.html @@ -1,4 +1,4 @@ -
+
@@ -8,3 +8,6 @@
+
+ +
diff --git a/mediarepo-ui/src/app/components/core/repositories-tab/repositories-tab.component.ts b/mediarepo-ui/src/app/components/core/repositories-tab/repositories-tab.component.ts index 1159d5c..d377166 100644 --- a/mediarepo-ui/src/app/components/core/repositories-tab/repositories-tab.component.ts +++ b/mediarepo-ui/src/app/components/core/repositories-tab/repositories-tab.component.ts @@ -17,7 +17,8 @@ import { styleUrls: ["./repositories-tab.component.scss"] }) export class RepositoriesTabComponent implements OnInit, AfterViewInit { - repositories: Repository[] = []; + public repositories: Repository[] = []; + public selectedRepository?: Repository; constructor( private repoService: RepositoryService, @@ -31,13 +32,13 @@ export class RepositoriesTabComponent implements OnInit, AfterViewInit { this.repositories = repos; } }); + this.repoService.selectedRepository.subscribe(repo => this.selectedRepository = repo); } public async ngAfterViewInit() { await this.checkAndPromptDaemonExecutable(); } - public openAddRepositoryDialog() { this.dialog.open(AddRepositoryDialogComponent, { disableClose: true, diff --git a/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.html b/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.html new file mode 100644 index 0000000..fce4e34 --- /dev/null +++ b/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.html @@ -0,0 +1,22 @@ + + {{repository.name}} + + +
+
+

Stats

+ + + + + + + + + + + + + +
+
diff --git a/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.scss b/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.scss new file mode 100644 index 0000000..27366f6 --- /dev/null +++ b/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.scss @@ -0,0 +1,9 @@ +.repository-name { + text-align: center; + align-self: center; + margin: auto; +} + +.button-close-repository { + float: right +} diff --git a/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.spec.ts b/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.spec.ts new file mode 100644 index 0000000..2b105dc --- /dev/null +++ b/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RepositoryDetailsViewComponent } from './repository-details-view.component'; + +describe('RepositoryDetailsViewComponent', () => { + let component: RepositoryDetailsViewComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RepositoryDetailsViewComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RepositoryDetailsViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.ts b/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.ts new file mode 100644 index 0000000..d335e0f --- /dev/null +++ b/mediarepo-ui/src/app/components/core/repositories-tab/repository-details-view/repository-details-view.component.ts @@ -0,0 +1,63 @@ +import { + Component, + Input, + OnChanges, + OnInit, + SimpleChanges +} from "@angular/core"; +import {Repository} from "../../../../models/Repository"; +import { + RepositoryService +} from "../../../../services/repository/repository.service"; +import {RepositoryMetadata} from "../../../../models/RepositoryMetadata"; + +@Component({ + selector: "app-repository-details-view", + templateUrl: "./repository-details-view.component.html", + styleUrls: ["./repository-details-view.component.scss"] +}) +export class RepositoryDetailsViewComponent implements OnInit, OnChanges { + @Input() repository!: Repository; + + public metadata?: RepositoryMetadata; + + constructor(private repoService: RepositoryService) { + } + + public async ngOnInit() { + this.metadata = await this.repoService.getRepositoryMetadata(); + } + + public async ngOnChanges(changes: SimpleChanges) { + if (changes["repository"]) { + this.metadata = await this.repoService.getRepositoryMetadata(); + } + } + + public async closeRepository() { + if (this.repository?.local) { + await this.repoService.closeSelectedRepository(); + } else { + await this.repoService.disconnectSelectedRepository(); + } + } + + public formatByteSize(size: number): string { + const kib = 1024; + const mib = kib ** 2; + const gib = kib ** 3; + const tib = kib ** 4; + + if (size >= tib) { + return (size / tib).toFixed(2) + " TiB"; + } else if (size >= gib) { + return (size / gib).toFixed(2) + " GiB"; + } else if (size >= mib) { + return (size / mib).toFixed(2) + " MiB"; + } else if (size >= kib) { + return (size / kib).toFixed(2) + " KiB"; + } else { + return size + " B" + } + } +} diff --git a/mediarepo-ui/src/app/components/shared/app-common/app-common.module.ts b/mediarepo-ui/src/app/components/shared/app-common/app-common.module.ts index 6bc8863..413538c 100644 --- a/mediarepo-ui/src/app/components/shared/app-common/app-common.module.ts +++ b/mediarepo-ui/src/app/components/shared/app-common/app-common.module.ts @@ -16,6 +16,9 @@ import { ContentAwareImageComponent } from "./content-aware-image/content-aware-image.component"; import { InputReceiverDirective } from "./input-receiver/input-receiver.directive"; +import { + MetadataEntryComponent +} from "./metadata-entry/metadata-entry.component"; @NgModule({ @@ -25,6 +28,7 @@ import { InputReceiverDirective } from "./input-receiver/input-receiver.directiv ContextMenuComponent, ContentAwareImageComponent, InputReceiverDirective, + MetadataEntryComponent, ], exports: [ ConfirmDialogComponent, @@ -32,6 +36,7 @@ import { InputReceiverDirective } from "./input-receiver/input-receiver.directiv ContextMenuComponent, ContentAwareImageComponent, InputReceiverDirective, + MetadataEntryComponent, ], imports: [ CommonModule, diff --git a/mediarepo-ui/src/app/components/shared/sidebar/file-metadata/metadata-entry/metadata-entry.component.html b/mediarepo-ui/src/app/components/shared/app-common/metadata-entry/metadata-entry.component.html similarity index 100% rename from mediarepo-ui/src/app/components/shared/sidebar/file-metadata/metadata-entry/metadata-entry.component.html rename to mediarepo-ui/src/app/components/shared/app-common/metadata-entry/metadata-entry.component.html diff --git a/mediarepo-ui/src/app/components/shared/sidebar/file-metadata/metadata-entry/metadata-entry.component.scss b/mediarepo-ui/src/app/components/shared/app-common/metadata-entry/metadata-entry.component.scss similarity index 100% rename from mediarepo-ui/src/app/components/shared/sidebar/file-metadata/metadata-entry/metadata-entry.component.scss rename to mediarepo-ui/src/app/components/shared/app-common/metadata-entry/metadata-entry.component.scss diff --git a/mediarepo-ui/src/app/components/shared/sidebar/file-metadata/metadata-entry/metadata-entry.component.spec.ts b/mediarepo-ui/src/app/components/shared/app-common/metadata-entry/metadata-entry.component.spec.ts similarity index 100% rename from mediarepo-ui/src/app/components/shared/sidebar/file-metadata/metadata-entry/metadata-entry.component.spec.ts rename to mediarepo-ui/src/app/components/shared/app-common/metadata-entry/metadata-entry.component.spec.ts diff --git a/mediarepo-ui/src/app/components/shared/sidebar/file-metadata/metadata-entry/metadata-entry.component.ts b/mediarepo-ui/src/app/components/shared/app-common/metadata-entry/metadata-entry.component.ts similarity index 100% rename from mediarepo-ui/src/app/components/shared/sidebar/file-metadata/metadata-entry/metadata-entry.component.ts rename to mediarepo-ui/src/app/components/shared/app-common/metadata-entry/metadata-entry.component.ts diff --git a/mediarepo-ui/src/app/components/shared/sidebar/sidebar.module.ts b/mediarepo-ui/src/app/components/shared/sidebar/sidebar.module.ts index fec6664..0fe4404 100644 --- a/mediarepo-ui/src/app/components/shared/sidebar/sidebar.module.ts +++ b/mediarepo-ui/src/app/components/shared/sidebar/sidebar.module.ts @@ -44,7 +44,7 @@ import {MatMenuModule} from "@angular/material/menu"; import {FileMetadataComponent} from "./file-metadata/file-metadata.component"; import { MetadataEntryComponent -} from "./file-metadata/metadata-entry/metadata-entry.component"; +} from "../app-common/metadata-entry/metadata-entry.component"; import { EditableMetadataEntryComponent } from "./file-metadata/editable-metadata-entry/editable-metadata-entry.component"; @@ -62,7 +62,6 @@ import {MatAutocompleteModule} from "@angular/material/autocomplete"; FileImportComponent, FilesystemImportComponent, FileMetadataComponent, - MetadataEntryComponent, EditableMetadataEntryComponent, ], exports: [ diff --git a/mediarepo-ui/src/app/models/RepositoryMetadata.ts b/mediarepo-ui/src/app/models/RepositoryMetadata.ts new file mode 100644 index 0000000..86d35ea --- /dev/null +++ b/mediarepo-ui/src/app/models/RepositoryMetadata.ts @@ -0,0 +1,12 @@ +export type RepositoryMetadata = { + version: string, + file_count: number, + tag_count: number, + namespace_count: number, + mapping_count: number, + hash_count: number, + total_size: number, + file_size: number, + database_size: number, + thumbnail_size: number, +}; diff --git a/mediarepo-ui/src/app/services/repository/repository.service.ts b/mediarepo-ui/src/app/services/repository/repository.service.ts index 62ea3ea..c746a62 100644 --- a/mediarepo-ui/src/app/services/repository/repository.service.ts +++ b/mediarepo-ui/src/app/services/repository/repository.service.ts @@ -6,6 +6,7 @@ import {listen} from "@tauri-apps/api/event"; import {Info} from "../../models/Info"; import {ErrorBrokerService} from "../error-broker/error-broker.service"; import {FileService} from "../file/file.service"; +import {RepositoryMetadata} from "../../models/RepositoryMetadata"; @Injectable({ providedIn: "root" @@ -163,6 +164,14 @@ export class RepositoryService { await invoke("plugin:mediarepo|init_repository", {repoPath}); } + /** + * Retrieves metadata about the selected repository + * @returns {Promise} + */ + public async getRepositoryMetadata(): Promise { + return await invoke("plugin:mediarepo|get_repo_metadata"); + } + async loadSelectedRepository() { let active_repo = await invoke( "plugin:mediarepo|get_active_repository");