- {{ "Principal Investigator" | translate }} |
+ Principal investigator |
{{ proposal.pi_firstname }} {{ proposal.pi_lastname }}
science
- {{ "Metadata" | translate }}
+ Metadata
diff --git a/src/app/proposals/proposal-detail/proposal-detail.component.spec.ts b/src/app/proposals/proposal-detail/proposal-detail.component.spec.ts
index dedd01543..890919ca7 100644
--- a/src/app/proposals/proposal-detail/proposal-detail.component.spec.ts
+++ b/src/app/proposals/proposal-detail/proposal-detail.component.spec.ts
@@ -7,17 +7,6 @@ import { MatButtonModule } from "@angular/material/button";
import { NgxJsonViewerModule } from "ngx-json-viewer";
import { AppConfigService } from "app-config.service";
import { StoreModule } from "@ngrx/store";
-import {
- TranslateLoader,
- TranslateModule,
- TranslationObject,
-} from "@ngx-translate/core";
-import { Observable, of } from "rxjs";
-class MockTranslateLoader implements TranslateLoader {
- getTranslation(): Observable {
- return of({});
- }
-}
const getConfig = () => ({
jsonMetadataEnabled: true,
@@ -36,23 +25,12 @@ describe("ProposalsDetailComponent", () => {
MatIconModule,
NgxJsonViewerModule,
StoreModule.forRoot({}),
- TranslateModule.forRoot({
- loader: {
- provide: TranslateLoader,
- useClass: MockTranslateLoader,
- },
- }),
],
declarations: [ProposalDetailComponent],
});
TestBed.overrideComponent(ProposalDetailComponent, {
set: {
- providers: [
- {
- provide: AppConfigService,
- useValue: { getConfig },
- },
- ],
+ providers: [{ provide: AppConfigService, useValue: { getConfig } }],
},
});
TestBed.compileComponents();
diff --git a/src/app/proposals/proposal-detail/proposal-detail.component.ts b/src/app/proposals/proposal-detail/proposal-detail.component.ts
index d6d0577fa..fdeaa28a8 100644
--- a/src/app/proposals/proposal-detail/proposal-detail.component.ts
+++ b/src/app/proposals/proposal-detail/proposal-detail.component.ts
@@ -21,7 +21,6 @@ import {
selectProfile,
} from "state-management/selectors/user.selectors";
import { clearProposalsStateAction } from "state-management/actions/proposals.actions";
-import { TranslateService } from "@ngx-translate/core";
@Component({
selector: "proposal-detail",
@@ -47,12 +46,9 @@ export class ProposalDetailComponent implements OnInit, OnDestroy {
constructor(
public appConfigService: AppConfigService,
- private translateService: TranslateService,
private store: Store,
private router: Router,
- ) {
- this.translateService.use("proposalDefault");
- }
+ ) {}
ngOnInit(): void {
// Prevent user from reloading page if there are unsave changes
diff --git a/src/app/proposals/proposal-logbook/proposal-logbook.component.html b/src/app/proposals/proposal-logbook/proposal-logbook.component.html
index 7b1c2afa6..e4334ed93 100644
--- a/src/app/proposals/proposal-logbook/proposal-logbook.component.html
+++ b/src/app/proposals/proposal-logbook/proposal-logbook.component.html
@@ -1,4 +1,4 @@
-
+
diff --git a/src/app/proposals/proposal-logbook/proposal-logbook.component.ts b/src/app/proposals/proposal-logbook/proposal-logbook.component.ts
index 286bba2d1..a251957f5 100644
--- a/src/app/proposals/proposal-logbook/proposal-logbook.component.ts
+++ b/src/app/proposals/proposal-logbook/proposal-logbook.component.ts
@@ -7,8 +7,8 @@ import {
AfterViewChecked,
} from "@angular/core";
import { Store } from "@ngrx/store";
-import { Subscription } from "rxjs";
-import { selectLogbooksDashboardPageViewModel } from "state-management/selectors/logbooks.selectors";
+import { Observable, Subscription, take } from "rxjs";
+import { selectCurrentLogbook } from "state-management/selectors/logbooks.selectors";
import {
fetchLogbookAction,
setTextFilterAction,
@@ -41,11 +41,11 @@ export interface LogbookData {
export class ProposalLogbookComponent
implements OnInit, OnDestroy, AfterViewChecked
{
- logbook$ = this.store.select(selectLogbooksDashboardPageViewModel);
+ logbook$: Observable = this.store.select(selectCurrentLogbook);
appConfig = this.appConfigService.getConfig();
subscriptions: Subscription[] = [];
- @Input() proposalId: string;
+ @Input() logbook: LogbookData | null = null; // Still accepting input from parent if provided
constructor(
public appConfigService: AppConfigService,
@@ -87,7 +87,13 @@ export class ProposalLogbookComponent
}
ngOnInit() {
- this.store.dispatch(fetchLogbookAction({ name: this.proposalId }));
+ if (!this.logbook) {
+ this.logbook$.pipe(take(1)).subscribe((logbook) => {
+ if (logbook && logbook.name) {
+ this.store.dispatch(fetchLogbookAction({ name: logbook.name }));
+ }
+ });
+ }
}
ngAfterViewChecked() {
diff --git a/src/app/proposals/proposals.module.ts b/src/app/proposals/proposals.module.ts
index 71bb4e59a..c983f10cb 100644
--- a/src/app/proposals/proposals.module.ts
+++ b/src/app/proposals/proposals.module.ts
@@ -35,9 +35,6 @@ import { MatNativeDateModule } from "@angular/material/core";
import { LogbookEffects } from "state-management/effects/logbooks.effects";
import { logbooksReducer } from "state-management/reducers/logbooks.reducer";
import { ProposalLogbookComponent } from "./proposal-logbook/proposal-logbook.component";
-import { RelatedProposalsComponent } from "./related-proposals/related-proposals.component";
-import { ProposalDatasetsComponent } from "./proposal-datasets/proposal-datasets.component";
-import { TranslateModule } from "@ngx-translate/core";
@NgModule({
imports: [
@@ -63,7 +60,6 @@ import { TranslateModule } from "@ngx-translate/core";
SharedScicatFrontendModule,
StoreModule.forFeature("proposals", proposalsReducer),
StoreModule.forFeature("logbooks", logbooksReducer),
- TranslateModule,
],
declarations: [
ViewProposalPageComponent,
@@ -71,8 +67,6 @@ import { TranslateModule } from "@ngx-translate/core";
ProposalFilterComponent,
ProposalDashboardComponent,
ProposalLogbookComponent,
- RelatedProposalsComponent,
- ProposalDatasetsComponent,
],
exports: [],
providers: [DatePipe, FileSizePipe, SlicePipe],
diff --git a/src/app/proposals/view-proposal-page/view-proposal-page.component.html b/src/app/proposals/view-proposal-page/view-proposal-page.component.html
index 8e27c1e71..13acc0cce 100644
--- a/src/app/proposals/view-proposal-page/view-proposal-page.component.html
+++ b/src/app/proposals/view-proposal-page/view-proposal-page.component.html
@@ -1,54 +1,38 @@
-
+
details
- {{ "Details" | translate }}
+ Details
-
+
folder
- {{ "Datasets" | translate }}
+ Datasets
-
-
-
-
-
-
-
- folder
- {{ "Related Proposals" | translate }}
-
-
-
-
-
+
book
- {{ "Logbook" | translate }}
+ Logbook
-
-
-
+
diff --git a/src/app/proposals/view-proposal-page/view-proposal-page.component.spec.ts b/src/app/proposals/view-proposal-page/view-proposal-page.component.spec.ts
index 66d6730e9..5684ff2b6 100644
--- a/src/app/proposals/view-proposal-page/view-proposal-page.component.spec.ts
+++ b/src/app/proposals/view-proposal-page/view-proposal-page.component.spec.ts
@@ -1,27 +1,32 @@
import { ViewProposalPageComponent } from "./view-proposal-page.component";
-import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing";
+import {
+ ComponentFixture,
+ TestBed,
+ inject,
+ waitForAsync,
+} from "@angular/core/testing";
import { NO_ERRORS_SCHEMA } from "@angular/core";
-import { MockActivatedRoute } from "shared/MockStubs";
+import {
+ MockStore,
+ MockActivatedRoute,
+ createMock,
+ mockDataset,
+ mockProposal,
+} from "shared/MockStubs";
import { Router, ActivatedRoute } from "@angular/router";
-import { StoreModule } from "@ngrx/store";
+import { StoreModule, Store } from "@ngrx/store";
import { DatePipe, SlicePipe } from "@angular/common";
import { FileSizePipe } from "shared/pipes/filesize.pipe";
+import {
+ changeDatasetsPageAction,
+ fetchProposalDatasetsAction,
+} from "state-management/actions/proposals.actions";
+import { PageChangeEvent } from "shared/modules/table/table.component";
import { MatTabsModule } from "@angular/material/tabs";
import { MatIconModule } from "@angular/material/icon";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { AppConfigService } from "app-config.service";
-import {
- TranslateLoader,
- TranslateModule,
- TranslationObject,
-} from "@ngx-translate/core";
-import { Observable, of } from "rxjs";
-
-class MockTranslateLoader implements TranslateLoader {
- getTranslation(): Observable {
- return of({});
- }
-}
+import { DatasetClass } from "@scicatproject/scicat-sdk-ts-angular";
const getConfig = () => ({
logbookEnabled: true,
@@ -34,6 +39,8 @@ describe("ViewProposalPageComponent", () => {
const router = {
navigateByUrl: jasmine.createSpy("navigateByUrl"),
};
+ let store: MockStore;
+ let dispatchSpy;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
@@ -43,12 +50,6 @@ describe("ViewProposalPageComponent", () => {
BrowserAnimationsModule,
MatIconModule,
MatTabsModule,
- TranslateModule.forRoot({
- loader: {
- provide: TranslateLoader,
- useClass: MockTranslateLoader,
- },
- }),
StoreModule.forRoot({}),
],
providers: [DatePipe, FileSizePipe, SlicePipe],
@@ -71,6 +72,10 @@ describe("ViewProposalPageComponent", () => {
fixture.detectChanges();
});
+ beforeEach(inject([Store], (mockStore: MockStore) => {
+ store = mockStore;
+ }));
+
afterEach(() => {
fixture.destroy();
});
@@ -78,4 +83,57 @@ describe("ViewProposalPageComponent", () => {
it("should create", () => {
expect(component).toBeTruthy();
});
+
+ describe("#formatTableData()", () => {
+ it("should return empty array if there are no datasets", () => {
+ const data = component.formatTableData(null);
+
+ expect(data).toEqual([]);
+ });
+
+ it("should return an array of data objects if there are datasets", () => {
+ const datasets = [mockDataset];
+ const data = component.formatTableData(datasets);
+
+ expect(data.length).toEqual(1);
+ });
+ });
+
+ describe("#onPageChange()", () => {
+ it("should dispatch a changeDatasetsPageAction and a fetchProposalDatasetsAction", () => {
+ dispatchSpy = spyOn(store, "dispatch");
+
+ const proposal = mockProposal;
+ proposal.proposalId = "testId";
+ component.proposal = proposal;
+ const event: PageChangeEvent = {
+ pageIndex: 0,
+ pageSize: 25,
+ length: 25,
+ };
+ component.onPageChange(event);
+
+ expect(dispatchSpy).toHaveBeenCalledTimes(2);
+ expect(dispatchSpy).toHaveBeenCalledWith(
+ changeDatasetsPageAction({
+ page: event.pageIndex,
+ limit: event.pageSize,
+ }),
+ );
+ expect(dispatchSpy).toHaveBeenCalledWith(
+ fetchProposalDatasetsAction({ proposalId: proposal.proposalId }),
+ );
+ });
+ });
+
+ describe("#onRowClick()", () => {
+ it("should navigate to a dataset", () => {
+ const dataset = createMock({});
+ const pid = encodeURIComponent(dataset.pid);
+ component.onRowClick(dataset);
+
+ expect(router.navigateByUrl).toHaveBeenCalledTimes(1);
+ expect(router.navigateByUrl).toHaveBeenCalledWith("/datasets/" + pid);
+ });
+ });
});
diff --git a/src/app/proposals/view-proposal-page/view-proposal-page.component.ts b/src/app/proposals/view-proposal-page/view-proposal-page.component.ts
index f1ff0c17a..e4a5bebd4 100644
--- a/src/app/proposals/view-proposal-page/view-proposal-page.component.ts
+++ b/src/app/proposals/view-proposal-page/view-proposal-page.component.ts
@@ -4,13 +4,36 @@ import { Store } from "@ngrx/store";
import { Subscription } from "rxjs";
import {
fetchProposalAction,
+ fetchProposalDatasetsAction,
+ changeDatasetsPageAction,
fetchParentProposalAction,
clearProposalsStateAction,
} from "state-management/actions/proposals.actions";
import { selectViewProposalPageViewModel } from "state-management/selectors/proposals.selectors";
+import {
+ TableColumn,
+ PageChangeEvent,
+} from "shared/modules/table/table.component";
+import { DatePipe, SlicePipe } from "@angular/common";
+import { FileSizePipe } from "shared/pipes/filesize.pipe";
+import { fetchLogbookAction } from "state-management/actions/logbooks.actions";
import { AppConfigService } from "app-config.service";
-import { ProposalClass } from "@scicatproject/scicat-sdk-ts-angular";
-import { TranslateService } from "@ngx-translate/core";
+import { selectLogbooksDashboardPageViewModel } from "state-management/selectors/logbooks.selectors";
+import {
+ DatasetClass,
+ OutputDatasetObsoleteDto,
+ ProposalClass,
+} from "@scicatproject/scicat-sdk-ts-angular";
+
+export interface TableData {
+ pid: string;
+ name: string;
+ sourceFolder: string;
+ size: string;
+ creationTime: string | null;
+ owner: string;
+ location: string;
+}
@Component({
selector: "view-proposal-page",
@@ -19,19 +42,32 @@ import { TranslateService } from "@ngx-translate/core";
})
export class ViewProposalPageComponent implements OnInit, OnDestroy {
vm$ = this.store.select(selectViewProposalPageViewModel);
+ logbook$ = this.store.select(selectLogbooksDashboardPageViewModel);
appConfig = this.appConfigService.getConfig();
+
proposal: ProposalClass;
+
subscriptions: Subscription[] = [];
- public selectedTabIndex = 0;
+
+ tablePaginate = true;
+ tableData: TableData[] = [];
+ tableColumns: TableColumn[] = [
+ { name: "name", icon: "portrait", sort: false, inList: true },
+ { name: "sourceFolder", icon: "explore", sort: false, inList: true },
+ { name: "size", icon: "save", sort: false, inList: true },
+ { name: "creationTime", icon: "calendar_today", sort: false, inList: true },
+ { name: "owner", icon: "face", sort: false, inList: true },
+ { name: "location", icon: "explore", sort: false, inList: true },
+ ];
constructor(
public appConfigService: AppConfigService,
+ private datePipe: DatePipe,
+ private filesizePipe: FileSizePipe,
private route: ActivatedRoute,
- private store: Store,
private router: Router,
- private translateService: TranslateService,
- ) {
- this.translateService.use("proposalDefault");
+ private slicePipe: SlicePipe,
+ private store: Store,
}
ngOnInit() {
@@ -42,7 +78,7 @@ export class ViewProposalPageComponent implements OnInit, OnDestroy {
if (
this.proposal["parentProposalId"] &&
- this.selectedTabIndex === 0
+ this.proposal["parentProposalId"] !== ""
) {
this.fetchProposalRelatedDocuments();
}
@@ -53,22 +89,13 @@ export class ViewProposalPageComponent implements OnInit, OnDestroy {
this.subscriptions.push(
this.route.params.subscribe((params) => {
this.store.dispatch(fetchProposalAction({ proposalId: params.id }));
- this.resetTabs();
+ this.store.dispatch(
+ fetchProposalDatasetsAction({ proposalId: params.id }),
+ );
+ this.store.dispatch(fetchLogbookAction({ name: params.id }));
}),
);
- }
-
- onTabChanged(newIndex: number): void {
- this.selectedTabIndex = newIndex;
-
- // Clear the query params when we change tab
- this.router.navigate([], {
- queryParams: {},
- });
- }
- resetTabs(): void {
- this.selectedTabIndex = 0;
}
fetchProposalRelatedDocuments(): void {
diff --git a/src/app/publisheddata/publisheddata-details/publisheddata-details.component.html b/src/app/publisheddata/publisheddata-details/publisheddata-details.component.html
index 03c53a276..2e04f39e9 100644
--- a/src/app/publisheddata/publisheddata-details/publisheddata-details.component.html
+++ b/src/app/publisheddata/publisheddata-details/publisheddata-details.component.html
@@ -20,7 +20,7 @@
>
Registered Time |
- {{ value | date }} |
+ {{ value | date: "yyyy-MM-dd, HH:mm" }} |
|