diff --git a/src/app/datasets/datafiles-actions/datafiles-action.component.ts b/src/app/datasets/datafiles-actions/datafiles-action.component.ts index e710dc544b..c9f5c9a21c 100644 --- a/src/app/datasets/datafiles-actions/datafiles-action.component.ts +++ b/src/app/datasets/datafiles-actions/datafiles-action.component.ts @@ -101,6 +101,8 @@ export class DatafilesActionComponent implements OnInit, OnChanges { this.prepare_disabled_condition(); const expr = this.disabled_condition; + // Note: 'with' has been deprecated and is considered harmful. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with const fn = new Function("ctx", `with (ctx) { return (${expr}); }`); return fn({ diff --git a/src/app/datasets/dataset-detail/dataset-detail-dynamic/dataset-detail-dynamic.component.ts b/src/app/datasets/dataset-detail/dataset-detail-dynamic/dataset-detail-dynamic.component.ts index 8e8ac7f112..7e1a0948cb 100644 --- a/src/app/datasets/dataset-detail/dataset-detail-dynamic/dataset-detail-dynamic.component.ts +++ b/src/app/datasets/dataset-detail/dataset-detail-dynamic/dataset-detail-dynamic.component.ts @@ -7,6 +7,7 @@ import { Subscription } from "rxjs"; import { showMessageAction } from "state-management/actions/user.actions"; import { selectCurrentAttachments, + selectCurrentDatasetExternalLinks, selectCurrentDataset, selectCurrentDatasetWithoutFileInfo, } from "state-management/selectors/datasets.selectors"; @@ -58,6 +59,7 @@ export class DatasetDetailDynamicComponent implements OnInit, OnDestroy { dataset$ = this.store.select(selectCurrentDataset); datasetWithout$ = this.store.select(selectCurrentDatasetWithoutFileInfo); attachments$ = this.store.select(selectCurrentAttachments); + externalLinks$ = this.store.select(selectCurrentDatasetExternalLinks); loading$ = this.store.select(selectIsLoading); show = false; diff --git a/src/app/datasets/dataset-detail/dataset-detail/_dataset-detail-theme.scss b/src/app/datasets/dataset-detail/dataset-detail/_dataset-detail-theme.scss index c38b8e686a..2f9a595639 100644 --- a/src/app/datasets/dataset-detail/dataset-detail/_dataset-detail-theme.scss +++ b/src/app/datasets/dataset-detail/dataset-detail/_dataset-detail-theme.scss @@ -10,29 +10,33 @@ $header-3: map.get($color-config, "header-3"); $header-4: map.get($color-config, "header-4"); mat-card { - .general-header { + .dataset-general-header { background-color: mat.m2-get-color-from-palette($primary, "lighter"); } - .creator-header { + .dataset-creator-header { background-color: mat.m2-get-color-from-palette($header-1, "lighter"); } - .file-header { - background-color: mat.m2-get-color-from-palette($accent, "lighter"); + .dataset-file-header { + background-color: mat.m2-get-color-from-palette($header-2, "lighter"); } - .related-header { - background-color: mat.m2-get-color-from-palette($header-2, "lighter"); + .dataset-related-header { + background-color: mat.m2-get-color-from-palette($accent, "lighter"); } - .derived-header { + .dataset-derived-header { background-color: mat.m2-get-color-from-palette($header-3, "lighter"); } - .scientific-header { + .dataset-links-header { background-color: mat.m2-get-color-from-palette($header-4, "lighter"); } + + .dataset-scientific-header { + background-color: mat.m2-get-color-from-palette($header-1, "lighter"); + } } } diff --git a/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.html b/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.html index 1c2e207579..ecf097619a 100644 --- a/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.html +++ b/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.html @@ -26,7 +26,7 @@
- + description {{ "General Information" | translate: localization @@ -173,7 +173,7 @@ - + person {{ "Creator Information" | translate: localization @@ -215,7 +215,7 @@ - + folder {{ "File Information" | translate: localization @@ -241,7 +241,7 @@ - + library_books {{ "Related Documents" | translate: localization @@ -333,7 +333,7 @@ - +
analytics
@@ -357,9 +357,29 @@
+ + + + link + {{ "Links" | translate }} + + + + + + + +
{{ externalLink.title }} + {{ externalLink.description }} +
+
+
+ - + science {{ "Scientific Metadata" | translate: localization diff --git a/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.scss b/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.scss index 50dd208df2..3a90cbf52e 100644 --- a/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.scss +++ b/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.scss @@ -1,7 +1,7 @@ mat-card { margin: 1em; - .scientific-header, .related-header, .creator-header, .file-header, .general-header { + .dataset-scientific-header, .dataset-related-header, .dataset-creator-header, .dataset-file-header, .dataset-links-header, .dataset-general-header { display: flex; align-items: center; padding: 1em; diff --git a/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.ts b/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.ts index 050c03ba6a..82d062efa6 100644 --- a/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.ts +++ b/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.ts @@ -10,6 +10,7 @@ import { Store } from "@ngrx/store"; import { showMessageAction } from "state-management/actions/user.actions"; import { selectCurrentAttachments, + selectCurrentDatasetExternalLinks, selectCurrentDataset, selectCurrentDatasetWithoutFileInfo, } from "state-management/selectors/datasets.selectors"; @@ -77,6 +78,7 @@ export class DatasetDetailComponent implements OnInit, OnDestroy { dataset: OutputDatasetObsoleteDto | undefined; datasetWithout$ = this.store.select(selectCurrentDatasetWithoutFileInfo); attachments$ = this.store.select(selectCurrentAttachments); + externalLinks$ = this.store.select(selectCurrentDatasetExternalLinks); loading$ = this.store.select(selectIsLoading); instrument: Instrument | undefined; proposal: ProposalClass | undefined; diff --git a/src/app/datasets/dataset-details-dashboard/dataset-details-dashboard.component.ts b/src/app/datasets/dataset-details-dashboard/dataset-details-dashboard.component.ts index 299f54923f..269445fbc1 100644 --- a/src/app/datasets/dataset-details-dashboard/dataset-details-dashboard.component.ts +++ b/src/app/datasets/dataset-details-dashboard/dataset-details-dashboard.component.ts @@ -27,6 +27,7 @@ import { fetchDatasetAction, fetchOrigDatablocksAction, fetchRelatedDatasetsAction, + fetchExternalLinksAction, } from "state-management/actions/datasets.actions"; import { clearLogbookAction, @@ -130,6 +131,7 @@ export class DatasetDetailsDashboardComponent this.resetTabs(); // Fetch dataset details this.store.dispatch(fetchDatasetAction({ pid: id })); + this.store.dispatch(fetchExternalLinksAction({ pid: id })); this.fetchDataActions[TAB.details].loaded = true; } }), diff --git a/src/app/datasets/reduce/_reduce-theme.scss b/src/app/datasets/reduce/_reduce-theme.scss index 929810cb06..370abca18f 100644 --- a/src/app/datasets/reduce/_reduce-theme.scss +++ b/src/app/datasets/reduce/_reduce-theme.scss @@ -6,11 +6,11 @@ $primary: map.get($color-config, "primary"); $accent: map.get($color-config, "accent"); mat-card { - .action-header { + .reduce-action-header { background-color: mat.m2-get-color-from-palette($primary, "lighter"); } - .derived-header { + .reduce-derived-header { background-color: mat.m2-get-color-from-palette($accent, "lighter"); } } diff --git a/src/app/datasets/reduce/reduce.component.html b/src/app/datasets/reduce/reduce.component.html index d70d7e645a..717d801f94 100644 --- a/src/app/datasets/reduce/reduce.component.html +++ b/src/app/datasets/reduce/reduce.component.html @@ -2,7 +2,7 @@
- New Action + New Action @@ -176,7 +176,7 @@

Description

- + Derived Datasets diff --git a/src/app/publisheddata/publisheddata-details/_publisheddata-details-theme.scss b/src/app/publisheddata/publisheddata-details/_publisheddata-details-theme.scss index 45eb82c345..26e60621f9 100644 --- a/src/app/publisheddata/publisheddata-details/_publisheddata-details-theme.scss +++ b/src/app/publisheddata/publisheddata-details/_publisheddata-details-theme.scss @@ -9,24 +9,24 @@ $accent: map.get($color-config, "accent"); $header-2: map.get($color-config, "header-2"); mat-card { - .status-header { + .publisheddata-status-header { background-color: mat.m2-get-color-from-palette($warn, "lighter"); } - .general-header { + .publisheddata-general-header { background-color: mat.m2-get-color-from-palette($primary, "lighter"); } - .creator-header { + .publisheddata-creator-header { background-color: mat.m2-get-color-from-palette($header-1, "lighter"); } - .file-header { - background-color: mat.m2-get-color-from-palette($accent, "lighter"); + .publisheddata-file-header { + background-color: mat.m2-get-color-from-palette($header-2, "lighter"); } - .related-header { - background-color: mat.m2-get-color-from-palette($header-2, "lighter"); + .publisheddata-related-header { + background-color: mat.m2-get-color-from-palette($accent, "lighter"); } } } diff --git a/src/app/publisheddata/publisheddata-details/publisheddata-details.component.html b/src/app/publisheddata/publisheddata-details/publisheddata-details.component.html index f47ce74ab8..bd2f295f22 100644 --- a/src/app/publisheddata/publisheddata-details/publisheddata-details.component.html +++ b/src/app/publisheddata/publisheddata-details/publisheddata-details.component.html @@ -1,7 +1,7 @@
- +
info
@@ -57,7 +57,7 @@
- +
description
@@ -90,7 +90,7 @@
- +
person
@@ -139,7 +139,7 @@ publishedData.metadata?.dataDescription " > - +
folder
@@ -180,7 +180,7 @@
- +
library_books
diff --git a/src/app/shared/modules/table/table.component.html b/src/app/shared/modules/table/table.component.html index 2f5ce9868a..fa54c3db05 100644 --- a/src/app/shared/modules/table/table.component.html +++ b/src/app/shared/modules/table/table.component.html @@ -53,16 +53,19 @@
+
{{ data[column.name] | date: column.dateFormat }}
+
{{ data[column.name] | dynamicPipe: column.pipe : [] }}
+
{{ data[column.name] }}
diff --git a/src/app/shared/modules/table/table.component.spec.ts b/src/app/shared/modules/table/table.component.spec.ts index 4c17ba388f..6ce19d3964 100644 --- a/src/app/shared/modules/table/table.component.spec.ts +++ b/src/app/shared/modules/table/table.component.spec.ts @@ -11,6 +11,8 @@ import { NO_ERRORS_SCHEMA } from "@angular/core"; import { MatCheckboxChange } from "@angular/material/checkbox"; import { TableModule } from "./table.module"; +// Jasmine testing framework descriptions for Angular component TableComponent + describe("TableComponent", () => { let component: TableComponent; let fixture: ComponentFixture; diff --git a/src/app/shared/modules/table/table.component.ts b/src/app/shared/modules/table/table.component.ts index c156798320..09a9f940a6 100644 --- a/src/app/shared/modules/table/table.component.ts +++ b/src/app/shared/modules/table/table.component.ts @@ -9,6 +9,8 @@ import { import { SelectionModel } from "@angular/cdk/collections"; import { MatCheckboxChange } from "@angular/material/checkbox"; +// Accessory types and definition for Angular component TableComponent + export interface TableColumn { name: string; icon: string; diff --git a/src/app/shared/modules/table/table.module.ts b/src/app/shared/modules/table/table.module.ts index b3500ec842..65f2ddaea2 100644 --- a/src/app/shared/modules/table/table.module.ts +++ b/src/app/shared/modules/table/table.module.ts @@ -11,6 +11,8 @@ import { MatPaginatorModule } from "@angular/material/paginator"; import { MatSortModule } from "@angular/material/sort"; import { MatTableModule } from "@angular/material/table"; +// NgModule declaration for Angular component TableComponent + @NgModule({ declarations: [TableComponent], imports: [ diff --git a/src/app/state-management/actions/datasets.actions.ts b/src/app/state-management/actions/datasets.actions.ts index a926438841..ddcc31ba39 100644 --- a/src/app/state-management/actions/datasets.actions.ts +++ b/src/app/state-management/actions/datasets.actions.ts @@ -6,6 +6,7 @@ import { OutputDatasetObsoleteDto, DatasetsControllerCreateV3Request, OutputAttachmentV3Dto, + ExternalLinkClass, } from "@scicatproject/scicat-sdk-ts-angular"; import { FacetCounts } from "state-management/state/datasets.store"; import { @@ -119,6 +120,18 @@ export const changeRelatedDatasetsPageAction = createAction( props<{ page: number; limit: number }>(), ); +export const fetchExternalLinksAction = createAction( + "[Dataset] Fetch External Links", + props<{ pid: string }>(), +); +export const fetchExternalLinksCompleteAction = createAction( + "[Dataset] Fetch External Links Complete", + props<{ externallinks: ExternalLinkClass[] }>(), +); +export const fetchExternalLinksFailedAction = createAction( + "[Dataset] Fetch External Links Failed", +); + export const prefillBatchAction = createAction("[Dataset] Prefill Batch"); export const prefillBatchCompleteAction = createAction( "[Dataset] Prefill Batch Complete", diff --git a/src/app/state-management/effects/datasets.effects.ts b/src/app/state-management/effects/datasets.effects.ts index 9ec8498ae1..b02f66a67b 100644 --- a/src/app/state-management/effects/datasets.effects.ts +++ b/src/app/state-management/effects/datasets.effects.ts @@ -9,6 +9,7 @@ import { OrigDatablock, OutputDatasetObsoleteDto, UpdateAttachmentV3Dto, + ExternalLinkClass, } from "@scicatproject/scicat-sdk-ts-angular"; import { Store } from "@ngrx/store"; import { @@ -167,6 +168,22 @@ export class DatasetEffects { ); }); + fetchExternalLinksOfDataset$ = createEffect(() => { + return this.actions$.pipe( + ofType(fromActions.fetchExternalLinksAction), + switchMap(({ pid }) => { + return this.datasetsService + .datasetsControllerFindExternalLinksByIdV3(pid) + .pipe( + map((externallinks: ExternalLinkClass[]) => + fromActions.fetchExternalLinksCompleteAction({ externallinks }), + ), + catchError(() => of(fromActions.fetchExternalLinksFailedAction())), + ); + }), + ); + }); + fetchOrigDatablocksOfDataset$ = createEffect(() => { return this.actions$.pipe( ofType(fromActions.fetchOrigDatablocksAction), @@ -400,6 +417,7 @@ export class DatasetEffects { fromActions.fetchOrigDatablocksAction, fromActions.fetchDatablocksAction, fromActions.fetchAttachmentsAction, + fromActions.fetchExternalLinksAction, fromActions.addDatasetAction, fromActions.updatePropertyAction, fromActions.addAttachmentAction, @@ -428,8 +446,8 @@ export class DatasetEffects { fromActions.fetchOrigDatablocksFailedAction, fromActions.fetchDatablocksCompleteAction, fromActions.fetchDatablocksFailedAction, - fromActions.fetchOrigDatablocksCompleteAction, - fromActions.fetchOrigDatablocksFailedAction, + fromActions.fetchExternalLinksCompleteAction, + fromActions.fetchExternalLinksFailedAction, fromActions.fetchAttachmentsCompleteAction, fromActions.fetchAttachmentsFailedAction, fromActions.addDatasetCompleteAction, diff --git a/src/app/state-management/reducers/datasets.reducer.ts b/src/app/state-management/reducers/datasets.reducer.ts index 5a0b71027a..e814d73876 100644 --- a/src/app/state-management/reducers/datasets.reducer.ts +++ b/src/app/state-management/reducers/datasets.reducer.ts @@ -64,6 +64,16 @@ const reducer = createReducer( }, ), + on( + fromActions.fetchExternalLinksCompleteAction, + (state, { externallinks }) => { + return { + ...state, + currentSetExternalLinks: externallinks, + }; + }, + ), + on(fromActions.fetchAttachmentsCompleteAction, (state, { attachments }) => { return { ...state, diff --git a/src/app/state-management/selectors/datasets.selectors.spec.ts b/src/app/state-management/selectors/datasets.selectors.spec.ts index a2db2f5737..f31ca18c2c 100644 --- a/src/app/state-management/selectors/datasets.selectors.spec.ts +++ b/src/app/state-management/selectors/datasets.selectors.spec.ts @@ -8,6 +8,7 @@ const initialDatasetState: DatasetState = { datasets: [], selectedSets: [], currentSet: dataset, + currentSetExternalLinks: [], relatedDatasets: [], relatedDatasetsCount: 0, totalCount: 0, @@ -71,6 +72,16 @@ describe("test dataset selectors", () => { }); }); + describe("selectCurrentDatasetExternalLinks", () => { + it("should select external links array for current dataset", () => { + expect( + fromDatasetSelectors.selectCurrentDatasetExternalLinks.projector( + initialDatasetState, + ), + ).toEqual([]); + }); + }); + describe("selectMetadataKeys", () => { it("should select the array of metadata keys", () => { expect( diff --git a/src/app/state-management/selectors/datasets.selectors.ts b/src/app/state-management/selectors/datasets.selectors.ts index d7246c64c4..3b1e745ebb 100644 --- a/src/app/state-management/selectors/datasets.selectors.ts +++ b/src/app/state-management/selectors/datasets.selectors.ts @@ -24,6 +24,11 @@ export const selectCurrentDataset = createSelector( (state) => state.currentSet, ); +export const selectCurrentDatasetExternalLinks = createSelector( + selectDatasetState, + (state) => state.currentSetExternalLinks, +); + export const selectCurrentDatasetWithoutFileInfo = createSelector( selectCurrentDataset, (currentSet) => { diff --git a/src/app/state-management/state/datasets.store.ts b/src/app/state-management/state/datasets.store.ts index 82729ad938..539e18ff79 100644 --- a/src/app/state-management/state/datasets.store.ts +++ b/src/app/state-management/state/datasets.store.ts @@ -1,5 +1,8 @@ import { DatasetFilters, ArchViewMode } from "state-management/models"; -import { OutputDatasetObsoleteDto } from "@scicatproject/scicat-sdk-ts-angular"; +import { + OutputDatasetObsoleteDto, + ExternalLinkClass, +} from "@scicatproject/scicat-sdk-ts-angular"; export interface FacetCount { _id: string; @@ -20,6 +23,7 @@ export interface DatasetState { datasets: OutputDatasetObsoleteDto[]; selectedSets: OutputDatasetObsoleteDto[]; currentSet: OutputDatasetObsoleteDto | undefined; + currentSetExternalLinks: ExternalLinkClass[]; relatedDatasets: OutputDatasetObsoleteDto[]; relatedDatasetsCount: number; totalCount: number; @@ -48,6 +52,7 @@ export const initialDatasetState: DatasetState = { datasets: [], selectedSets: [], currentSet: undefined, + currentSetExternalLinks: [], relatedDatasets: [], relatedDatasetsCount: 0, totalCount: 0, diff --git a/src/app/theme.ts b/src/app/theme.ts index 6dcf13d3cf..907d23285c 100644 --- a/src/app/theme.ts +++ b/src/app/theme.ts @@ -38,11 +38,11 @@ export const light: Theme = { "--theme-header-2-lighter-contrast": "#000000", "--theme-header-2-darker": "#32846a", "--theme-header-2-darker-contrast": "#ffffff", - "--theme-header-3-default": "#ff7d00", + "--theme-header-3-default": "#662200", "--theme-header-3-default-contrast": "#ffffff", - "--theme-header-3-lighter": "#ffcb99", + "--theme-header-3-lighter": "#c1a699", "--theme-header-3-lighter-contrast": "#000000", - "--theme-header-3-darker": "#ff9732", + "--theme-header-3-darker": "#854e32", "--theme-header-3-darker-contrast": "#ffffff", "--theme-header-4-default": "#821482", "--theme-header-4-default-contrast": "#ffffff", diff --git a/src/assets/theme.json b/src/assets/theme.json index cdc519c893..49a015fd45 100644 --- a/src/assets/theme.json +++ b/src/assets/theme.json @@ -37,11 +37,11 @@ "--theme-header-2-lighter-contrast": "#000000", "--theme-header-2-darker": "#32846a", "--theme-header-2-darker-contrast": "#ffffff", - "--theme-header-3-default": "#ff7d00", + "--theme-header-3-default": "#662200", "--theme-header-3-default-contrast": "#ffffff", - "--theme-header-3-lighter": "#ffcb99", + "--theme-header-3-lighter": "#c1a699", "--theme-header-3-lighter-contrast": "#000000", - "--theme-header-3-darker": "#ff9732", + "--theme-header-3-darker": "#854e32", "--theme-header-3-darker-contrast": "#ffffff", "--theme-header-4-default": "#821482", "--theme-header-4-default-contrast": "#ffffff", diff --git a/src/styles.scss b/src/styles.scss index b21134000f..33aa196a5c 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -210,7 +210,7 @@ $newcolor: map.merge( warn-2: $warn-2, header-1: $header-1, header-2: $header-2, - header-3: $header-4, + header-3: $header-3, header-4: $header-4, hover: $hover, )