From 0e97ce20868f79ebb1069214b03d302838f7e71c Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Tue, 24 Jun 2025 14:47:30 -0700 Subject: [PATCH 01/17] Dealing with CSS name collisions in browser space. Slight re-ordering of color assignment for headers in dataset details. --- .../dataset-detail/_dataset-detail-theme.scss | 16 ++++++++-------- .../dataset-detail/dataset-detail.component.html | 12 ++++++------ src/app/datasets/reduce/_reduce-theme.scss | 4 ++-- src/app/datasets/reduce/reduce.component.html | 4 ++-- .../_publisheddata-details-theme.scss | 14 +++++++------- .../publisheddata-details.component.html | 10 +++++----- 6 files changed, 30 insertions(+), 30 deletions(-) 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 c38b8e686..eecd1807b 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,27 +10,27 @@ $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-scientific-header { background-color: mat.m2-get-color-from-palette($header-4, "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 5bc03f478..dc2581bf0 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
@@ -167,7 +167,7 @@
- +
person
@@ -209,7 +209,7 @@
- +
folder
@@ -235,7 +235,7 @@
- +
library_books
@@ -327,7 +327,7 @@
- +
analytics
@@ -353,7 +353,7 @@
- +
science
diff --git a/src/app/datasets/reduce/_reduce-theme.scss b/src/app/datasets/reduce/_reduce-theme.scss index 929810cb0..370abca18 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 d70d7e645..717d801f9 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 45eb82c34..a2431e082 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 { + .pubishedata-status-header { background-color: mat.m2-get-color-from-palette($warn, "lighter"); } - .general-header { + .pubishedata-general-header { background-color: mat.m2-get-color-from-palette($primary, "lighter"); } - .creator-header { + .pubishedata-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"); + .pubishedata-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"); + .pubishedata-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 03c53a276..ce60796a7 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
@@ -39,7 +39,7 @@
- +
description
@@ -72,7 +72,7 @@
- +
person
@@ -102,7 +102,7 @@
- +
folder
@@ -143,7 +143,7 @@
- +
library_books
From 004482bd127e9ddab70751d0829aadee6581f7a3 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Tue, 24 Jun 2025 14:47:54 -0700 Subject: [PATCH 02/17] Adding a header style for links. --- .../dataset-detail/_dataset-detail-theme.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 eecd1807b..2f9a59563 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 @@ -30,9 +30,13 @@ background-color: mat.m2-get-color-from-palette($header-3, "lighter"); } - .dataset-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"); + } } } From 7255794b30d8fa7b2b1795b22ecf5617d411b1fd Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Tue, 24 Jun 2025 14:49:03 -0700 Subject: [PATCH 03/17] Draft dataset links card. --- .../dataset-detail.component.html | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) 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 dc2581bf0..42d311c87 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 @@ -352,6 +352,98 @@
+ + +
+ link +
+ {{ "Links" | translate }} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{ "Proposal" | translate }} + {{ + proposal.title + }} +
{{ "Proposal Id" | translate }}{{ dataset["proposalId"] }}
{{ "Sample" | translate }} + + {{ sample.description }} + +
{{ "Instrument" | translate }} + + {{ instrument.name }} + +
{{ "Creation Location" | translate }}{{ value }}
{{ "Techniques" | translate }} +
+ + {{ technique.name }} + + , + +
+
{{ "Input Datasets" | translate }} + +
+
+
+
From 237d4a1fdc22c486d5291cc733c72b008d195730 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Tue, 24 Jun 2025 14:53:01 -0700 Subject: [PATCH 04/17] Changing this color to one that matches the saturation and luminance of the other header colors, keeping the same hue. --- src/app/theme.ts | 6 +++--- src/assets/theme.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/app/theme.ts b/src/app/theme.ts index 6dcf13d3c..907d23285 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 cdc519c89..49a015fd4 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", From f263e2638867de1147e6c7f47c364a989e96900a Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Tue, 24 Jun 2025 14:54:39 -0700 Subject: [PATCH 05/17] Seems to be a typo. Can't find any reason why this would be here from my walk through the rest of the codebase. --- src/styles.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles.scss b/src/styles.scss index 629ad33d3..0f6c86a26 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, ) From 946f145584a4f63cca8f18df27cb5008d032a974 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Tue, 15 Jul 2025 15:57:25 -0700 Subject: [PATCH 06/17] Oops; fixing a typo. --- .../_publisheddata-details-theme.scss | 10 +++++----- .../publisheddata-details.component.html | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/app/publisheddata/publisheddata-details/_publisheddata-details-theme.scss b/src/app/publisheddata/publisheddata-details/_publisheddata-details-theme.scss index a2431e082..26e60621f 100644 --- a/src/app/publisheddata/publisheddata-details/_publisheddata-details-theme.scss +++ b/src/app/publisheddata/publisheddata-details/_publisheddata-details-theme.scss @@ -9,23 +9,23 @@ $accent: map.get($color-config, "accent"); $header-2: map.get($color-config, "header-2"); mat-card { - .pubishedata-status-header { + .publisheddata-status-header { background-color: mat.m2-get-color-from-palette($warn, "lighter"); } - .pubishedata-general-header { + .publisheddata-general-header { background-color: mat.m2-get-color-from-palette($primary, "lighter"); } - .pubishedata-creator-header { + .publisheddata-creator-header { background-color: mat.m2-get-color-from-palette($header-1, "lighter"); } - .pubishedata-file-header { + .publisheddata-file-header { background-color: mat.m2-get-color-from-palette($header-2, "lighter"); } - .pubishedata-related-header { + .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 ce60796a7..bf2d47650 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
@@ -39,7 +39,7 @@
- +
description
@@ -72,7 +72,7 @@
- +
person
@@ -102,7 +102,7 @@
- +
folder
@@ -143,7 +143,7 @@
- +
library_books
From 0f7c8e8b66729433e5f7a739870b653b8d6bc2b7 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Thu, 17 Jul 2025 13:50:26 -0700 Subject: [PATCH 07/17] Adapting the newly introduced style class names. --- .../dataset-detail/dataset-detail/dataset-detail.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 43b641d83..a02eaede8 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; From 3cbeb673f8cfd97e376511d36d99a9617aa16563 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Tue, 22 Jul 2025 14:54:21 -0700 Subject: [PATCH 08/17] Patching the local SDK generator to support SciCat live. (Cannot fetch API spec directly from within Docker due to "backend.localhost" mapping.) --- scripts/generate-nestjs-sdk.bash | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/scripts/generate-nestjs-sdk.bash b/scripts/generate-nestjs-sdk.bash index 3c6b81f2e..92d473ff2 100755 --- a/scripts/generate-nestjs-sdk.bash +++ b/scripts/generate-nestjs-sdk.bash @@ -8,6 +8,14 @@ echo -e "\nUser running the script: ${USER}" echo -e "\nCleanup old files..." rm -rf node_modules/@scicatproject/scicat-sdk-ts-angular rm -rf @scicatproject/scicat-sdk-ts-angular +rm local-api-for-generator.json + +echo -e "\nFetching the API from local instance of back end..." + +curl http://host.docker.internal:3000/explorer-json > local-api-for-generator.json + +# For when developing with SciCat Live: +#curl http://backend.localhost/explorer-json > local-api-for-generator.json echo -e "\nGenerating the new sdk..." @@ -17,10 +25,9 @@ echo -e "\nGenerating the new sdk..." ## docker run \ --rm \ - --add-host host.docker.internal:host-gateway \ -v "`pwd`:/local" \ openapitools/openapi-generator-cli:v7.13.0 generate \ - -i http://host.docker.internal:3000/explorer-json \ + -i /local/local-api-for-generator.json \ -g typescript-angular \ -o local/@scicatproject/scicat-sdk-ts-angular \ --additional-properties=ngVersion=19.0.0,npmName=@scicatproject/scicat-sdk-ts-angular,supportsES6=true,withInterfaces=true --skip-validate-spec @@ -65,3 +72,5 @@ then rm -fv "/usr/local/bin/node" fi +rm local-api-for-generator.json + From 16c4decb3c69044df0c34f605e931af44c818a08 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Tue, 22 Jul 2025 14:57:20 -0700 Subject: [PATCH 09/17] Minor comment to patched script. --- scripts/generate-nestjs-sdk.bash | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/generate-nestjs-sdk.bash b/scripts/generate-nestjs-sdk.bash index 92d473ff2..24901d013 100755 --- a/scripts/generate-nestjs-sdk.bash +++ b/scripts/generate-nestjs-sdk.bash @@ -12,6 +12,7 @@ rm local-api-for-generator.json echo -e "\nFetching the API from local instance of back end..." +# For when developing with a backend running directly on localhost: curl http://host.docker.internal:3000/explorer-json > local-api-for-generator.json # For when developing with SciCat Live: From 584613fc908b0a6ffcbe70fddeeb07509c698307 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Wed, 23 Jul 2025 15:52:59 -0700 Subject: [PATCH 10/17] Development SDK generation script patches, for playing nice with SciCatLive. --- scripts/generate-nestjs-sdk.bash | 37 +++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/scripts/generate-nestjs-sdk.bash b/scripts/generate-nestjs-sdk.bash index 24901d013..cccc0dec2 100755 --- a/scripts/generate-nestjs-sdk.bash +++ b/scripts/generate-nestjs-sdk.bash @@ -2,6 +2,20 @@ # # +USING_SCICAT_LIVE=0 +while [[ "$#" -gt 0 ]]; do + case "$1" in + --scicatlive) + USING_SCICAT_LIVE=1 + shift + ;; + *) + echo "Unknown argument: $1" + exit 1 + ;; + esac +done + USER=`who am i | cut -d\ -f1` echo -e "\nUser running the script: ${USER}" @@ -12,11 +26,14 @@ rm local-api-for-generator.json echo -e "\nFetching the API from local instance of back end..." -# For when developing with a backend running directly on localhost: -curl http://host.docker.internal:3000/explorer-json > local-api-for-generator.json - -# For when developing with SciCat Live: -#curl http://backend.localhost/explorer-json > local-api-for-generator.json +if [ $USING_SCICAT_LIVE -eq 1 ]; +then + # For when developing with SciCat Live: + curl http://backend.localhost/explorer-json > local-api-for-generator.json +else + # For when developing with a backend running directly on localhost: + curl http://host.docker.internal:3000/explorer-json > local-api-for-generator.json +fi echo -e "\nGenerating the new sdk..." @@ -33,6 +50,16 @@ docker run \ -o local/@scicatproject/scicat-sdk-ts-angular \ --additional-properties=ngVersion=19.0.0,npmName=@scicatproject/scicat-sdk-ts-angular,supportsES6=true,withInterfaces=true --skip-validate-spec +# Check if the docker command resulted in any output. +# If we don't do this, we'll try to cd into a missing folder, +# and then we'd be invoking 'npm run build' as root in the main project folder, +# which would create a bunch of stuff in ./dist belonging to root, +# causing problems for things like SciCat Live. +if [ ! -d "@scicatproject/scicat-sdk-ts-angular" ]; then + echo "Error: OpenApi output not found." + exit 1 +fi + REMOVE_NPM_LINK=0 if ! command -v npm 2>&1 1>/dev/null then From 6b407e36719c0bca06ddbb44c9e755bae8720b60 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Wed, 23 Jul 2025 15:53:45 -0700 Subject: [PATCH 11/17] Just some minor code commentary. --- src/app/shared/modules/table/table.component.html | 3 +++ src/app/shared/modules/table/table.component.spec.ts | 2 ++ src/app/shared/modules/table/table.component.ts | 2 ++ src/app/shared/modules/table/table.module.ts | 2 ++ 4 files changed, 9 insertions(+) diff --git a/src/app/shared/modules/table/table.component.html b/src/app/shared/modules/table/table.component.html index 2f5ce9868..fa54c3db0 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 4c17ba388..6ce19d396 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 c15679832..09a9f940a 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 b3500ec84..65f2ddaea 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: [ From e9b65e3f1d4539bee0e2c429d6aaabbd09052c36 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Fri, 8 Aug 2025 12:48:09 -0700 Subject: [PATCH 12/17] Accepting an alternate Swagger URL via command line argument. --- scripts/generate-nestjs-sdk.bash | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/scripts/generate-nestjs-sdk.bash b/scripts/generate-nestjs-sdk.bash index cccc0dec2..05d03ba56 100755 --- a/scripts/generate-nestjs-sdk.bash +++ b/scripts/generate-nestjs-sdk.bash @@ -1,12 +1,13 @@ #!/bin/bash # -# -USING_SCICAT_LIVE=0 +# This default is for when developing with a backend running directly on localhost +SWAGGER_API_URL="http://localhost:3000/explorer-json" while [[ "$#" -gt 0 ]]; do case "$1" in - --scicatlive) - USING_SCICAT_LIVE=1 + --swagger-url) + shift + SWAGGER_API_URL=$1 shift ;; *) @@ -24,16 +25,8 @@ rm -rf node_modules/@scicatproject/scicat-sdk-ts-angular rm -rf @scicatproject/scicat-sdk-ts-angular rm local-api-for-generator.json -echo -e "\nFetching the API from local instance of back end..." - -if [ $USING_SCICAT_LIVE -eq 1 ]; -then - # For when developing with SciCat Live: - curl http://backend.localhost/explorer-json > local-api-for-generator.json -else - # For when developing with a backend running directly on localhost: - curl http://host.docker.internal:3000/explorer-json > local-api-for-generator.json -fi +echo -e "\nFetching the Swagger API from the back end..." +curl ${SWAGGER_API_URL} > local-api-for-generator.json echo -e "\nGenerating the new sdk..." @@ -50,6 +43,8 @@ docker run \ -o local/@scicatproject/scicat-sdk-ts-angular \ --additional-properties=ngVersion=19.0.0,npmName=@scicatproject/scicat-sdk-ts-angular,supportsES6=true,withInterfaces=true --skip-validate-spec +rm local-api-for-generator.json + # Check if the docker command resulted in any output. # If we don't do this, we'll try to cd into a missing folder, # and then we'd be invoking 'npm run build' as root in the main project folder, @@ -99,6 +94,3 @@ then rm -fv "/usr/local/bin/npm" rm -fv "/usr/local/bin/node" fi - -rm local-api-for-generator.json - From f7573469bda12cd8c86f233ec13cb3a7b7a33dfc Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Wed, 13 Aug 2025 14:03:51 -0700 Subject: [PATCH 13/17] Now displaying links. --- .../dataset-detail.component.html | 83 ++----------------- 1 file changed, 6 insertions(+), 77 deletions(-) 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 54c5dd6a2..9d4092cd6 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 @@ -344,90 +344,19 @@ - + link {{ "Links" | translate }} - - - - - - - - - - - - - - - - - - - - - - - + + - - - -
{{ "Proposal" | translate }} - {{ - proposal.title - }} -
{{ "Proposal Id" | translate }}{{ dataset["proposalId"] }}
{{ "Sample" | translate }} - - {{ sample.description }} - -
{{ "Instrument" | translate }} - - {{ instrument.name }} - -
{{ "Creation Location" | translate }}{{ value }}
{{ "Techniques" | translate }}
{{ externalLink.title }} -
- - {{ technique.name }} - - , - -
-
{{ "Input Datasets" | translate }} - + {{ externalLink.description }}
From 79a66955c6fc0ed058d8df99cfc134d2b77c2768 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Wed, 13 Aug 2025 15:56:34 -0700 Subject: [PATCH 14/17] Deprecation note --- .../datasets/datafiles-actions/datafiles-action.component.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/datasets/datafiles-actions/datafiles-action.component.ts b/src/app/datasets/datafiles-actions/datafiles-action.component.ts index e710dc544..c9f5c9a21 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({ From 9dd6624c0e56895f831b1d14c7c7ddcfb46fa033 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Wed, 3 Sep 2025 01:00:01 -0700 Subject: [PATCH 15/17] New field in state, and new selector for external links. Code to fetch links directly after fetching dataset when preparing the dataset view component. --- .../dataset-detail-dynamic.component.ts | 2 ++ .../dataset-detail.component.html | 4 ++-- .../dataset-detail.component.ts | 2 ++ .../dataset-details-dashboard.component.ts | 4 +++- .../actions/datasets.actions.ts | 13 +++++++++++ .../effects/datasets.effects.ts | 22 +++++++++++++++++-- .../reducers/datasets.reducer.ts | 10 +++++++++ .../selectors/datasets.selectors.spec.ts | 11 ++++++++++ .../selectors/datasets.selectors.ts | 5 +++++ .../state-management/state/datasets.store.ts | 4 +++- 10 files changed, 71 insertions(+), 6 deletions(-) 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 394ec88a5..bf803d56f 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"; @@ -57,6 +58,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.component.html b/src/app/datasets/dataset-detail/dataset-detail/dataset-detail.component.html index f2835cf7b..1e7a2369d 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 @@ -346,14 +346,14 @@
- + link {{ "Links" | translate }} - +
{{ externalLink.title }} { if (id) { this.resetTabs(); - // Fetch dataset details + // Fetch dataset details, as well as external links this.store.dispatch(fetchDatasetAction({ pid: id })); + this.store.dispatch(fetchExternalLinksAction({ pid: id })); this.fetchDataActions[TAB.details].loaded = true; } }), diff --git a/src/app/state-management/actions/datasets.actions.ts b/src/app/state-management/actions/datasets.actions.ts index f12a8881a..0aefb74ab 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 { @@ -117,6 +118,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 45e2d8ede..3a86fb479 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 { @@ -165,6 +166,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), @@ -398,6 +415,7 @@ export class DatasetEffects { fromActions.fetchOrigDatablocksAction, fromActions.fetchDatablocksAction, fromActions.fetchAttachmentsAction, + fromActions.fetchExternalLinksAction, fromActions.addDatasetAction, fromActions.updatePropertyAction, fromActions.addAttachmentAction, @@ -426,8 +444,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 4cb17be1f..3b644ed3e 100644 --- a/src/app/state-management/reducers/datasets.reducer.ts +++ b/src/app/state-management/reducers/datasets.reducer.ts @@ -61,6 +61,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 95b8ea6df..b7a5da24e 100644 --- a/src/app/state-management/selectors/datasets.selectors.spec.ts +++ b/src/app/state-management/selectors/datasets.selectors.spec.ts @@ -7,6 +7,7 @@ const initialDatasetState: DatasetState = { datasets: [], selectedSets: [], currentSet: dataset, + currentSetExternalLinks: [], relatedDatasets: [], relatedDatasetsCount: 0, totalCount: 0, @@ -70,6 +71,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 fbd9a4590..63255c6fb 100644 --- a/src/app/state-management/selectors/datasets.selectors.ts +++ b/src/app/state-management/selectors/datasets.selectors.ts @@ -23,6 +23,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 bdc970eae..4519bc9ef 100644 --- a/src/app/state-management/state/datasets.store.ts +++ b/src/app/state-management/state/datasets.store.ts @@ -1,6 +1,6 @@ import { DatasetClass } from "@scicatproject/scicat-sdk-ts-angular"; 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 DateTriple { year: number; @@ -26,6 +26,7 @@ export interface DatasetState { datasets: OutputDatasetObsoleteDto[]; selectedSets: OutputDatasetObsoleteDto[]; currentSet: OutputDatasetObsoleteDto | undefined; + currentSetExternalLinks: ExternalLinkClass[]; relatedDatasets: OutputDatasetObsoleteDto[]; relatedDatasetsCount: number; totalCount: number; @@ -54,6 +55,7 @@ export const initialDatasetState: DatasetState = { datasets: [], selectedSets: [], currentSet: undefined, + currentSetExternalLinks: [], relatedDatasets: [], relatedDatasetsCount: 0, totalCount: 0, From 2c9308fb105cd84375baa7b5c969cbc1c814ad39 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Wed, 3 Sep 2025 13:21:00 -0700 Subject: [PATCH 16/17] Further refinements to the SDK generation script. --- scripts/generate-nestjs-sdk.bash | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/scripts/generate-nestjs-sdk.bash b/scripts/generate-nestjs-sdk.bash index 05d03ba56..5c5d96d2e 100755 --- a/scripts/generate-nestjs-sdk.bash +++ b/scripts/generate-nestjs-sdk.bash @@ -1,6 +1,13 @@ #!/bin/bash # +# Note: This script is meant to be run from the project root, e.g. +# ./scripts/generate-nestjs-sdk.bash +if [ ! -d "node_modules" ]; then + echo "Error: No node_modules folder found. This script is means to be run from the project root." + exit 1 +fi + # This default is for when developing with a backend running directly on localhost SWAGGER_API_URL="http://localhost:3000/explorer-json" while [[ "$#" -gt 0 ]]; do @@ -37,7 +44,7 @@ echo -e "\nGenerating the new sdk..." docker run \ --rm \ -v "`pwd`:/local" \ - openapitools/openapi-generator-cli:v7.13.0 generate \ + openapitools/openapi-generator-cli:v7.14.0 generate \ -i /local/local-api-for-generator.json \ -g typescript-angular \ -o local/@scicatproject/scicat-sdk-ts-angular \ @@ -76,9 +83,15 @@ echo -e "\nInstalling dependencies and building the sdk..." cd @scicatproject/scicat-sdk-ts-angular npm install npm run build - -echo -e "\nCopying the build files in node_modules..." cd ../.. + +if [ ! -d "@scicatproject/scicat-sdk-ts-angular/dist" ]; then + echo "Error: Build ouput not found." + exit 1 +fi + +echo -e "\nCopying the build files into node_modules..." +mkdir -p node_modules/@scicatproject/scicat-sdk-ts-angular cp -rv @scicatproject/scicat-sdk-ts-angular/dist node_modules/@scicatproject/scicat-sdk-ts-angular echo -e "\nAdjusting ownership to user ${USER}" @@ -86,7 +99,7 @@ chown -Rv ${USER} node_modules/@scicatproject/scicat-sdk-ts-angular echo -e "\nFinal cleanup..." echo -e "Removing sdk folder" -rm -rfv @scicatproject +rm -rf @scicatproject if [ $REMOVE_NPM_LINK -eq 1 ]; then @@ -94,3 +107,5 @@ then rm -fv "/usr/local/bin/npm" rm -fv "/usr/local/bin/node" fi + +echo -e "\nDone." \ No newline at end of file From ba107ecba2fe1e81cb77680870eb4254035ad820 Mon Sep 17 00:00:00 2001 From: Garrett Birkel Date: Wed, 3 Sep 2025 13:25:35 -0700 Subject: [PATCH 17/17] Minor fix to SDK copy paths. --- scripts/generate-nestjs-sdk.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/generate-nestjs-sdk.bash b/scripts/generate-nestjs-sdk.bash index 5c5d96d2e..c2a264ce5 100755 --- a/scripts/generate-nestjs-sdk.bash +++ b/scripts/generate-nestjs-sdk.bash @@ -92,7 +92,7 @@ fi echo -e "\nCopying the build files into node_modules..." mkdir -p node_modules/@scicatproject/scicat-sdk-ts-angular -cp -rv @scicatproject/scicat-sdk-ts-angular/dist node_modules/@scicatproject/scicat-sdk-ts-angular +cp -rv @scicatproject/scicat-sdk-ts-angular/dist/ node_modules/@scicatproject/scicat-sdk-ts-angular/ echo -e "\nAdjusting ownership to user ${USER}" chown -Rv ${USER} node_modules/@scicatproject/scicat-sdk-ts-angular