diff --git a/.github/workflows/deploy_production.yml b/.github/workflows/deploy_production.yml
new file mode 100644
index 000000000..96dc31adb
--- /dev/null
+++ b/.github/workflows/deploy_production.yml
@@ -0,0 +1,47 @@
+# Deploys to research-catalog-production
+name: deploy production
+
+on:
+ push:
+ branches:
+ - production
+
+permissions:
+ id-token: write
+ contents: read
+
+env:
+ AWS_DEFAULT_REGION: us-east-1
+ LOCAL_TAG_NAME: research-catalog:${{ github.ref_name }}-${{ github.run_number }}
+ ECR_URL: 946183545209.dkr.ecr.us-east-1.amazonaws.com/research-catalog:production-latest
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+
+ - name: Configure AWS credentials
+ uses: aws-actions/configure-aws-credentials@v4
+ with:
+ role-to-assume: arn:aws:iam::946183545209:role/GithubActionsDeployerRole
+ aws-region: us-east-1
+
+ - name: Log in to Amazon ECR
+ id: login-ecr
+ uses: aws-actions/amazon-ecr-login@v2
+
+ - name: Build and push Docker image to Amazon ECR
+ run: |
+ docker build --build-arg NEXT_PUBLIC_APP_ENV=production --tag $LOCAL_TAG_NAME .
+ docker tag $LOCAL_TAG_NAME $ECR_URL
+ # Re-tag last latest image just in case
+ MANIFEST=$(aws ecr batch-get-image --repository-name research-catalog --image-ids imageTag="production-latest" --output json | jq --raw-output --join-output '.images[0].imageManifest')
+ aws ecr batch-delete-image --repository-name research-catalog --image-ids imageTag="production-previous" || true
+ aws ecr put-image --repository-name research-catalog --image-tag "production-previous" --image-manifest "$MANIFEST" || true
+ docker push $ECR_URL
+
+ - name: Update ECS service
+ run: |
+ aws ecs update-service --cluster research-catalog-production --service research-catalog-production --force-new-deployment
diff --git a/.github/workflows/deploy_qa.yml b/.github/workflows/deploy_qa.yml
new file mode 100644
index 000000000..943dbcdd9
--- /dev/null
+++ b/.github/workflows/deploy_qa.yml
@@ -0,0 +1,48 @@
+# Deploys to research-catalog-qa
+name: deploy qa
+
+on:
+ push:
+ branches:
+ - qa
+ - SCC-4218/move-rc-from-travis-to-github-actions
+
+permissions:
+ id-token: write
+ contents: read
+
+env:
+ AWS_DEFAULT_REGION: us-east-1
+ LOCAL_TAG_NAME: research-catalog:${{ github.ref_name }}-${{ github.run_number }}
+ ECR_URL: 946183545209.dkr.ecr.us-east-1.amazonaws.com/research-catalog:qa-latest
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+
+ - name: Configure AWS credentials
+ uses: aws-actions/configure-aws-credentials@v4
+ with:
+ role-to-assume: arn:aws:iam::946183545209:role/GithubActionsDeployerRole
+ aws-region: us-east-1
+
+ - name: Log in to Amazon ECR
+ id: login-ecr
+ uses: aws-actions/amazon-ecr-login@v2
+
+ - name: Build and push Docker image to Amazon ECR
+ run: |
+ docker build --build-arg NEXT_PUBLIC_APP_ENV=qa --tag $LOCAL_TAG_NAME .
+ docker tag $LOCAL_TAG_NAME $ECR_URL
+ # Re-tag last latest image just in case
+ MANIFEST=$(aws ecr batch-get-image --repository-name research-catalog --image-ids imageTag="qa-latest" --output json | jq --raw-output --join-output '.images[0].imageManifest')
+ aws ecr batch-delete-image --repository-name research-catalog --image-ids imageTag="qa-previous" || true
+ aws ecr put-image --repository-name research-catalog --image-tag "qa-previous" --image-manifest "$MANIFEST" || true
+ docker push $ECR_URL
+
+ - name: Update ECS service
+ run: |
+ aws ecs update-service --cluster research-catalog-qa --service research-catalog-qa --force-new-deployment
diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml
index b706a49df..baea7a1eb 100644
--- a/.github/workflows/testing.yml
+++ b/.github/workflows/testing.yml
@@ -8,12 +8,12 @@ jobs:
strategy:
matrix:
- node-version: [18.x]
+ node-version: [20.x]
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v3
+ uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: npm install
diff --git a/.nvmrc b/.nvmrc
index 25bf17fc5..2edeafb09 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-18
\ No newline at end of file
+20
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index a4f042c26..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,63 +0,0 @@
-dist: xenial
-language: ruby
-
-services:
- - docker
-
-branches:
- only:
- - qa
- - production
-
-jobs:
- include:
- - stage: docker build
- if: (branch = qa or branch = production)
- before_install:
- - if [[ $TRAVIS_BRANCH == "qa" ]];
- then
- export NEXT_PUBLIC_APP_ENV="qa";
- fi
- - if [[ "$TRAVIS_BRANCH" == "production" ]];
- then
- export NEXT_PUBLIC_APP_ENV="production";
- fi
- env:
- - ECR_URL=946183545209.dkr.ecr.us-east-1.amazonaws.com/research-catalog
- - AWS_DEFAULT_REGION=us-east-1
- - AWS_REGION=us-east-1
- install:
- - pip install --user awscli
- - export LOCAL_TAG_NAME="${NEXT_PUBLIC_APP_ENV}-latest"
- script:
- - eval $(aws ecr get-login --no-include-email --region us-east-1)
- - docker build -t "$LOCAL_TAG_NAME" --build-arg NEXT_PUBLIC_APP_ENV="${NEXT_PUBLIC_APP_ENV}" .
- - docker tag "$LOCAL_TAG_NAME" "$ECR_URL:$LOCAL_TAG_NAME"
- # Re-tag last latest image just in case
- - |
- MANIFEST=$(aws ecr batch-get-image --repository-name research-catalog --image-ids imageTag="$NEXT_PUBLIC_APP_ENV-latest" --output json | jq --raw-output --join-output '.images[0].imageManifest')
- aws ecr batch-delete-image --repository-name research-catalog --image-ids imageTag="$NEXT_PUBLIC_APP_ENV-previous" || true
- aws ecr put-image --repository-name research-catalog --image-tag "$NEXT_PUBLIC_APP_ENV-previous" --image-manifest "$MANIFEST" || true
- - docker push "$ECR_URL:$LOCAL_TAG_NAME"
-
- - stage: deploy qa
- if: branch IN (qa) AND type != pull_request
- env:
- - AWS_DEFAULT_REGION=us-east-1
- - AWS_REGION=us-east-1
- - CLUSTER_NAME=research-catalog-qa
- install:
- - pip install --user awscli
- script:
- - aws ecs update-service --cluster $CLUSTER_NAME --service $CLUSTER_NAME --force-new-deployment
-
- - stage: deploy production
- if: branch IN (production) AND type != pull_request
- env:
- - AWS_DEFAULT_REGION=us-east-1
- - AWS_REGION=us-east-1
- - CLUSTER_NAME=research-catalog-production
- install:
- - pip install --user awscli
- script:
- - aws ecs update-service --cluster $CLUSTER_NAME --service $CLUSTER_NAME --force-new-deployment
diff --git a/CHANGELOG b/CHANGELOG
index 88d470707..4353e6f4b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [1.3.0] 2024-10-3
+
+### Added
+
+## Hotfix
+
+- Fix bug where the "View fewer" button was not appearing when filters weren't applied
+
+### Fixed
+
+- Small styling fixes after DS version bump to 3.4.0 (SCC-4264)
+- Fix bug where "undefined" appears in the search results heading (SCC-4277)
+- VQA second pass miscellaneous fixes (SCC-4264)
+- Fixed accessibility issue on Bib page where focus moves to Displaying text when filters are controlled via MultiSelect. This will change when dynamic updates are replaced with an apply button (SCC-4246)
+
+### Updated
+
+- Bump DS version to 3.4.0
+- Bump nvmrc version to Node 20.
+- Update error message in Item Filter Year to include new error message prefix from the DS.
+- Integrate view_all query param on client side and remove batched fetch (SCC-4287)
+- Replaced travis with github actions (SCC-4218)
+- Sentence case and rearrange search options (SCC-4260)
+
+Added the following, but commented out for later release:
+
+- Call number search scope to search dropdown options [(SCC-4260)](https://newyorkpubliclibrary.atlassian.net/browse/SCC-4260)
+- Search tip per search scope [(SCC-4263)](https://newyorkpubliclibrary.atlassian.net/browse/SCC-4263)
+
## [1.2.4] 2024-08-29
### Fixed
@@ -24,6 +53,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed some accessibility issues including making Request button titles more specific and fixing a layout issue on zoom. (SCC-4234)
+### Fixed
+
+- Fixed visual and copy issues found in VQA (SCC-4235)
+
## [1.2.2] 2024-08-14
### Updated
diff --git a/Dockerfile b/Dockerfile
index 94151590a..04267d537 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:16-alpine AS production
+FROM node:20-alpine AS production
#RUN apt-get update
#RUN apt-get upgrade -y
diff --git a/Dockerfile.development b/Dockerfile.development
index 1f3a1d068..b74e61a9f 100644
--- a/Dockerfile.development
+++ b/Dockerfile.development
@@ -1,4 +1,4 @@
-FROM node:16-alpine
+FROM node:20-alpine
WORKDIR /app
diff --git a/__test__/fixtures/bibFixtures.ts b/__test__/fixtures/bibFixtures.ts
index dd25a78ce..294842e95 100644
--- a/__test__/fixtures/bibFixtures.ts
+++ b/__test__/fixtures/bibFixtures.ts
@@ -11273,3 +11273,535 @@ export const bibManyEResources = {
subjectHeadings: null,
},
}
+
+export const bibWithSubjectHeadings = {
+ resource: {
+ "@context":
+ "http://discovery-api-qa.nypl.org/api/v0.1/discovery/context_all.jsonld",
+ "@type": ["nypl:Item", "nypl:Resource"],
+ "@id": "res:b16145054",
+ buildingLocationIds: ["rc"],
+ carrierType: [
+ {
+ "@id": "carriertypes:nc",
+ prefLabel: "volume",
+ },
+ ],
+ createdString: [2005],
+ createdYear: 2005,
+ creatorLiteral: ["Cortanze, Gérard de."],
+ creatorLiteralNormalized: ["Gérard Cortanze", "Gérard de Cortanze"],
+ creatorLiteralWithoutDates: ["Cortanze, Gérard de."],
+ dateStartYear: 2005,
+ dateString: [2005],
+ dimensions: ["19 cm."],
+ electronicResources: [],
+ extent: ["193 p. : ill. ;"],
+ idIsbn: [2070775178],
+ idLccn: [2005483039],
+ idOclc: [61868265],
+ identifier: [
+ {
+ "@type": "bf:ShelfMark",
+ "@value": "JFC 06-438",
+ },
+ {
+ "@type": "nypl:Bnumber",
+ "@value": 16145054,
+ },
+ {
+ "@type": "bf:Isbn",
+ "@value": 2070775178,
+ },
+ {
+ "@type": "nypl:Oclc",
+ "@value": 61868265,
+ },
+ {
+ "@type": "bf:Lccn",
+ "@value": 2005483039,
+ },
+ {
+ "@type": "bf:Identifier",
+ "@value": "(WaOLN)M040000221",
+ },
+ ],
+ issuance: [
+ {
+ "@id": "urn:biblevel:m",
+ prefLabel: "monograph/item",
+ },
+ ],
+ itemAggregations: [
+ {
+ "@type": "nypl:Aggregation",
+ "@id": "res:location",
+ id: "location",
+ field: "location",
+ values: [
+ {
+ value: "loc:rc2ma",
+ count: 1,
+ label: "Offsite",
+ },
+ ],
+ },
+ {
+ "@type": "nypl:Aggregation",
+ "@id": "res:format",
+ id: "format",
+ field: "format",
+ values: [
+ {
+ value: "Text",
+ count: 1,
+ label: "Text",
+ },
+ ],
+ },
+ {
+ "@type": "nypl:Aggregation",
+ "@id": "res:status",
+ id: "status",
+ field: "status",
+ values: [
+ {
+ value: "status:a",
+ count: 1,
+ label: "Available",
+ },
+ ],
+ },
+ ],
+ items: [
+ {
+ "@id": "res:i15550040",
+ "@type": ["bf:Item"],
+ accessMessage: [
+ {
+ "@id": "accessMessage:2",
+ prefLabel: "Request in advance",
+ },
+ ],
+ catalogItemType: [
+ {
+ "@id": "catalogItemType:55",
+ prefLabel: "book, limited circ, MaRLI",
+ },
+ ],
+ eddFulfillment: {
+ "@id": "fulfillment:recap-edd",
+ },
+ eddRequestable: true,
+ formatLiteral: ["Text"],
+ holdingLocation: [
+ {
+ "@id": "loc:rc2ma",
+ prefLabel: "Offsite",
+ },
+ ],
+ idBarcode: ["33433073236758"],
+ identifier: [
+ {
+ "@type": "bf:ShelfMark",
+ "@value": "JFC 06-438",
+ },
+ {
+ "@type": "bf:Barcode",
+ "@value": "33433073236758",
+ },
+ ],
+ owner: [
+ {
+ "@id": "orgs:1000",
+ prefLabel: "Stephen A. Schwarzman Building",
+ },
+ ],
+ physFulfillment: {
+ "@id": "fulfillment:recap-offsite",
+ },
+ physRequestable: true,
+ physicalLocation: ["JFC 06-438"],
+ recapCustomerCode: ["NA"],
+ requestable: [true],
+ shelfMark: ["JFC 06-438"],
+ specRequestable: false,
+ status: [
+ {
+ "@id": "status:a",
+ prefLabel: "Available",
+ },
+ ],
+ uri: "i15550040",
+ idNyplSourceId: {
+ "@type": "SierraNypl",
+ "@value": "15550040",
+ },
+ },
+ ],
+ language: [
+ {
+ "@id": "lang:fre",
+ prefLabel: "French",
+ },
+ ],
+ lccClassification: ["PQ2663.O7223 Z46 2005"],
+ materialType: [
+ {
+ "@id": "resourcetypes:txt",
+ prefLabel: "Text",
+ },
+ ],
+ mediaType: [
+ {
+ "@id": "mediatypes:n",
+ prefLabel: "unmediated",
+ },
+ ],
+ numCheckinCardItems: 0,
+ numElectronicResources: 0,
+ numItemDatesParsed: 0,
+ numItemVolumesParsed: 0,
+ numItemsMatched: 1,
+ numItemsTotal: 1,
+ nyplSource: ["sierra-nypl"],
+ placeOfPublication: ["[Paris, France]"],
+ popularity: 1,
+ publicationStatement: ["[Paris, France] : Gallimard, c2005."],
+ publisherLiteral: ["Gallimard"],
+ seriesStatement: ["Haute enfance"],
+ shelfMark: ["JFC 06-438"],
+ subjectLiteral: [
+ "Cortanze, Gérard de -- Childhood and youth.",
+ "Authors, French -- 20th century -- Biography.",
+ "Autobiographical Narrative",
+ ],
+ title: ["Spaghetti!"],
+ titleDisplay: ["Spaghetti! / Gérard de Cortanze."],
+ type: ["nypl:Item"],
+ uniformTitle: ["Haute enfance (Gallimard (Firm))"],
+ updatedAt: 1723133852918,
+ uri: "b16145054",
+ suppressed: false,
+ hasItemVolumes: false,
+ hasItemDates: false,
+ subjectHeadings: [
+ {
+ label: "Cortanze, Gérard de -- Childhood and youth",
+ uuid: "74746d11-638b-4cfb-a72a-9a2bd296e6fd",
+ bib_count: 1,
+ desc_count: 0,
+ parent: {
+ label: "Cortanze, Gérard de",
+ uuid: "cf347108-e1f2-4c0f-808a-ac4ace2f0765",
+ bib_count: 5,
+ desc_count: 4,
+ },
+ },
+ {
+ label: "Authors, French -- 20th century -- Biography",
+ uuid: "9391bc26-e44c-44ac-98cc-e3800da51926",
+ bib_count: 5319,
+ desc_count: 22,
+ parent: {
+ label: "Authors, French -- 20th century",
+ uuid: "e43674a7-5f02-44f1-95cd-dbcc776331b7",
+ bib_count: 8405,
+ desc_count: 197,
+ parent: {
+ label: "Authors, French",
+ uuid: "5fd065df-b4e9-48cb-b13c-ea15f36b96b4",
+ bib_count: 14275,
+ desc_count: 1012,
+ },
+ },
+ },
+ {
+ label: "Autobiographical Narrative",
+ uuid: "3a779ed6-8a07-4d27-80ef-e0c2b10fe78e",
+ bib_count: 505,
+ desc_count: 343,
+ },
+ ],
+ },
+ annotatedMarc: {
+ id: "16145054",
+ nyplSource: "sierra-nypl",
+ fields: [
+ {
+ label: "Author",
+ values: [
+ {
+ content: "Cortanze, Gérard de.",
+ source: {
+ fieldTag: "a",
+ marcTag: "100",
+ ind1: "1",
+ ind2: " ",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "Cortanze, Gérard de.",
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: "Title",
+ values: [
+ {
+ content: "Spaghetti! / Gérard de Cortanze.",
+ source: {
+ fieldTag: "t",
+ marcTag: "245",
+ ind1: "1",
+ ind2: "0",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "Spaghetti! /",
+ },
+ {
+ tag: "c",
+ content: "Gérard de Cortanze.",
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: "Imprint",
+ values: [
+ {
+ content: "[Paris, France] : Gallimard, c2005.",
+ source: {
+ fieldTag: "p",
+ marcTag: "260",
+ ind1: " ",
+ ind2: " ",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "[Paris, France] :",
+ },
+ {
+ tag: "b",
+ content: "Gallimard,",
+ },
+ {
+ tag: "c",
+ content: "c2005.",
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: "Description",
+ values: [
+ {
+ content: "193 p. : ill. ; 19 cm.",
+ source: {
+ fieldTag: "r",
+ marcTag: "300",
+ ind1: " ",
+ ind2: " ",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "193 p. :",
+ },
+ {
+ tag: "b",
+ content: "ill. ;",
+ },
+ {
+ tag: "c",
+ content: "19 cm.",
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: "Series",
+ values: [
+ {
+ content: "Haute enfance",
+ source: {
+ fieldTag: "s",
+ marcTag: "490",
+ ind1: "1",
+ ind2: " ",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "Haute enfance",
+ },
+ ],
+ },
+ },
+ {
+ content: "Haute enfance (Gallimard (Firm))",
+ source: {
+ fieldTag: "s",
+ marcTag: "830",
+ ind1: " ",
+ ind2: "0",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "Haute enfance (Gallimard (Firm))",
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: "Indexed Term",
+ values: [
+ {
+ content: "Autobiographical Narrative",
+ source: {
+ fieldTag: "d",
+ marcTag: "653",
+ ind1: " ",
+ ind2: " ",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "Autobiographical Narrative",
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: "Subject",
+ values: [
+ {
+ content: "Cortanze, Gérard de -- Childhood and youth.",
+ source: {
+ fieldTag: "d",
+ marcTag: "600",
+ ind1: "1",
+ ind2: "0",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "Cortanze, Gérard de",
+ },
+ {
+ tag: "x",
+ content: "Childhood and youth.",
+ },
+ ],
+ },
+ },
+ {
+ content: "Authors, French -- 20th century -- Biography.",
+ source: {
+ fieldTag: "d",
+ marcTag: "650",
+ ind1: " ",
+ ind2: "0",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "Authors, French",
+ },
+ {
+ tag: "y",
+ content: "20th century",
+ },
+ {
+ tag: "v",
+ content: "Biography.",
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: "LCCN",
+ values: [
+ {
+ content: "2005483039",
+ source: {
+ fieldTag: "l",
+ marcTag: "010",
+ ind1: " ",
+ ind2: " ",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "2005483039",
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: "ISBN",
+ values: [
+ {
+ content: "2070775178",
+ source: {
+ fieldTag: "i",
+ marcTag: "020",
+ ind1: " ",
+ ind2: " ",
+ content: null,
+ subfields: [
+ {
+ tag: "a",
+ content: "2070775178",
+ },
+ ],
+ },
+ },
+ ],
+ },
+ {
+ label: "Research Call Number",
+ values: [
+ {
+ content: "JFC 06-438",
+ source: {
+ fieldTag: "q",
+ marcTag: "852",
+ ind1: "8",
+ ind2: " ",
+ content: null,
+ subfields: [
+ {
+ tag: "h",
+ content: "JFC 06-438",
+ },
+ ],
+ },
+ },
+ ],
+ },
+ ],
+ },
+}
diff --git a/__test__/pages/Home.test.tsx b/__test__/pages/Home.test.tsx
index 74b6a0401..197b779b2 100644
--- a/__test__/pages/Home.test.tsx
+++ b/__test__/pages/Home.test.tsx
@@ -9,8 +9,8 @@ jest.mock("next/router", () => jest.requireActual("next-router-mock"))
describe("Home", () => {
it("should render the search form", () => {
render(