From 41be054db1b02475da614c6b637a677245fcaa48 Mon Sep 17 00:00:00 2001 From: Jamie Little Date: Wed, 4 Mar 2026 14:00:26 -0600 Subject: [PATCH 1/6] Basic display of search term on no results page --- .../custom1-module/customComponentMappings.ts | 2 ++ ...no-results-custom-component.component.html | 1 + ...no-results-custom-component.component.scss | 0 ...results-custom-component.component.spec.ts | 23 +++++++++++++ ...h-no-results-custom-component.component.ts | 32 +++++++++++++++++++ 5 files changed, 58 insertions(+) create mode 100644 src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html create mode 100644 src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.scss create mode 100644 src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.spec.ts create mode 100644 src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts diff --git a/src/app/custom1-module/customComponentMappings.ts b/src/app/custom1-module/customComponentMappings.ts index adde525..46d9b04 100644 --- a/src/app/custom1-module/customComponentMappings.ts +++ b/src/app/custom1-module/customComponentMappings.ts @@ -1,6 +1,8 @@ import { NdeSearchBarContainerCustomComponent } from "../nde-search-bar-container-custom/nde-search-bar-container-custom.component"; +import { NdeSearchNoResultsCustomComponentComponent } from "../nde-search-no-results-custom-component/nde-search-no-results-custom-component.component"; // Define the map export const selectorComponentMap = new Map([ ["nde-search-bar-container-top", NdeSearchBarContainerCustomComponent], + ["nde-search-no-results-bottom", NdeSearchNoResultsCustomComponentComponent] ]); diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html new file mode 100644 index 0000000..6054675 --- /dev/null +++ b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html @@ -0,0 +1 @@ +

Current search term: {{ searchTerm$ | async }}

diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.scss b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.spec.ts b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.spec.ts new file mode 100644 index 0000000..a87cd0d --- /dev/null +++ b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NdeSearchNoResultsCustomComponentComponent } from './nde-search-no-results-custom-component.component'; + +describe('NdeSearchNoResultsCustomComponentComponent', () => { + let component: NdeSearchNoResultsCustomComponentComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NdeSearchNoResultsCustomComponentComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(NdeSearchNoResultsCustomComponentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts new file mode 100644 index 0000000..a07e432 --- /dev/null +++ b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts @@ -0,0 +1,32 @@ +import { Component, inject } from '@angular/core'; +import { createFeatureSelector, Store } from '@ngrx/store'; +import { Observable, interval } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { AsyncPipe } from '@angular/common'; + +type SearchState = { searchParams: { q: string } }; +export const selectSearchState = createFeatureSelector('Search'); + +@Component({ + selector: 'custom-nde-search-no-results-custom-component', + standalone: true, + imports: [AsyncPipe], + templateUrl: './nde-search-no-results-custom-component.component.html', + styleUrl: './nde-search-no-results-custom-component.component.scss' +}) +export class NdeSearchNoResultsCustomComponentComponent { + public store = inject(Store); + + + searchState$!: Observable; + searchTerm$!: Observable; + ngOnInit(): void { + this.searchState$ = this.store.select(selectSearchState); + this.searchTerm$ = this.searchState$.pipe( + map((state) => state.searchParams.q) + ); + } + + + +} From 3bd7b291017ab9f8d51821db7a90fbd36f3f432c Mon Sep 17 00:00:00 2001 From: Jamie Little Date: Wed, 4 Mar 2026 14:49:44 -0600 Subject: [PATCH 2/6] Add basic DOI/ISBN linking to citation linker/BorrowDirect/WorldCat --- .../custom1-module/customComponentMappings.ts | 2 +- ...no-results-custom-component.component.html | 30 +++- ...no-results-custom-component.component.scss | 14 ++ ...h-no-results-custom-component.component.ts | 151 +++++++++++++++++- 4 files changed, 189 insertions(+), 8 deletions(-) diff --git a/src/app/custom1-module/customComponentMappings.ts b/src/app/custom1-module/customComponentMappings.ts index 46d9b04..7e78a0b 100644 --- a/src/app/custom1-module/customComponentMappings.ts +++ b/src/app/custom1-module/customComponentMappings.ts @@ -4,5 +4,5 @@ import { NdeSearchNoResultsCustomComponentComponent } from "../nde-search-no-res // Define the map export const selectorComponentMap = new Map([ ["nde-search-bar-container-top", NdeSearchBarContainerCustomComponent], - ["nde-search-no-results-bottom", NdeSearchNoResultsCustomComponentComponent] + ["nde-search-no-results-top", NdeSearchNoResultsCustomComponentComponent] ]); diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html index 6054675..73351fa 100644 --- a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html +++ b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html @@ -1 +1,29 @@ -

Current search term: {{ searchTerm$ | async }}

+
+ + + + + +
+

Try searching other resources:

+ + +
+
diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.scss b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.scss index e69de29..f6e2850 100644 --- a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.scss +++ b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.scss @@ -0,0 +1,14 @@ +.search-no-results { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 300px; +} + +.identifier-link, +.external-search-options { + width: 400px; + margin: 5px; + text-align: center; +} diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts index a07e432..1e9197d 100644 --- a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts +++ b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts @@ -1,8 +1,8 @@ -import { Component, inject } from '@angular/core'; +import { Component, inject, OnInit } from '@angular/core'; import { createFeatureSelector, Store } from '@ngrx/store'; -import { Observable, interval } from 'rxjs'; +import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { AsyncPipe } from '@angular/common'; +import { AsyncPipe, NgIf } from '@angular/common'; type SearchState = { searchParams: { q: string } }; export const selectSearchState = createFeatureSelector('Search'); @@ -10,23 +10,162 @@ export const selectSearchState = createFeatureSelector('Search'); @Component({ selector: 'custom-nde-search-no-results-custom-component', standalone: true, - imports: [AsyncPipe], + imports: [AsyncPipe, NgIf], templateUrl: './nde-search-no-results-custom-component.component.html', styleUrl: './nde-search-no-results-custom-component.component.scss' }) -export class NdeSearchNoResultsCustomComponentComponent { +export class NdeSearchNoResultsCustomComponentComponent implements OnInit { public store = inject(Store); - searchState$!: Observable; searchTerm$!: Observable; + isDoi$!: Observable; + isIsbn$!: Observable; + doiLink$!: Observable; + isbnLink$!: Observable; + worldCatLink$!: Observable; + borrowDirectLink$!: Observable; + + private readonly BASE_URL = 'https://catalyst.library.jhu.edu/discovery/openurl'; + private readonly WORLDCAT_BASE_URL = 'http://worldcat.org/search'; + private readonly BORROWDIRECT_BASE_URL = 'https://borrowdirect.reshare.indexdata.com/Search/Results'; + + private readonly BASE_PARAMS = { + institution: '01JHU_INST', + vid: '01JHU_INST:JHU', + ctx_ver: 'Z39.88-2004', + ctx_enc: 'info:ofi/enc:UTF-8', + url_ver: 'Z39.88-2004', + url_ctx_fmt: 'infofi/fmt:kev:mtx:ctx', + rfr_id: 'info:sid/primo.exlibrisgroup.com:primo4-article-cLinker', + isCitationLinker: 'Y', + lang: 'en' + }; + ngOnInit(): void { this.searchState$ = this.store.select(selectSearchState); this.searchTerm$ = this.searchState$.pipe( map((state) => state.searchParams.q) ); + + this.isDoi$ = this.searchTerm$.pipe( + map((term) => this.isDoi(term)) + ); + + this.isIsbn$ = this.searchTerm$.pipe( + map((term) => this.isIsbn(term)) + ); + + this.doiLink$ = this.searchTerm$.pipe( + map((term) => this.isDoi(term) ? this.generateDoiLink(term) : null) + ); + + this.isbnLink$ = this.searchTerm$.pipe( + map((term) => this.isIsbn(term) ? this.generateIsbnLink(term) : null) + ); + + this.worldCatLink$ = this.searchTerm$.pipe( + map((term) => this.generateWorldCatLink(term)) + ); + + this.borrowDirectLink$ = this.searchTerm$.pipe( + map((term) => this.generateBorrowDirectLink(term)) + ); + } + + /** + * Checks if the search term is a DOI + * DOI pattern: 10.xxxx/xxxxx (starts with 10. followed by registrant code, slash, and suffix) + * + * + * https://doi.org/10.1159/000110957 is an example of DOI where we don't have access + * + */ + isDoi(term: string): boolean { + if (!term) return false; + const doiPattern = /^10\.\d{4,}(\.\d+)*\/[^\s]+$/i; + // Also match DOI URLs + const doiUrlPattern = /^(https?:\/\/)?(dx\.)?doi\.org\/10\.\d{4,}(\.\d+)*\/[^\s]+$/i; + return doiPattern.test(term.trim()) || doiUrlPattern.test(term.trim()); + } + + /** + * Checks if the search term is an ISBN + * ISBN-10: 10 digits (may contain hyphens) + * ISBN-13: 13 digits starting with 978 or 979 (may contain hyphens) + * + * + * + * 978-0133430332 is an example of an ISBN where we don't have access + * + */ + isIsbn(term: string): boolean { + if (!term) return false; + const cleanedTerm = term.replace(/[-\s]/g, ''); + const isbn10Pattern = /^[0-9]{9}[0-9Xx]$/; + const isbn13Pattern = /^(978|979)[0-9]{10}$/; + return isbn10Pattern.test(cleanedTerm) || isbn13Pattern.test(cleanedTerm); + } + + /** + * Extracts the DOI from a search term (handles DOI URLs) + */ + extractDoi(term: string): string { + const urlPattern = /^(https?:\/\/)?(dx\.)?doi\.org\//i; + return term.trim().replace(urlPattern, ''); } + /** + * Generates the OpenURL link for a DOI + */ + generateDoiLink(doi: string): string { + const cleanDoi = this.extractDoi(doi); + const params = new URLSearchParams({ + ...this.BASE_PARAMS, + 'rft.genre': 'article', + 'rft_val_fmt': 'info:ofi/fmt:kev:mtx:article', + 'rft_id': `info:doi/${cleanDoi}`, + 'rft.doi': cleanDoi + }); + return `${this.BASE_URL}?${params.toString()}`; + } + + /** + * Generates the OpenURL link for an ISBN + */ + generateIsbnLink(isbn: string): string { + const cleanIsbn = isbn.replace(/[-\s]/g, ''); + const params = new URLSearchParams({ + ...this.BASE_PARAMS, + 'rft.genre': 'book', + 'rft_val_fmt': 'info:ofi/fmt:kev:mtx:book', + 'rft.isbn': cleanIsbn + }); + + return `${this.BASE_URL}?${params.toString()}`; + } + /** + * Generates a WorldCat search link + */ + generateWorldCatLink(term: string): string { + if (!term) return this.WORLDCAT_BASE_URL; + const params = new URLSearchParams({ + q: term.trim() + }); + return `${this.WORLDCAT_BASE_URL}?${params.toString()}`; + } + + /** + * Generates a BorrowDirect search link + */ + generateBorrowDirectLink(term: string): string { + if (!term) return this.BORROWDIRECT_BASE_URL; + const params = new URLSearchParams({ + type: 'AllFields', + lookfor: term.trim() + }); + return `${this.BORROWDIRECT_BASE_URL}?${params.toString()}`; + } } From 52fca49d88e38e17af6ac5fa9e791d0974132ce4 Mon Sep 17 00:00:00 2001 From: Jamie Little Date: Thu, 5 Mar 2026 10:24:06 -0600 Subject: [PATCH 3/6] Don't hide requests section for now. Work in progress for ILL linking on citation linker/fetch item page --- ...e-search-no-results-custom-component.component.ts | 2 +- src/assets/css/custom.css | 12 ++++-------- src/assets/homepage/homepage.css | 12 ------------ 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts index 1e9197d..5311d2e 100644 --- a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts +++ b/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts @@ -32,7 +32,7 @@ export class NdeSearchNoResultsCustomComponentComponent implements OnInit { private readonly BASE_PARAMS = { institution: '01JHU_INST', - vid: '01JHU_INST:JHU', + vid: '01JHU_INST:nde', ctx_ver: 'Z39.88-2004', ctx_enc: 'info:ofi/enc:UTF-8', url_ver: 'Z39.88-2004', diff --git a/src/assets/css/custom.css b/src/assets/css/custom.css index 086ed5b..644ff68 100755 --- a/src/assets/css/custom.css +++ b/src/assets/css/custom.css @@ -1,3 +1,5 @@ +/* This color is the one that can be changed in the Alma interface */ + :root { --sys-primary: #002d72; } @@ -71,10 +73,8 @@ /* Mobile header links */ @media (max-width: 480px) { .jh-header-menu ul { - display: flex; - flex-direction: column; - align-items: center; - padding: 30px; + display: none; + } } @@ -100,10 +100,6 @@ nde-user-area { background-color: #002d72 !important; } -/* Hide the title level request UI -- we only use item level request buttons */ -#nde\.request\.title { - display: none; -} /* Hide the option for journal in the citation linker */ nde-fetch-item #mat-radio-2 { diff --git a/src/assets/homepage/homepage.css b/src/assets/homepage/homepage.css index 3834874..e038a39 100755 --- a/src/assets/homepage/homepage.css +++ b/src/assets/homepage/homepage.css @@ -71,18 +71,6 @@ text-decoration: underline; } -/* Responsive design */ -@media (max-width: 768px) { - .content-container { - flex-direction: column; - } - - .flex-60, - .flex-40 { - flex: 1; - } -} - /* Utility classes */ .display-flex { display: flex; From 757ca71dc08f9d7d3cd22ca8f567d8150298fe21 Mon Sep 17 00:00:00 2001 From: Jamie Little Date: Thu, 5 Mar 2026 14:48:23 -0600 Subject: [PATCH 4/6] Hide title level requests again. There is a known issue for ILL GES in the NDE --- src/assets/css/custom.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/assets/css/custom.css b/src/assets/css/custom.css index 644ff68..944e165 100755 --- a/src/assets/css/custom.css +++ b/src/assets/css/custom.css @@ -100,6 +100,10 @@ nde-user-area { background-color: #002d72 !important; } +/* Hide the title level request UI -- we only use item level request buttons */ +#nde\.request\.title { + display: none; +} /* Hide the option for journal in the citation linker */ nde-fetch-item #mat-radio-2 { From 6f997c6d6e2e3f3929fb6187767d2a6b2e313e6a Mon Sep 17 00:00:00 2001 From: Jamie Little Date: Thu, 5 Mar 2026 15:23:36 -0600 Subject: [PATCH 5/6] Better naming convention --- src/app/custom1-module/customComponentMappings.ts | 4 ++-- .../nde-search-no-results-custom.component.html} | 0 .../nde-search-no-results-custom.component.scss} | 0 .../nde-search-no-results-custom.component.spec.ts} | 12 ++++++------ .../nde-search-no-results-custom.component.ts} | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) rename src/app/{nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html => nde-search-no-results-custom/nde-search-no-results-custom.component.html} (100%) rename src/app/{nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.scss => nde-search-no-results-custom/nde-search-no-results-custom.component.scss} (100%) rename src/app/{nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.spec.ts => nde-search-no-results-custom/nde-search-no-results-custom.component.spec.ts} (58%) rename src/app/{nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts => nde-search-no-results-custom/nde-search-no-results-custom.component.ts} (95%) diff --git a/src/app/custom1-module/customComponentMappings.ts b/src/app/custom1-module/customComponentMappings.ts index 7e78a0b..00d53f6 100644 --- a/src/app/custom1-module/customComponentMappings.ts +++ b/src/app/custom1-module/customComponentMappings.ts @@ -1,8 +1,8 @@ import { NdeSearchBarContainerCustomComponent } from "../nde-search-bar-container-custom/nde-search-bar-container-custom.component"; -import { NdeSearchNoResultsCustomComponentComponent } from "../nde-search-no-results-custom-component/nde-search-no-results-custom-component.component"; +import { NdeSearchNoResultsCustomComponent } from "../nde-search-no-results-custom/nde-search-no-results-custom.component"; // Define the map export const selectorComponentMap = new Map([ ["nde-search-bar-container-top", NdeSearchBarContainerCustomComponent], - ["nde-search-no-results-top", NdeSearchNoResultsCustomComponentComponent] + ["nde-search-no-results-top", NdeSearchNoResultsCustomComponent] ]); diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html b/src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.html similarity index 100% rename from src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.html rename to src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.html diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.scss b/src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.scss similarity index 100% rename from src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.scss rename to src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.scss diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.spec.ts b/src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.spec.ts similarity index 58% rename from src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.spec.ts rename to src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.spec.ts index a87cd0d..d5bcafc 100644 --- a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.spec.ts +++ b/src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.spec.ts @@ -1,18 +1,18 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { NdeSearchNoResultsCustomComponentComponent } from './nde-search-no-results-custom-component.component'; +import { NdeSearchNoResultsCustomComponent } from './nde-search-no-results-custom.component'; -describe('NdeSearchNoResultsCustomComponentComponent', () => { - let component: NdeSearchNoResultsCustomComponentComponent; - let fixture: ComponentFixture; +describe('NdeSearchNoResultsCustomComponent', () => { + let component: NdeSearchNoResultsCustomComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [NdeSearchNoResultsCustomComponentComponent] + imports: [NdeSearchNoResultsCustomComponent] }) .compileComponents(); - fixture = TestBed.createComponent(NdeSearchNoResultsCustomComponentComponent); + fixture = TestBed.createComponent(NdeSearchNoResultsCustomComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts b/src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.ts similarity index 95% rename from src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts rename to src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.ts index 5311d2e..025922b 100644 --- a/src/app/nde-search-no-results-custom-component/nde-search-no-results-custom-component.component.ts +++ b/src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.ts @@ -11,10 +11,10 @@ export const selectSearchState = createFeatureSelector('Search'); selector: 'custom-nde-search-no-results-custom-component', standalone: true, imports: [AsyncPipe, NgIf], - templateUrl: './nde-search-no-results-custom-component.component.html', - styleUrl: './nde-search-no-results-custom-component.component.scss' + templateUrl: './nde-search-no-results-custom.component.html', + styleUrl: './nde-search-no-results-custom.component.scss' }) -export class NdeSearchNoResultsCustomComponentComponent implements OnInit { +export class NdeSearchNoResultsCustomComponent implements OnInit { public store = inject(Store); searchState$!: Observable; From cd8c74499fa1498e1acddac26379f614367cc639 Mon Sep 17 00:00:00 2001 From: Jamie Little Date: Thu, 5 Mar 2026 15:45:37 -0600 Subject: [PATCH 6/6] Add an ASTM search hint component, and improve style of borrowdirect and worldcat linking --- .../custom1-module/customComponentMappings.ts | 4 +- .../nde-search-hint-custom.component.html | 15 +++ .../nde-search-hint-custom.component.scss | 27 ++++++ .../nde-search-hint-custom.component.spec.ts | 23 +++++ .../nde-search-hint-custom.component.ts | 43 +++++++++ ...de-search-no-results-custom.component.html | 86 +++++++++++++---- ...de-search-no-results-custom.component.scss | 93 +++++++++++++++++-- .../nde-search-no-results-custom.component.ts | 41 +------- 8 files changed, 268 insertions(+), 64 deletions(-) create mode 100644 src/app/nde-search-hint-custom/nde-search-hint-custom.component.html create mode 100644 src/app/nde-search-hint-custom/nde-search-hint-custom.component.scss create mode 100644 src/app/nde-search-hint-custom/nde-search-hint-custom.component.spec.ts create mode 100644 src/app/nde-search-hint-custom/nde-search-hint-custom.component.ts diff --git a/src/app/custom1-module/customComponentMappings.ts b/src/app/custom1-module/customComponentMappings.ts index 00d53f6..418ab44 100644 --- a/src/app/custom1-module/customComponentMappings.ts +++ b/src/app/custom1-module/customComponentMappings.ts @@ -1,8 +1,10 @@ import { NdeSearchBarContainerCustomComponent } from "../nde-search-bar-container-custom/nde-search-bar-container-custom.component"; +import { NdeSearchHintCustomComponent } from "../nde-search-hint-custom/nde-search-hint-custom.component"; import { NdeSearchNoResultsCustomComponent } from "../nde-search-no-results-custom/nde-search-no-results-custom.component"; // Define the map export const selectorComponentMap = new Map([ ["nde-search-bar-container-top", NdeSearchBarContainerCustomComponent], - ["nde-search-no-results-top", NdeSearchNoResultsCustomComponent] + ["nde-search-no-results-top", NdeSearchNoResultsCustomComponent], + ["nde-search-results-container-top", NdeSearchHintCustomComponent ] ]); diff --git a/src/app/nde-search-hint-custom/nde-search-hint-custom.component.html b/src/app/nde-search-hint-custom/nde-search-hint-custom.component.html new file mode 100644 index 0000000..9843763 --- /dev/null +++ b/src/app/nde-search-hint-custom/nde-search-hint-custom.component.html @@ -0,0 +1,15 @@ +
+ + +
+ info + + You can access ASTM standards using + + ASTM Compass + + +
+
+
+
diff --git a/src/app/nde-search-hint-custom/nde-search-hint-custom.component.scss b/src/app/nde-search-hint-custom/nde-search-hint-custom.component.scss new file mode 100644 index 0000000..9a5c293 --- /dev/null +++ b/src/app/nde-search-hint-custom/nde-search-hint-custom.component.scss @@ -0,0 +1,27 @@ +.hint-container { + display: flex; + justify-content: center; + padding: 16px; + width: 100%; +} + +.astm-hint-card { + max-width: 600px; + width: 100%; +} + +.hint-content { + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + + a { + font-weight: 500; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } +} diff --git a/src/app/nde-search-hint-custom/nde-search-hint-custom.component.spec.ts b/src/app/nde-search-hint-custom/nde-search-hint-custom.component.spec.ts new file mode 100644 index 0000000..ada65d2 --- /dev/null +++ b/src/app/nde-search-hint-custom/nde-search-hint-custom.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NdeSearchHintCustomComponent } from './nde-search-hint-custom.component'; + +describe('NdeSearchHintCustomComponent', () => { + let component: NdeSearchHintCustomComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NdeSearchHintCustomComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(NdeSearchHintCustomComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/nde-search-hint-custom/nde-search-hint-custom.component.ts b/src/app/nde-search-hint-custom/nde-search-hint-custom.component.ts new file mode 100644 index 0000000..33579c1 --- /dev/null +++ b/src/app/nde-search-hint-custom/nde-search-hint-custom.component.ts @@ -0,0 +1,43 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { createFeatureSelector, Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { AsyncPipe, NgIf } from '@angular/common'; +import { MatCardModule } from '@angular/material/card'; +import { MatIconModule } from '@angular/material/icon'; + +type SearchState = { searchParams: { q: string } }; +export const selectSearchState = createFeatureSelector('Search'); + +@Component({ + selector: 'custom-nde-search-hint-custom', + standalone: true, + imports: [AsyncPipe, NgIf, MatCardModule, MatIconModule], + templateUrl: './nde-search-hint-custom.component.html', + styleUrl: './nde-search-hint-custom.component.scss' +}) +export class NdeSearchHintCustomComponent implements OnInit { + public store = inject(Store); + + searchState$!: Observable; + searchTerm$!: Observable; + isAstmSearch$!: Observable; + + readonly ASTM_COMPASS_URL = "https://databases.library.jhu.edu/databases/proxy/JHU05996"; + + ngOnInit(): void { + this.searchState$ = this.store.select(selectSearchState); + this.searchTerm$ = this.searchState$.pipe( + map((state) => state.searchParams.q) + ); + + this.isAstmSearch$ = this.searchTerm$.pipe( + map((term) => this.isAstmSearch(term)) + ); + } + + isAstmSearch(term: string): boolean { + if (!term) return false; + return term.toLowerCase().includes("astm"); + } +} diff --git a/src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.html b/src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.html index 73351fa..30e89fd 100644 --- a/src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.html +++ b/src/app/nde-search-no-results-custom/nde-search-no-results-custom.component.html @@ -1,29 +1,75 @@
-