diff --git a/.github/workflows/ci_workflow.yml b/.github/workflows/ci_workflow.yml index 69c652d5a7..eaef3721a9 100644 --- a/.github/workflows/ci_workflow.yml +++ b/.github/workflows/ci_workflow.yml @@ -39,12 +39,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde # v2.9.1 + uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 with: egress-policy: audit - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 # Get all history and branches @@ -57,7 +57,7 @@ jobs: echo "SHA: ${{ steps.get-sha.outputs.SHA }}" - name: Set up node ${{ matrix.node-version}} - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: node-version: ${{ matrix.node-version }} @@ -65,7 +65,7 @@ jobs: run: corepack enable - name: Get yarn cache ${{ matrix.node-version}} - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'yarn' @@ -79,7 +79,7 @@ jobs: - name: Upload code coverage if: matrix.node-version == 20.13 # upload coverage report for current node version only - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0 + uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} with: @@ -88,7 +88,7 @@ jobs: - name: Perform SonarCloud Analysis if: matrix.node-version == 20.13 && github.event_name != 'pull_request' && github.repository_owner == env.MAIN_REPO_OWNER # perform SonarCloud analysis only for current node version and not with pull requests or forks(token issue) - uses: SonarSource/sonarcloud-github-action@e44258b109568baa0df60ed515909fc6c72cba92 # v2.3.0 + uses: SonarSource/sonarcloud-github-action@383f7e52eae3ab0510c3cb0e7d9d150bbaeab838 # v3.1.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} @@ -109,7 +109,7 @@ jobs: - name: Upload build artifacts (main && develop) # upload build artifacts for current node version and main or develop branch only if: matrix.node-version == 20.13 && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop') - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # ratchet:actions/upload-artifact@v4.3.6 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: dist path: ${{ github.workspace }}/${{ env.DIST_DIR }} @@ -136,12 +136,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde # v2.9.1 + uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 with: egress-policy: audit - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: # ref (branch, tag or SHA) to check out ref: ${{ env.DEV_GH_PAGES_BRANCH }} @@ -208,14 +208,14 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde # v2.9.1 + uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 with: egress-policy: audit - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up node ${{ matrix.node-version}} - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: node-version: ${{ matrix.node-version }} cache: 'yarn' @@ -248,7 +248,7 @@ jobs: node-version: [20.13] steps: - name: Harden Runner - uses: step-security/harden-runner@5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde # v2.9.1 + uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 with: egress-policy: audit @@ -264,6 +264,6 @@ jobs: TAG_VERSION: ${{ steps.get_version.outputs.VERSION }} with: name: Release ${{ env.TAG_VERSION }} - body: "A prototype web application for the online edition of the [Anton Webern Gesamtausgabe](https://www.anton-webern.ch), located at the Department of Musicology of the University of Basel. It is written in [Angular](https://angular.io/) and runs on [edition.anton-webern.ch](https://edition.anton-webern.ch).\n\n Changes since last release: https://github.com/${{ github.repository }}/blob/${{ env.TAG_VERSION }}/CHANGELOG.md" + body: "A web application for the online edition of the [Anton Webern Gesamtausgabe](https://www.anton-webern.ch), located at the Department of Musicology of the University of Basel. It is written in [Angular](https://angular.io/) and runs on [edition.anton-webern.ch](https://edition.anton-webern.ch).\n\n Changes since last release: https://github.com/${{ github.repository }}/blob/${{ env.TAG_VERSION }}/CHANGELOG.md" draft: false prerelease: false diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 40da09c115..4332f7df72 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -26,23 +26,23 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde # v2.9.1 + uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 with: egress-policy: audit - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@429e1977040da7a23b6822b13c129cd1ba93dbb2 # v3.26.2 + uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 with: languages: ${{ matrix.language }} # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@429e1977040da7a23b6822b13c129cd1ba93dbb2 # v3.26.2 + uses: github/codeql-action/autobuild@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@429e1977040da7a23b6822b13c129cd1ba93dbb2 # v3.26.2 + uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index bf2dcfbae9..08871d943b 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -17,11 +17,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde # v2.9.1 + uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 with: egress-policy: audit - name: 'Checkout Repository' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: 'Dependency Review' - uses: actions/dependency-review-action@5a2ce3f5b92ee19cbb1541a4984c76d921601d7c # v4.3.4 + uses: actions/dependency-review-action@a6993e2c61fd5dc440b409aa1d6904921c5e1894 # v4.3.5 diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index b6da2ca471..a88b1673d6 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -31,12 +31,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde # v2.9.1 + uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 with: egress-policy: audit - name: "Checkout code" - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false @@ -63,7 +63,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: SARIF file path: results.sarif @@ -71,6 +71,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@429e1977040da7a23b6822b13c129cd1ba93dbb2 # v3.26.2 + uses: github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 with: sarif_file: results.sarif diff --git a/.github/workflows/visualize-repo.yml b/.github/workflows/visualize-repo.yml index 0c71b6f2d1..b0fca8258e 100644 --- a/.github/workflows/visualize-repo.yml +++ b/.github/workflows/visualize-repo.yml @@ -14,12 +14,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde # v2.9.1 + uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 with: egress-policy: audit - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: develop token: ${{ secrets.REPO_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 130f3be8ad..22e884abaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,235 @@ All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines. +## [1.0.0](https://github.com/webern-unibas-ch/awg-app/compare/v0.14.0...v1.0.0) (2024-10-26) + +### ⚠ BREAKING CHANGES + +- **app:** This ends the status of the app as a prototype. + +### Features + +- **app:** move away from prototype ([0495501](https://github.com/webern-unibas-ch/awg-app/commit/0495501db4a05edc59a23d525f0f67d5f2bd769b)) +- **assets:** add corrections in Op12: C ([627979a](https://github.com/webern-unibas-ch/awg-app/commit/627979afd42153b0b1892bd4f172bfd556ad498e); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op25: E ([af3804f](https://github.com/webern-unibas-ch/awg-app/commit/af3804f473c0d47dd6d2aa8afda0cbc8075ad605); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op3: A ([efff423](https://github.com/webern-unibas-ch/awg-app/commit/efff423b071df0376e4215f84b511b1433fb278c); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op3: B ([afbde12](https://github.com/webern-unibas-ch/awg-app/commit/afbde12b5a6194dbc716c817f04c60fa21f6c0ea); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op3: C ([29873dc](https://github.com/webern-unibas-ch/awg-app/commit/29873dc9d29b5d3215c7db098494507cccdcbccb); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op3: E ([8fd65a3](https://github.com/webern-unibas-ch/awg-app/commit/8fd65a35df30647ef1c27b17ba005d3a03ad9a21); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op3: F ([6aa4ee9](https://github.com/webern-unibas-ch/awg-app/commit/6aa4ee9c2e67d84f23041a49b827895dfc187685); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op3: G ([6a9a559](https://github.com/webern-unibas-ch/awg-app/commit/6a9a559691e64ea476a08a8f21aaa0aae42bec90); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op3: H ([1e978d1](https://github.com/webern-unibas-ch/awg-app/commit/1e978d1ef67471c8c58398a4b568ebb4b7ae2d21); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op3: I + J ([490313d](https://github.com/webern-unibas-ch/awg-app/commit/490313dc6e56c8ac37cad515e8769cf20239a96f); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op4: A ([21243a0](https://github.com/webern-unibas-ch/awg-app/commit/21243a0c29363359fff069174ab553fd49862cda); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op4: B ([#1881](https://github.com/webern-unibas-ch/awg-app/issues/1881)) ([c5dda47](https://github.com/webern-unibas-ch/awg-app/commit/c5dda4715d685b6e05b86d6ac46510b7bcaffcb7); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op4: D ([b8569b2](https://github.com/webern-unibas-ch/awg-app/commit/b8569b284fc8cd96b59f0209d7a35d268eb35de1); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op4: GH ([2087ead](https://github.com/webern-unibas-ch/awg-app/commit/2087eadcbd4f5040e3d21f62c6842076ae384821); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add corrections in Op4: I ([c73d9df](https://github.com/webern-unibas-ch/awg-app/commit/c73d9df536fa6485f1714b4ea5fa7cb53bd36c25); thanks to [@masthom](https://github.com/masthom)) +- **assets:** add intro preview to section detail ([dbf516a](https://github.com/webern-unibas-ch/awg-app/commit/dbf516a075fe92f702baea8ec33fd94b492ab86c)) +- **assets:** create section wide intro file ([49bdbad](https://github.com/webern-unibas-ch/awg-app/commit/49bdbade5b9898ecef9ce5c1d2efad38e2c1ec08)) +- **edition:** add breadcrumb for section intro ([5ee951b](https://github.com/webern-unibas-ch/awg-app/commit/5ee951b4dab6c2770cd5878fc3b5e514c95b5cfc)) +- **edition:** add check for intro view ([91442e2](https://github.com/webern-unibas-ch/awg-app/commit/91442e21d6cfcf6a7e498e44d25f6a1869002380)) +- **edition:** add cover images to section overview ([9024e76](https://github.com/webern-unibas-ch/awg-app/commit/9024e7681bb85d044414dd9fd28990a295d68473)) +- **edition:** add disclaimer for partial intros ([c772332](https://github.com/webern-unibas-ch/awg-app/commit/c7723327b972f258ede2aab1c18f064a5b2f4987)) +- **edition:** add disclaimer for workeditions ([b3cd451](https://github.com/webern-unibas-ch/awg-app/commit/b3cd451e6926b2f16b6a68674d499fbde1277b80)) +- **edition:** add english version of intro AWG I/5 ([e79f4c1](https://github.com/webern-unibas-ch/awg-app/commit/e79f4c13fc41900efc683d47c22e4bb113774fae)) +- **edition:** add language switcher to intro ([cd3471b](https://github.com/webern-unibas-ch/awg-app/commit/cd3471b05bd54f6871fbd0d2ab11464cf72c7999)) +- **edition:** add route for section intro ([f6e29ac](https://github.com/webern-unibas-ch/awg-app/commit/f6e29acfcbffb7db49a062c8ebbd5b210f111a59)) +- **edition:** add scrollable menu to intro ([c1b49d6](https://github.com/webern-unibas-ch/awg-app/commit/c1b49d6a3638f44596cb649e480ea64ad91fde05)) +- **edition:** add section intro link to side info ([a4326c3](https://github.com/webern-unibas-ch/awg-app/commit/a4326c335fef302c57a5803833174f085f919253)) +- **edition:** add service method to load section intro data ([7bc1a87](https://github.com/webern-unibas-ch/awg-app/commit/7bc1a87231060e43aaa867e52f228cee5037ca4e)) +- **edition:** include intro and disclaimer in edition section detail ([10b517c](https://github.com/webern-unibas-ch/awg-app/commit/10b517c04b998f11dbedc339d1401b2c9cd84a6b)) +- **home:** add card navigation to home view ([79cb5e3](https://github.com/webern-unibas-ch/awg-app/commit/79cb5e33814dc449f33c72e40634de4dc707f729)) +- **shared:** add abbreviation directive ([c9d75d8](https://github.com/webern-unibas-ch/awg-app/commit/c9d75d81e401f834d6afda8a6d4eac04e24f2530)) + +### Bug Fixes + +- **app:** do not show sideOutlet on home view ([dc42407](https://github.com/webern-unibas-ch/awg-app/commit/dc42407ed302d21ca122b6ca431d5a2cdf2fbfe1)) +- **assets:** add full intro for AWG I/5 ([169be29](https://github.com/webern-unibas-ch/awg-app/commit/169be29fcb767f73ad0e98266490f715e6059dcb)) +- **assets:** fix formatting of corrections ([10797f9](https://github.com/webern-unibas-ch/awg-app/commit/10797f92c39dfcc11d328aaca9b69114563929ce)) +- **assets:** fix formatting of corrections op3 ([1231ef7](https://github.com/webern-unibas-ch/awg-app/commit/1231ef74a501213e8018c123f9ae44ea45519505)) +- **assets:** fix formatting of corrections op3: B ([b234ef6](https://github.com/webern-unibas-ch/awg-app/commit/b234ef6b6d8331600414d156a3503f9c234b4741)) +- **assets:** fix formatting of corrections op3: C ([c49b0fb](https://github.com/webern-unibas-ch/awg-app/commit/c49b0fb6150c2e18a8d4c5529f49514bed28c422)) +- **assets:** fix formatting of corrections op3: E ([d52628d](https://github.com/webern-unibas-ch/awg-app/commit/d52628dda7446768c3a94ce86a5c27d2269963d3)) +- **assets:** fix formatting of corrections op3: F–H ([2b57b7f](https://github.com/webern-unibas-ch/awg-app/commit/2b57b7fdc33207273762b199ca810cd73ad924d1)) +- **assets:** fix link boxes in m38 ([d00e60d](https://github.com/webern-unibas-ch/awg-app/commit/d00e60de1c34a479590af8c061292bb3d2a46bf6); thanks to [@chael-mi](https://github.com/chael-mi)) +- **assets:** fix typo in label in op3: source_Ee_corr2 ([cd91a14](https://github.com/webern-unibas-ch/awg-app/commit/cd91a1459e2b71e6e0acfa18517de321318f1ca3)) +- **assets:** fix typo in textcritics for m38 ([62eff2c](https://github.com/webern-unibas-ch/awg-app/commit/62eff2c9e132ac062cdbac2863d0fb471fb35e7a)) +- **assets:** fix typos in intro AWG I/5 ([9780252](https://github.com/webern-unibas-ch/awg-app/commit/9780252585afa940f8f5d8aa464349986630793b)) +- **assets:** make sources of intro navigable ([836ea8a](https://github.com/webern-unibas-ch/awg-app/commit/836ea8a73d4bd7947cec029483bf89eb4003424d)) +- **assets:** optimize svgs for m38 with SVGO ([af48f6a](https://github.com/webern-unibas-ch/awg-app/commit/af48f6a65a7000ccbda9892f0e638f574c2f5234)) +- **assets:** provide intro notes as blockNotes ([267aa0f](https://github.com/webern-unibas-ch/awg-app/commit/267aa0f7bac894dc7980e7d6740919a6b870f2f0)) +- **assets:** remove disclaimer for corrections of op25 ([9087bfc](https://github.com/webern-unibas-ch/awg-app/commit/9087bfccf7b5ef6d06193faafe0e68277f885050); thanks to [@masthom](https://github.com/masthom)) +- **assets:** remove side outlet from data ([d9421de](https://github.com/webern-unibas-ch/awg-app/commit/d9421de1b243c8f4b02e96de4c3368826e120d3e)) +- **assets:** remove unnecessary line break from intro AWG I/5 ([b0905bc](https://github.com/webern-unibas-ch/awg-app/commit/b0905bc0cd11c65694fa8c368924cb75ebc0e07f)) +- **assets:** small fixes in source descriptions AWG I/5 ([c520b4e](https://github.com/webern-unibas-ch/awg-app/commit/c520b4e20596a8a3924cd771ac69cb5bda5430fb); thanks to [@masthom](https://github.com/masthom)) +- **assets:** use glyphs for note values ([eb26661](https://github.com/webern-unibas-ch/awg-app/commit/eb26661b8b5c1838a60d24b44d4a729440e2f6cd)) +- **core:** mute search button on navbar ([53a1d90](https://github.com/webern-unibas-ch/awg-app/commit/53a1d90109bedf97b31ff38b110440592367f965)) +- **edition:** add complex to breadcrumb if given ([86857ec](https://github.com/webern-unibas-ch/awg-app/commit/86857ecd7feff170a0544c74f592a4d902810b48)) +- **edition:** add description to series overview ([c517895](https://github.com/webern-unibas-ch/awg-app/commit/c517895fe7d64187c7d9a1587a5fddba5fc6f9fd)) +- **edition:** add missing glyph for sfz ([d1d3c41](https://github.com/webern-unibas-ch/awg-app/commit/d1d3c4101bd9b2a86c2631fe6654e4a9161e0263)) +- **edition:** add missing glyphs for note values ([2d08ad1](https://github.com/webern-unibas-ch/awg-app/commit/2d08ad1286f55726d2972facd58933958f2e20dd)) +- **edition:** add missing glyphs for sf and sp ([7cebd28](https://github.com/webern-unibas-ch/awg-app/commit/7cebd281a186342154e04e2773e97d07e38ff475)) +- **edition:** don't display table if there are no corrections ([02bf591](https://github.com/webern-unibas-ch/awg-app/commit/02bf591abfd43ae21266dcb18d0c1b2f65e73b3c)) +- **edition:** finish formatting of intro AWG I/5 ([464e16e](https://github.com/webern-unibas-ch/awg-app/commit/464e16e1f20d7aca49ef0c16f00ad585c05d729b)) +- **edition:** fix check for section III/5 in outline model ([317c66d](https://github.com/webern-unibas-ch/awg-app/commit/317c66d2e0ea4ecae254e13b8f75c68895ccff4c)) +- **edition:** fix typo in textcritics for m38 ([c03ba8c](https://github.com/webern-unibas-ch/awg-app/commit/c03ba8c3c2ae6afe8e9d5fccb15a9f67205ef28f)) +- **edition:** improve wording in section detail disclaimer ([dc3ec09](https://github.com/webern-unibas-ch/awg-app/commit/dc3ec0986d431d868ff770493700785bd3f0d150)) +- **edition:** improve wording of section detail disclaimer ([b4f6ff2](https://github.com/webern-unibas-ch/awg-app/commit/b4f6ff253cce4921b4ef71605fb49f2a45d36f51)) +- **edition:** make footnotes of intro navigable ([57d575a](https://github.com/webern-unibas-ch/awg-app/commit/57d575a6b082c2e71f0ffcbe029718dcc6388d68)) +- **edition:** move intro parts into separate components ([7965435](https://github.com/webern-unibas-ch/awg-app/commit/79654355a70ce97c62145e79ca4013a590500889)) +- **edition:** move section detail overview into separate comp ([4dc7bd9](https://github.com/webern-unibas-ch/awg-app/commit/4dc7bd9e459e0a39702cb5f44e79d8c3a717d8c1)) +- **edition:** update series and section from edition complex too ([4b87cc6](https://github.com/webern-unibas-ch/awg-app/commit/4b87cc6520a078612e034bb45e26b46cf9c3b056)) +- **edition:** use solid icon for calendarX ([64df1f1](https://github.com/webern-unibas-ch/awg-app/commit/64df1f1f262fad2340a37abdfe5406b00996608f)) +- **home:** display sections instead of complexes in home-view ([261b97a](https://github.com/webern-unibas-ch/awg-app/commit/261b97a02040b9a73da7a6c0ad08a4af29824988)) +- **home:** link to doku page instead of compodoc ([c2707c9](https://github.com/webern-unibas-ch/awg-app/commit/c2707c9bd7c569826e75d8f28cfd87ec9941fc65)) +- **home:** update landing page content ([9053f3d](https://github.com/webern-unibas-ch/awg-app/commit/9053f3d8fe131c8694bdb0fb00a10c6d689fa207)) +- **side-info:** collapse section menus by default ([417d0a4](https://github.com/webern-unibas-ch/awg-app/commit/417d0a4d1380a97f9ef6db45656ab5e9a55a82f7)) +- **side-info:** open sections dynamically ([f02325b](https://github.com/webern-unibas-ch/awg-app/commit/f02325b40f27064cbc41a39b12046d3d0dca814d)) +- **structure:** replace SALSAH with DSP in structure-view ([b4dae1d](https://github.com/webern-unibas-ch/awg-app/commit/b4dae1d678f770b093dca3f72eb0b9c398f45412)) + +### Code Refactoring + +- **app:** rename routeToSidenav method ([889e4e4](https://github.com/webern-unibas-ch/awg-app/commit/889e4e447c55c4718ef62ccb8708f8961ceda3a9)) +- **core:** improve handling of navbar icons and labels ([d78e66b](https://github.com/webern-unibas-ch/awg-app/commit/d78e66b84e44f7059fc98958408caf6499cc542b)) +- **core:** unify naming of core data ([5a4b4cc](https://github.com/webern-unibas-ch/awg-app/commit/5a4b4cc6302f244412f4f17b85cb423ac889db24)) +- **edition:** adjust outline model to account for intro ([33fb9ed](https://github.com/webern-unibas-ch/awg-app/commit/33fb9ed0c4277951478dfd52c714b3611013c8af)) +- **edition:** adjust wording for headings and disclaimer ([ac82f9d](https://github.com/webern-unibas-ch/awg-app/commit/ac82f9d6799b8cb0adb70a20ab82d7cc6baf4d14)) +- **edition:** improve naming of intro scroll methods ([3a6e00b](https://github.com/webern-unibas-ch/awg-app/commit/3a6e00b88493d1f4f86647940549ccec4b13055b)) +- **edition:** improve wording of disclaimers ([90faae0](https://github.com/webern-unibas-ch/awg-app/commit/90faae0354c7ab8aea68181d37076e94e5d550b5)) +- **edition:** rename EditionIntroEmptyComponent ([e638f35](https://github.com/webern-unibas-ch/awg-app/commit/e638f3585cfdedaa17ba68e5b764240d804cedc1)) +- **edition:** rename EditionService -> EditionStateService ([4800f27](https://github.com/webern-unibas-ch/awg-app/commit/4800f27927180acae9aa206ea2ce4b441990a8a4)) +- **edition:** rename intro footnotes --> notes ([62a5e06](https://github.com/webern-unibas-ch/awg-app/commit/62a5e066c3a35f48147e174b635549657553baa1)) +- **edition:** reorganize edition view routing ([9152c8f](https://github.com/webern-unibas-ch/awg-app/commit/9152c8ffe03a0020b9d38194ec19d35b80d1c015)) +- **home:** move home cards into separate component ([8ce8dd7](https://github.com/webern-unibas-ch/awg-app/commit/8ce8dd7f9535aa138b7b73546d622749e7c1f3b0)) +- **shared:** move alert-info into separate component ([f55a6ff](https://github.com/webern-unibas-ch/awg-app/commit/f55a6ffde221a03a434e7ae2f65517c9fe2a8bfa)) +- **shared:** move language switcher into separate component ([7999eab](https://github.com/webern-unibas-ch/awg-app/commit/7999eab51dcdfa7a1e235eab5788e188fdfde391)) +- **shared:** rename AlertErrorComponent ([9cc9d76](https://github.com/webern-unibas-ch/awg-app/commit/9cc9d76b8073a7dcbd6db900d57bcaec5123c1ec)) + +### Tests + +- **edition:** fix tests for intro components after changes ([4a6bccb](https://github.com/webern-unibas-ch/awg-app/commit/4a6bccb543d156baf6ae77bc6d06f030f5f9fc90)) +- **home:** fix tests after changes ([1aae98d](https://github.com/webern-unibas-ch/awg-app/commit/1aae98d4b751bf8939df76a081c3cc0f60606f1a)) +- **search:** fix tests after changes ([ccc2864](https://github.com/webern-unibas-ch/awg-app/commit/ccc2864574b735c0874e1c4ff473224470aa3bb1)) +- **side-info:** fix tests for EditionInfo after changes ([ef11d3a](https://github.com/webern-unibas-ch/awg-app/commit/ef11d3ab9720caf55de3b0116b694a3d7b34054f)) + +### Documentation + +- **README:** update project image ([1a5b9e6](https://github.com/webern-unibas-ch/awg-app/commit/1a5b9e6ce1ea05928326265734f8a306a400b0e8)) +- **shared:** add JSDocs to new AlertInfo class ([4a18a5e](https://github.com/webern-unibas-ch/awg-app/commit/4a18a5e9767789f88ba00fa3c8911a62ecded339)) + +### Styles + +- **app:** justify block text ([5b5b59b](https://github.com/webern-unibas-ch/awg-app/commit/5b5b59b70d4eeb2e71d7b3c2f4009862aa49f8ee)) +- **app:** swap display web font ([d00be32](https://github.com/webern-unibas-ch/awg-app/commit/d00be32e6ca5af0213041ede6a7ff17109623ffd)) +- **app:** unify layout of main view components ([5e96699](https://github.com/webern-unibas-ch/awg-app/commit/5e9669978f80c051d42aa3c1c95e5bbcec4cc90a)) +- **edition:** fix style for intro components ([204ea18](https://github.com/webern-unibas-ch/awg-app/commit/204ea18761041f291c98318de59f72b17fbd3203)) +- **edition:** highlight blockHeaders in tka tables ([d61482b](https://github.com/webern-unibas-ch/awg-app/commit/d61482b61f4db2d761f5a1b77f69d2425cc98bfa)) +- **edition:** improve display of corrections ([40dfe94](https://github.com/webern-unibas-ch/awg-app/commit/40dfe94d3cdeb947f54f4f4d3beb9f216b4a1e1b)) +- **edition:** improve responsivity of cover images ([57f67c7](https://github.com/webern-unibas-ch/awg-app/commit/57f67c7ee97877d3d43dc2fabaaea138d56b95bf)) +- **edition:** justify preface text ([343c277](https://github.com/webern-unibas-ch/awg-app/commit/343c2779533ab4d3d46e43d9d6f61fabc75ffdc3)) +- **edition:** remove bg-colors from intro helper classes ([4343fb7](https://github.com/webern-unibas-ch/awg-app/commit/4343fb787bf7477ea9034abb5a9a76d857d6f1e4)) +- **home:** stretch links of home view cards ([ea0a657](https://github.com/webern-unibas-ch/awg-app/commit/ea0a6571966930b0678d706d22d9290b98823c32)) +- **page-not-found:** improve styling ([5559862](https://github.com/webern-unibas-ch/awg-app/commit/5559862c87edf163368ca15bc8abd11d806c9b45)) + +### Build System + +- **deps-dev:** bump @compodoc/compodoc from 1.1.25 to 1.1.26 ([c99aba1](https://github.com/webern-unibas-ch/awg-app/commit/c99aba19b2646d1959e46acb72e1fd43f4b72246)) +- **deps-dev:** bump angular-cli-ghpages from 2.0.1 to 2.0.3 ([c0c965b](https://github.com/webern-unibas-ch/awg-app/commit/c0c965b24bf7bd93296d142f18000953af5bb678)) +- **deps-dev:** bump commit-and-tag-version from 12.4.1 to 12.4.2 ([453d6f3](https://github.com/webern-unibas-ch/awg-app/commit/453d6f3164a331b5dd012a5f7685bba55357e258)) +- **deps-dev:** bump commit-and-tag-version from 12.4.2 to 12.4.3 ([a55f678](https://github.com/webern-unibas-ch/awg-app/commit/a55f678103afcb9400712bc76057d635bd7085ec)) +- **deps-dev:** bump commit-and-tag-version from 12.4.3 to 12.4.4 ([c0cc93f](https://github.com/webern-unibas-ch/awg-app/commit/c0cc93f3bcfbf3038f3eecc3b77925b0a3a50cd6)) +- **deps-dev:** bump commit-and-tag-version from 12.4.4 to 12.5.0 ([9f2abfc](https://github.com/webern-unibas-ch/awg-app/commit/9f2abfc05d93f1a7a2d0b8ddacdc860d5cec1c16)) +- **deps-dev:** bump eslint-plugin-import from 2.29.1 to 2.30.0 ([486f7e9](https://github.com/webern-unibas-ch/awg-app/commit/486f7e934e636b6ac3af29a5434ec443dc986368)) +- **deps-dev:** bump eslint-plugin-import from 2.30.0 to 2.31.0 ([0d0ef06](https://github.com/webern-unibas-ch/awg-app/commit/0d0ef0630f4cdef992c04b9d9d2a520159901344)) +- **deps-dev:** bump eslint-plugin-jsdoc from 50.2.2 to 50.2.3 ([e640d63](https://github.com/webern-unibas-ch/awg-app/commit/e640d63aed133a4795cb721b5e89ffd20f9b3f22)) +- **deps-dev:** bump eslint-plugin-jsdoc from 50.2.3 to 50.2.4 ([e0c28ea](https://github.com/webern-unibas-ch/awg-app/commit/e0c28ea3bfdc7e6d509bfe42456c5dfd9fa645e4)) +- **deps-dev:** bump eslint-plugin-jsdoc from 50.2.4 to 50.2.5 ([1ad6cbd](https://github.com/webern-unibas-ch/awg-app/commit/1ad6cbdbaff0c959fb0399208dceb18d6e96864b)) +- **deps-dev:** bump eslint-plugin-jsdoc from 50.2.5 to 50.3.0 ([0d70055](https://github.com/webern-unibas-ch/awg-app/commit/0d70055cc12529d56311f6dee29f012bc6a9fb12)) +- **deps-dev:** bump eslint-plugin-jsdoc from 50.3.0 to 50.3.1 ([110a2de](https://github.com/webern-unibas-ch/awg-app/commit/110a2de552c70c00de602ccff3eabf42677abe82)) +- **deps-dev:** bump eslint-plugin-jsdoc from 50.3.1 to 50.4.0 ([1de101f](https://github.com/webern-unibas-ch/awg-app/commit/1de101f3371c41cda476af2dcfab3f2047d4bd17)) +- **deps-dev:** bump eslint-plugin-jsdoc from 50.4.0 to 50.4.1 ([28243f6](https://github.com/webern-unibas-ch/awg-app/commit/28243f620f35fb6199520479156a5bc75bf67b0c)) +- **deps-dev:** bump eslint-plugin-jsdoc from 50.4.1 to 50.4.3 ([709259b](https://github.com/webern-unibas-ch/awg-app/commit/709259b15b85acfdfc02a241687823a3bd799031)) +- **deps-dev:** bump husky from 9.1.4 to 9.1.5 ([0c7b7a1](https://github.com/webern-unibas-ch/awg-app/commit/0c7b7a1dc5033f86f98ae137dde6ec93e824f29f)) +- **deps-dev:** bump husky from 9.1.5 to 9.1.6 ([375a190](https://github.com/webern-unibas-ch/awg-app/commit/375a19098d0f20e07dbe409b3191c02e697f53da)) +- **deps-dev:** bump jasmine-core from 5.2.0 to 5.3.0 ([994b48b](https://github.com/webern-unibas-ch/awg-app/commit/994b48b212e3484a44c916b321b694689e5044aa)) +- **deps-dev:** bump jasmine-core from 5.3.0 to 5.4.0 ([cb7cdd8](https://github.com/webern-unibas-ch/awg-app/commit/cb7cdd84ac24a3d3754467adc3f82408ea19643d)) +- **deps-dev:** bump lint-staged from 15.2.9 to 15.2.10 ([f60bc07](https://github.com/webern-unibas-ch/awg-app/commit/f60bc07f238009056fa16826b67db289ef76c0d8)) +- **deps-dev:** bump the angular-cli-devkit group with 2 updates ([60915df](https://github.com/webern-unibas-ch/awg-app/commit/60915dfdcf7f5f17746fd9cdb59cf18531285214)) +- **deps-dev:** bump the angular-cli-devkit group with 2 updates ([ba4ac9f](https://github.com/webern-unibas-ch/awg-app/commit/ba4ac9f809906c131efe58e71ef781a1bbbe48ed)) +- **deps-dev:** bump the angular-cli-devkit group with 2 updates ([5622c9c](https://github.com/webern-unibas-ch/awg-app/commit/5622c9cd5eebe1f3083a0ddbc75cb63e019bd240)) +- **deps-dev:** bump the angular-cli-devkit group with 2 updates ([aa7dc82](https://github.com/webern-unibas-ch/awg-app/commit/aa7dc82cd82aef0fcbd0268fb61c783598c18e1e)) +- **deps-dev:** bump the angular-cli-devkit group with 2 updates ([abbdcb1](https://github.com/webern-unibas-ch/awg-app/commit/abbdcb1af23817cf28e732e1841d7f34b7f222ef)) +- **deps-dev:** bump the angular-cli-devkit group with 2 updates ([b883d76](https://github.com/webern-unibas-ch/awg-app/commit/b883d76739f865e3b23107a26fee9dde688054df)) +- **deps-dev:** bump the angular-cli-devkit group with 2 updates ([f7e2c33](https://github.com/webern-unibas-ch/awg-app/commit/f7e2c3361ff9a7106b84aa3dace2f78e7bfca4cd)) +- **deps-dev:** bump the angular-cli-devkit group with 2 updates ([9b378ed](https://github.com/webern-unibas-ch/awg-app/commit/9b378edf6f922cf9673411919be07c86b0de725e)) +- **deps-dev:** bump the angular-cli-devkit group with 2 updates ([f91b3b6](https://github.com/webern-unibas-ch/awg-app/commit/f91b3b6b28c3ad8fde935125ce2af9404bb1b0e8)) +- **deps-dev:** bump the angular-cli-devkit group with 2 updates ([3670f3f](https://github.com/webern-unibas-ch/awg-app/commit/3670f3f9139f07bcf2f8d3c11c77e48b62db6ae3)) +- **deps-dev:** bump the angular-eslint group with 5 updates ([75f9e80](https://github.com/webern-unibas-ch/awg-app/commit/75f9e80be6df5165da9057ce60c986eb09664e53)) +- **deps-dev:** bump the angular-eslint group with 5 updates ([82910f1](https://github.com/webern-unibas-ch/awg-app/commit/82910f19bf0412db4f3fced80e781c29913abfd3)) +- **deps-dev:** bump the commitlint group with 2 updates ([1720367](https://github.com/webern-unibas-ch/awg-app/commit/1720367ee6fc4b153efaeaa7639381eb98c2f893)) +- **deps-dev:** bump the commitlint group with 2 updates ([8869fbb](https://github.com/webern-unibas-ch/awg-app/commit/8869fbb30244e9dda883610e0d1eda7baf478229)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([39b042e](https://github.com/webern-unibas-ch/awg-app/commit/39b042ed329fc96747a76eb8f9be041eeefc5f66)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([3e54644](https://github.com/webern-unibas-ch/awg-app/commit/3e5464459c5346d43bad497936df6c70d2002db3)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([2865d33](https://github.com/webern-unibas-ch/awg-app/commit/2865d33e87e886ceef45c55c07b18decd7324871)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([7fc0dfd](https://github.com/webern-unibas-ch/awg-app/commit/7fc0dfda02764828fd31f76913fe68a806a26cbb)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([c1e7244](https://github.com/webern-unibas-ch/awg-app/commit/c1e7244217aa7689948e1c538a31506a502d4bcd)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([7bfe627](https://github.com/webern-unibas-ch/awg-app/commit/7bfe627efdb04fd9d3dd96adf2d353b87207d7fd)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([3c11cb8](https://github.com/webern-unibas-ch/awg-app/commit/3c11cb81bbc051763aa9a6f72bbd81428729e5d8)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([23fa261](https://github.com/webern-unibas-ch/awg-app/commit/23fa2617b1af8a5d275c11d436ad4c0a0185e379)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([5fb8d75](https://github.com/webern-unibas-ch/awg-app/commit/5fb8d75ed31706e8a4f4e1ddd7da8c9af6f77660)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([d5eecba](https://github.com/webern-unibas-ch/awg-app/commit/d5eecba3ffe5b5128a64c32d2b5c90d58e74402f)) +- **deps-dev:** bump the typescript-eslint group with 2 updates ([7d5141b](https://github.com/webern-unibas-ch/awg-app/commit/7d5141b8c37ef8837ace5fd47cd7940b7df7caf4)) +- **deps:** add fontawesome regular svg icons ([bda78bb](https://github.com/webern-unibas-ch/awg-app/commit/bda78bb4ec8bbc783578d19922bd33ffb9713fcd)) +- **deps:** bump @ng-bootstrap/ng-bootstrap from 17.0.0 to 17.0.1 ([3b81441](https://github.com/webern-unibas-ch/awg-app/commit/3b81441558865920951c84d5c33d72d445a435a2)) +- **deps:** bump actions/checkout from 4.1.7 to 4.2.0 ([30866b3](https://github.com/webern-unibas-ch/awg-app/commit/30866b3f020f52e9ad41645a54de9f86874ac481)) +- **deps:** bump actions/checkout from 4.2.0 to 4.2.1 ([9e27174](https://github.com/webern-unibas-ch/awg-app/commit/9e27174fa26c9196fbd79796cf45f9059b0c9564)) +- **deps:** bump actions/checkout from 4.2.1 to 4.2.2 ([90a0530](https://github.com/webern-unibas-ch/awg-app/commit/90a053082ff300aa4706d676f0eac8db1634e51c)) +- **deps:** bump actions/dependency-review-action from 4.3.4 to 4.3.5 ([861f203](https://github.com/webern-unibas-ch/awg-app/commit/861f203f04ae6cbed959314429228653510a1a09)) +- **deps:** bump actions/setup-node from 4.0.3 to 4.0.4 ([1651f83](https://github.com/webern-unibas-ch/awg-app/commit/1651f8370b0f5affb3ff7198fa7acf9a70064153)) +- **deps:** bump actions/setup-node from 4.0.4 to 4.1.0 ([182332a](https://github.com/webern-unibas-ch/awg-app/commit/182332a784811cbdb48a70dc9302d1d1765289a4)) +- **deps:** bump actions/upload-artifact from 4.3.6 to 4.4.0 ([13eb56d](https://github.com/webern-unibas-ch/awg-app/commit/13eb56d0ee8f47c6a3fdc37d6540f21bef46eb65)) +- **deps:** bump actions/upload-artifact from 4.4.0 to 4.4.2 ([337c221](https://github.com/webern-unibas-ch/awg-app/commit/337c221b93d4a30262fa9393e31efc4801b805c4)) +- **deps:** bump actions/upload-artifact from 4.4.2 to 4.4.3 ([42102f3](https://github.com/webern-unibas-ch/awg-app/commit/42102f36b32ec2f6fddf6b581cc06be45b1ef850)) +- **deps:** bump body-parser from 1.20.2 to 1.20.3 ([1d26dcd](https://github.com/webern-unibas-ch/awg-app/commit/1d26dcd7ebdefd39c76a7393a647e0ff5a24190f)) +- **deps:** bump codecov/codecov-action from 4.5.0 to 4.6.0 ([c0651ae](https://github.com/webern-unibas-ch/awg-app/commit/c0651ae5207859a400980e248d2323ee9072d1fe)) +- **deps:** bump express from 4.19.2 to 4.20.0 ([31276cd](https://github.com/webern-unibas-ch/awg-app/commit/31276cd906171835364eaf8faf3ef739cc19d25b)) +- **deps:** bump github/codeql-action from 3.26.10 to 3.26.11 ([c0900fd](https://github.com/webern-unibas-ch/awg-app/commit/c0900fd2c08f9d4599b8db5077ec0bd7684a477f)) +- **deps:** bump github/codeql-action from 3.26.11 to 3.26.12 ([097f982](https://github.com/webern-unibas-ch/awg-app/commit/097f9827ec3ffef5514a54a1864bcf344165720c)) +- **deps:** bump github/codeql-action from 3.26.12 to 3.26.13 ([c51506c](https://github.com/webern-unibas-ch/awg-app/commit/c51506c32a00a7db87b0c62d2cb30a5e4bf22ee6)) +- **deps:** bump github/codeql-action from 3.26.13 to 3.27.0 ([40af3b3](https://github.com/webern-unibas-ch/awg-app/commit/40af3b32b0969f898c93062eee5fe1df6fda74dc)) +- **deps:** bump github/codeql-action from 3.26.2 to 3.26.3 ([331426e](https://github.com/webern-unibas-ch/awg-app/commit/331426e8db01b8b084bf11b6225c6dbd8bdbc47a)) +- **deps:** bump github/codeql-action from 3.26.3 to 3.26.4 ([7c744e6](https://github.com/webern-unibas-ch/awg-app/commit/7c744e660d1464947788ca5f990b073f7a98b277)) +- **deps:** bump github/codeql-action from 3.26.4 to 3.26.5 ([00ea16d](https://github.com/webern-unibas-ch/awg-app/commit/00ea16d63a08a2b2950b5200858a58897741484a)) +- **deps:** bump github/codeql-action from 3.26.5 to 3.26.6 ([6e92f38](https://github.com/webern-unibas-ch/awg-app/commit/6e92f388328e3a1018eca8b058b1e2e0fea49b84)) +- **deps:** bump github/codeql-action from 3.26.6 to 3.26.7 ([6d60b1c](https://github.com/webern-unibas-ch/awg-app/commit/6d60b1c7853ade162e0ced27c3ceefc7d2d8ea9f)) +- **deps:** bump github/codeql-action from 3.26.7 to 3.26.8 ([93f13d0](https://github.com/webern-unibas-ch/awg-app/commit/93f13d0594ffe5574f268fa3cf5450f5061d19c7)) +- **deps:** bump github/codeql-action from 3.26.8 to 3.26.9 ([474070a](https://github.com/webern-unibas-ch/awg-app/commit/474070aa5908fc8fbc54b860df5bf6173c5d1ad2)) +- **deps:** bump github/codeql-action from 3.26.9 to 3.26.10 ([2615d0b](https://github.com/webern-unibas-ch/awg-app/commit/2615d0b12ce6cdc8d633c2c54e4160c3bcbfe527)) +- **deps:** bump http-proxy-middleware from 2.0.6 to 2.0.7 ([d3b9048](https://github.com/webern-unibas-ch/awg-app/commit/d3b90484c681843166728df051e0228fb1fe15db)) +- **deps:** bump micromatch from 4.0.7 to 4.0.8 ([edfeebe](https://github.com/webern-unibas-ch/awg-app/commit/edfeebe9f5cd92b9e9b6722320df52374add9229)) +- **deps:** bump n3 from 1.20.4 to 1.21.0 ([e91ca31](https://github.com/webern-unibas-ch/awg-app/commit/e91ca311105bc11ca148da12ff351f94fd1541ce)) +- **deps:** bump n3 from 1.21.0 to 1.21.1 ([105a74c](https://github.com/webern-unibas-ch/awg-app/commit/105a74c5b4840caa2c8bcf67569d5cdecbd71427)) +- **deps:** bump n3 from 1.21.1 to 1.22.0 ([7749846](https://github.com/webern-unibas-ch/awg-app/commit/7749846c6937389c4d7f3f500df48c62f168998f)) +- **deps:** bump n3 from 1.22.0 to 1.22.1 ([45445b0](https://github.com/webern-unibas-ch/awg-app/commit/45445b0dfdc7df06f11417717e2f32ae50709972)) +- **deps:** bump n3 from 1.22.1 to 1.22.3 ([9551bbd](https://github.com/webern-unibas-ch/awg-app/commit/9551bbd438b49c6a44f6a8ac118281f3047310f3)) +- **deps:** bump rdfstore from v0.9.18-alpha.16 to v0.9.18-alpha.17 ([500b47e](https://github.com/webern-unibas-ch/awg-app/commit/500b47eb4184c6c7607cdbe0e4cae736b833ad41)) +- **deps:** bump rollup from 4.22.0 to 4.22.4 ([6d65df8](https://github.com/webern-unibas-ch/awg-app/commit/6d65df81b5ca910a18fadbbe8c333fedc24a06a6)) +- **deps:** bump SonarSource/sonarcloud-github-action ([6e2fa81](https://github.com/webern-unibas-ch/awg-app/commit/6e2fa811039a69d1e90a41b290e12ee653d66040)) +- **deps:** bump SonarSource/sonarcloud-github-action ([883e23f](https://github.com/webern-unibas-ch/awg-app/commit/883e23fc8a5e41d0d38dd8743e49cce4fee2b271)) +- **deps:** bump step-security/harden-runner from 2.9.1 to 2.10.1 ([dfba1df](https://github.com/webern-unibas-ch/awg-app/commit/dfba1df6721ee4b3cce89181354ca1a4d2f2bb20)) +- **deps:** bump the angular group with 11 updates ([322139f](https://github.com/webern-unibas-ch/awg-app/commit/322139f9607d5f52e6de8d23cf36dfb18f9e1f67)) +- **deps:** bump the angular group with 11 updates ([f6447e3](https://github.com/webern-unibas-ch/awg-app/commit/f6447e3d2a325dec1079518981816d89907bede1)) +- **deps:** bump the angular group with 11 updates ([1d18b4d](https://github.com/webern-unibas-ch/awg-app/commit/1d18b4db5228dc51edd6863c0aed8e732505097f)) +- **deps:** bump the angular group with 11 updates ([005107f](https://github.com/webern-unibas-ch/awg-app/commit/005107f5a012bbf417dbd85fe3828a9406cadfe3)) +- **deps:** bump the angular group with 11 updates ([75ce249](https://github.com/webern-unibas-ch/awg-app/commit/75ce2493dedbbd78ad3a30033a82d43d2eae18e0)) +- **deps:** bump the angular group with 11 updates ([77a68bd](https://github.com/webern-unibas-ch/awg-app/commit/77a68bd326a06ece38151a8161293897e5f3a782)) +- **deps:** bump the angular group with 11 updates ([d7489a3](https://github.com/webern-unibas-ch/awg-app/commit/d7489a3708c6aa5be85337089e623e3d874fb70a)) +- **deps:** bump the angular group with 11 updates ([0602b82](https://github.com/webern-unibas-ch/awg-app/commit/0602b82c16125c3fc96cec61ec4b52b3a7719a3b)) +- **deps:** bump the angular group with 11 updates ([b3d7069](https://github.com/webern-unibas-ch/awg-app/commit/b3d7069fd5039ce48d7b77096fb2bae1e8c20e51)) +- **deps:** bump tslib from 2.6.3 to 2.7.0 ([504ca75](https://github.com/webern-unibas-ch/awg-app/commit/504ca75a95aa037f868c4c43b5726068020d8ad9)) +- **shared:** activate NgbPopoverModule ([66158cf](https://github.com/webern-unibas-ch/awg-app/commit/66158cf22d0ac249f579de444ccd588af02fdb7f)) + ## [0.14.0](https://github.com/webern-unibas-ch/awg-app/compare/v0.12.3...v0.14.0) (2024-08-19) ### Note diff --git a/README.md b/README.md index 1d786f0d56..7fc2652345 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,11 @@ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.1%20adopted-ff69b4.svg)](CODE_OF_CONDUCT.md) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4717678.svg)](https://doi.org/10.5281/zenodo.4717678) -A prototype web application for the online edition of the [Anton Webern Gesamtausgabe](https://www.anton-webern.ch) (AWG), located at the Department of Musicology of the University of Basel. It is written in [Angular](https://angular.io/) and runs on [edition.anton-webern.ch](https://edition.anton-webern.ch). +A web application for the online edition of the [Anton Webern Gesamtausgabe](https://www.anton-webern.ch) (AWG), located at the Department of Musicology of the University of Basel. It is written in [Angular](https://angular.io/) and runs on [edition.anton-webern.ch](https://edition.anton-webern.ch). **Project Status**: This project is actively maintained. -app +Screenshot 2024-10-26 124804 ## Table of Contents diff --git a/package.json b/package.json index 0fd8c57493..f2207cbec5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "awg-app", - "version": "0.14.0", + "version": "1.0.0", "license": "MIT", "author": { "name": "Stefan Münnich", @@ -28,7 +28,7 @@ "email": "101800133+AMWilke@users.noreply.github.com" } ], - "description": "Prototype Web Application for the Online Edition of the Anton Webern Gesamtausgabe (Musicological Seminar of the University of Basel)", + "description": "A web application for the Online Edition of the Anton Webern Gesamtausgabe (Musicological Seminar of the University of Basel)", "keywords": [ "angular", "anton-webern", @@ -84,21 +84,21 @@ "deploy:ci": "ng deploy --no-build --message=\"Release $npm_package_name (v$npm_package_version) on gh-pages\"" }, "dependencies": { - "@angular/animations": "^18.2.0", - "@angular/common": "^18.2.0", - "@angular/compiler": "^18.2.0", - "@angular/core": "^18.2.0", - "@angular/forms": "^18.2.0", - "@angular/localize": "^18.2.0", - "@angular/platform-browser": "^18.2.0", - "@angular/platform-browser-dynamic": "^18.2.0", - "@angular/platform-server": "^18.2.0", - "@angular/router": "^18.2.0", + "@angular/animations": "^18.2.9", + "@angular/common": "^18.2.9", + "@angular/compiler": "^18.2.9", + "@angular/core": "^18.2.9", + "@angular/forms": "^18.2.9", + "@angular/localize": "^18.2.9", + "@angular/platform-browser": "^18.2.9", + "@angular/platform-browser-dynamic": "^18.2.9", + "@angular/platform-server": "^18.2.9", + "@angular/router": "^18.2.9", "@codemirror/legacy-modes": "^6.4.1", "@fortawesome/angular-fontawesome": "^0.15.0", "@fortawesome/free-solid-svg-icons": "^6.6.0", "@kolkov/ngx-gallery": "2.0.1", - "@ng-bootstrap/ng-bootstrap": "^17.0.0", + "@ng-bootstrap/ng-bootstrap": "^17.0.1", "@popperjs/core": "^2.11.8", "bootstrap": "^5.3.3", "codemirror": "^6.0.1", @@ -109,50 +109,50 @@ "d3-zoom": "^3.0.0", "font-awesome": "^4.7.0", "json2typescript": "^1.5.1", - "n3": "^1.20.4", + "n3": "^1.22.3", "ngx-json-viewer": "^3.2.1", - "rdfstore": "musicenfanthen/rdfstore-js#v0.9.18-alpha.16", + "rdfstore": "musicenfanthen/rdfstore-js#v0.9.18-alpha.17", "rxjs": "~7.8.1", "stream": "^0.0.3", - "tslib": "^2.6.2", + "tslib": "^2.7.0", "zone.js": "~0.14.10" }, "devDependencies": { - "@angular-devkit/build-angular": "^18.2.0", - "@angular-eslint/builder": "^18.3.0", - "@angular-eslint/eslint-plugin": "^18.3.0", - "@angular-eslint/eslint-plugin-template": "^18.3.0", - "@angular-eslint/schematics": "^18.3.0", - "@angular-eslint/template-parser": "^18.3.0", - "@angular/cli": "^18.2.0", - "@angular/compiler-cli": "^18.2.0", - "@commitlint/cli": "^19.4.0", - "@commitlint/config-angular": "^19.3.0", - "@compodoc/compodoc": "^1.1.25", + "@angular-devkit/build-angular": "^18.2.10", + "@angular-eslint/builder": "^18.4.0", + "@angular-eslint/eslint-plugin": "^18.4.0", + "@angular-eslint/eslint-plugin-template": "^18.4.0", + "@angular-eslint/schematics": "^18.4.0", + "@angular-eslint/template-parser": "^18.4.0", + "@angular/cli": "^18.2.10", + "@angular/compiler-cli": "^18.2.9", + "@commitlint/cli": "^19.5.0", + "@commitlint/config-angular": "^19.5.0", + "@compodoc/compodoc": "^1.1.26", "@types/d3": "^7.4.3", "@types/jasmine": "~5.1.4", "@types/node": "^20.14.14", - "@typescript-eslint/eslint-plugin": "^8.1.0", - "@typescript-eslint/parser": "^8.1.0", - "angular-cli-ghpages": "^2.0.1", - "commit-and-tag-version": "^12.4.1", + "@typescript-eslint/eslint-plugin": "^8.11.0", + "@typescript-eslint/parser": "^8.11.0", + "angular-cli-ghpages": "^2.0.3", + "commit-and-tag-version": "^12.5.0", "conventional-recommended-bump": "^10.0.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-angular": "^4.1.0", "eslint-plugin-deprecation": "^3.0.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^50.2.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsdoc": "^50.4.3", "eslint-plugin-prettier": "^5.2.1", "gzipper": "^7.2.0", - "husky": "^9.1.4", - "jasmine-core": "~5.2.0", + "husky": "^9.1.6", + "jasmine-core": "~5.4.0", "karma": "~6.4.4", "karma-chrome-launcher": "~3.2.0", "karma-coverage": "^2.2.1", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "^2.1.0", - "lint-staged": "^15.2.9", + "lint-staged": "^15.2.10", "prettier": "^3.3.3", "source-map-explorer": "^2.5.3", "typescript": "~5.5.4", diff --git a/src/app/app.component.html b/src/app/app.component.html index 2a4d4ebf30..de38fbba38 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -3,8 +3,8 @@ - - + + diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index fa9afc7879..1290ce1fa4 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,9 +1,9 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { Location } from '@angular/common'; -import { Component, DebugElement } from '@angular/core'; +import { Component, DebugElement, Input } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { Title } from '@angular/platform-browser'; -import { Router, RouterModule, Routes } from '@angular/router'; +import { ActivatedRouteSnapshot, Router, RouterModule, Routes } from '@angular/router'; import Spy = jasmine.Spy; @@ -19,7 +19,9 @@ import { AppComponent } from './app.component'; class NavbarStubComponent {} @Component({ selector: 'awg-view-container', template: '' }) -class ViewContainerStubComponent {} +class ViewContainerStubComponent { + @Input() activateSideOutlet: boolean; +} @Component({ selector: 'awg-footer', template: '' }) class FooterStubComponent {} @@ -30,9 +32,17 @@ export class RoutedTestMockComponent {} @Component({ selector: 'awg-test2', template: 'test2' }) export class RoutedTest2MockComponent {} +@Component({ selector: 'awg-side', template: 'test' }) +export class RoutedSideMockComponent {} + export const MOCK_ROUTES: Routes = [ { path: '', redirectTo: 'test1', pathMatch: 'full' }, { path: 'test1', component: RoutedTestMockComponent, data: { title: 'Custom Page Title 1' } }, + { + path: 'test2', + outlet: 'side', + component: RoutedSideMockComponent, + }, { path: 'test2', component: RoutedTest2MockComponent, @@ -59,6 +69,8 @@ describe('AppComponent (DONE)', () => { let trackpageViewSpy: Spy; let initializeEditionSpy: Spy; + let expectedActivateSideOutlet: boolean; + beforeEach(waitForAsync(() => { // Create a mocked AnalyticsService with an `initializeAnalytics` and `trackPageView` spy mockAnalyticsService = { @@ -86,6 +98,7 @@ describe('AppComponent (DONE)', () => { ViewContainerStubComponent, RoutedTestMockComponent, RoutedTest2MockComponent, + RoutedSideMockComponent, ], providers: [ { provide: AnalyticsService, useValue: mockAnalyticsService }, @@ -114,6 +127,9 @@ describe('AppComponent (DONE)', () => { router = TestBed.inject(Router); titleService = TestBed.inject(Title); + // Test data + expectedActivateSideOutlet = true; + // Workaround for ngZone issue; // Cf. https://github.com/angular/angular/issues/25837 // Cf. https://github.com/ngneat/spectator/pull/334/files @@ -149,40 +165,75 @@ describe('AppComponent (DONE)', () => { expectToBe(location.path(), ''); })); - it("... should redirect to /test1 from '' redirect", waitForAsync(() => { - fixture.ngZone.run(() => { - router.navigate(['']).then(() => { - expectToBe(location.path(), '/test1'); - }); + it("... should redirect to /test1 from '' redirect", async () => { + const success = await fixture.ngZone.run(() => router.navigate([''])); + expect(success).toBeTruthy(); + expectToBe(location.path(), '/test1'); + }); + + it("... should navigate to 'test1' from /test1", async () => { + const success = await fixture.ngZone.run(() => router.navigate(['/test1'])); + expect(success).toBeTruthy(); + expectToBe(location.path(), '/test1'); + }); + + it("... should navigate to 'test2' from /test2", async () => { + const success = await fixture.ngZone.run(() => router.navigate(['/test2'])); + expect(success).toBeTruthy(); + expectToBe(location.path(), '/test2'); + }); + + it("... should navigate to 'test2' with outlet from /test2", async () => { + const success = await fixture.ngZone.run(() => + router.navigate([{ outlets: { primary: 'test2', side: 'test2' } }]) + ); + expect(success).toBeTruthy(); + expectToBe(location.path(), '/test2(side:test2)'); + }); + + it("... should navigate to '/test2/test3' from /test2/test3", async () => { + const success = await fixture.ngZone.run(() => router.navigate(['/test2/test3'])); + expect(success).toBeTruthy(); + expectToBe(location.path(), '/test2/test3'); + }); + + it("... should navigate to '/test2/test3' with outlet from /test2/test3", async () => { + const success = await fixture.ngZone.run(() => + router.navigate([{ outlets: { primary: 'test2/test3', side: 'test2' } }]) + ); + expect(success).toBeTruthy(); + expectToBe(location.path(), '/test2/test3(side:test2)'); + }); + }); + + describe('BEFORE initial data binding', () => { + it('... should have `activateSideOutlet=false`', () => { + expectToBe(component.activateSideOutlet, false); + }); + + describe('VIEW', () => { + it('... should contain one header component (stubbed)', () => { + getAndExpectDebugElementByDirective(compDe, NavbarStubComponent, 1, 1); }); - })); - it("... should navigate to 'test1' from /test1", waitForAsync(() => { - fixture.ngZone.run(() => { - router.navigate(['/test1']).then(() => { - expectToBe(location.path(), '/test1'); - }); + it('... should contain one view container component (stubbed)', () => { + getAndExpectDebugElementByDirective(compDe, ViewContainerStubComponent, 1, 1); }); - })); - it("... should navigate to 'test2' from /test2", waitForAsync(() => { - fixture.ngZone.run(() => { - router.navigate(['/test2']).then(() => { - expectToBe(location.path(), '/test2'); - }); + it('... should not pass down `showSideOutlet` to view container component yet', () => { + const viewContainerDes = getAndExpectDebugElementByDirective(compDe, ViewContainerStubComponent, 1, 1); + const viewContainerCmp = viewContainerDes[0].injector.get( + ViewContainerStubComponent + ) as ViewContainerStubComponent; + + expect(viewContainerCmp.activateSideOutlet).toBeUndefined(); }); - })); - it("... should navigate to '/test2/test3' from /test2/test3", waitForAsync(() => { - fixture.ngZone.run(() => { - router.navigate(['/test2/test3']).then(() => { - expectToBe(location.path(), '/test2/test3'); - }); + it('... should contain one footer component (stubbed)', () => { + getAndExpectDebugElementByDirective(compDe, FooterStubComponent, 1, 1); }); - })); - }); + }); - describe('BEFORE initial data binding', () => { describe('Analytics', () => { it('... should call AnalyticsService to initialize Analytics', waitForAsync(() => { expectSpyCall(initialzeAnalyticsSpy, 1); @@ -223,20 +274,6 @@ describe('AppComponent (DONE)', () => { }); }); - describe('VIEW', () => { - it('... should contain one header component (stubbed)', () => { - getAndExpectDebugElementByDirective(compDe, NavbarStubComponent, 1, 1); - }); - - it('... should contain one view container component (stubbed)', () => { - getAndExpectDebugElementByDirective(compDe, ViewContainerStubComponent, 1, 1); - }); - - it('... should contain one footer component (stubbed)', () => { - getAndExpectDebugElementByDirective(compDe, FooterStubComponent, 1, 1); - }); - }); - describe('Title', () => { it('... should have called getTitle', () => { expectSpyCall(getTitleSpy, 1); @@ -266,5 +303,117 @@ describe('AppComponent (DONE)', () => { }); })); }); + + describe('SideOutlet', () => { + it('... should set `activateSideOutlet` to false if not given in route data', async () => { + const success = await fixture.ngZone.run(() => router.navigate(['/test1'])); + expect(success).toBeTruthy(); + expectToBe(component.activateSideOutlet, false); + }); + + it('... should set `activateSideOutlet` to true if given in route data', async () => { + const success = await fixture.ngZone.run(() => + router.navigate([{ outlets: { primary: 'test2', side: 'test2' } }]) + ); + expect(success).toBeTruthy(); + expectToBe(component.activateSideOutlet, true); + }); + + it('... should set `activateSideOutlet` to true if given in parent route data', async () => { + const success = await fixture.ngZone.run(() => + router.navigate([{ outlets: { primary: 'test2/test3', side: 'test2' } }]) + ); + expect(success).toBeTruthy(); + expectToBe(component.activateSideOutlet, true); + }); + + it('... should set `activateSideOutlet` to false if not given in parent route data', async () => { + const success = await fixture.ngZone.run(() => router.navigate(['/test2/test3'])); + expect(success).toBeTruthy(); + expectToBe(component.activateSideOutlet, false); + }); + + it('... should set `activateSideOutlet` back to false if navigating back to route without side outlet', async () => { + const success = await fixture.ngZone.run(() => + router.navigate([{ outlets: { primary: 'test2/test3', side: 'test2' } }]) + ); + expect(success).toBeTruthy(); + expectToBe(component.activateSideOutlet, true); + + const success2 = await fixture.ngZone.run(() => + router.navigate([{ outlets: { primary: 'test1', side: null } }]) + ); + expect(success2).toBeTruthy(); + expectToBe(component.activateSideOutlet, false); + }); + }); + }); + + describe('AFTER initial data binding', () => { + beforeEach(() => { + // Trigger initial data binding + fixture.detectChanges(); + }); + + describe('VIEW', () => { + it('... should pass down `activateSideOutlet` to view container component', async () => { + const success = await fixture.ngZone.run(() => + router.navigate([{ outlets: { primary: 'test2/test3', side: 'test2' } }]) + ); + expect(success).toBeTruthy(); + + fixture.detectChanges(); + + const viewContainerDes = getAndExpectDebugElementByDirective(compDe, ViewContainerStubComponent, 1, 1); + const viewContainerCmp = viewContainerDes[0].injector.get( + ViewContainerStubComponent + ) as ViewContainerStubComponent; + + expectToBe(viewContainerCmp.activateSideOutlet, expectedActivateSideOutlet); + }); + }); + + describe('#hasSideOutlet()', () => { + it('... should have a method `hasSideOutlet`', () => { + expect(component.hasSideOutlet).toBeDefined(); + }); + + it('... should return true if route has side outlet', () => { + const mockRoute: ActivatedRouteSnapshot = { + outlet: 'side', + children: [], + } as any; + + expectToBe(component.hasSideOutlet(mockRoute), true); + }); + + it('... should return true if any child route has side outlet', () => { + const mockRoute: ActivatedRouteSnapshot = { + outlet: 'primary', + children: [ + { + outlet: 'side', + children: [], + } as any, + ], + } as any; + + expectToBe(component.hasSideOutlet(mockRoute), true); + }); + + it('... should return false if route has no side outlet', () => { + const mockRoute: ActivatedRouteSnapshot = { + outlet: 'primary', + children: [ + { + outlet: 'primary', + children: [], + } as any, + ], + } as any; + + expectToBe(component.hasSideOutlet(mockRoute), false); + }); + }); }); }); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 9d56d5b9cc..a616706829 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; import { Title } from '@angular/platform-browser'; -import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { ActivatedRoute, ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router'; import { filter, map } from 'rxjs/operators'; @@ -19,6 +19,13 @@ import { AnalyticsService, EditionInitService } from '@awg-core/services'; styleUrls: ['./app.component.scss'], }) export class AppComponent { + /** + * Public variable: activateSideOutlet. + * + * It keeps track of the side outlet. + */ + activateSideOutlet = false; + /** * Constructor of the AppComponent. * @@ -32,10 +39,10 @@ export class AppComponent { */ constructor( private readonly activatedRoute: ActivatedRoute, + private readonly router: Router, private analyticsService: AnalyticsService, private editionInitService: EditionInitService, ngbConfig: NgbConfig, - private readonly router: Router, private titleService: Title ) { // Disable Bootstrap animation @@ -74,7 +81,32 @@ export class AppComponent { next: (pageTitle: string) => { // Set page title this.titleService.setTitle(pageTitle); + + // Activate side outlet + const currentRoute = this.router.routerState.snapshot.root; + this.activateSideOutlet = this.hasSideOutlet(currentRoute); }, }); } + + /** + * Public method: hasSideOutlet. + * + * It checks if a route has a side outlet. + * + * @param {ActivatedRouteSnapshot} route The route to check. + * + * @returns {boolean} The result of the check. + */ + hasSideOutlet(route: ActivatedRouteSnapshot): boolean { + if (route.outlet === 'side') { + return true; + } + for (const child of route.children) { + if (this.hasSideOutlet(child)) { + return true; + } + } + return false; + } } diff --git a/src/app/app.config.ts b/src/app/app.config.ts index df90d9fa49..453be7d77f 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -188,4 +188,14 @@ export class AppConfig { return osmApi + '?' + bbox + '&' + layer + '&' + marker; } + + /** + * Getter for the URL of the Zenodo record + * ({@link https://doi.org/10.5281/zenodo.4717678}). + * + * @returns {string} + */ + public static get AWG_APP_ZENODO_URL(): string { + return 'https://doi.org/10.5281/zenodo.4717678'; + } } diff --git a/src/app/app.globals.ts b/src/app/app.globals.ts index ec89388bb3..532d545752 100644 --- a/src/app/app.globals.ts +++ b/src/app/app.globals.ts @@ -1,15 +1,15 @@ // THIS IS AN AUTO-GENERATED FILE. DO NOT CHANGE IT MANUALLY! -// Generated last time on Mon, Aug 19, 2024 7:32:05 PM +// Generated last time on Sat, Oct 26, 2024 2:16:23 PM /** * The latest version of the AWG App */ -export const appVersion = '0.14.0'; +export const appVersion = '1.0.0'; /** * The release date of the latest version of the AWG App */ -export const appVersionReleaseDate = '19. August 2024'; +export const appVersionReleaseDate = '26. Oktober 2024'; /** * The URL of the AWG App diff --git a/src/app/app.module.ts b/src/app/app.module.ts index c266b3fc34..6aa2fe5688 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -10,6 +10,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { CoreModule } from '@awg-core/core.module'; import { SharedModule } from '@awg-shared/shared.module'; import { SideInfoModule } from '@awg-side-info/side-info.module'; +import { HomeViewModule } from '@awg-views/home-view/home-view.module'; import { AppComponent } from './app.component'; /* Routing Module */ @@ -25,7 +26,15 @@ registerLocaleData(localeDeDE); * as well as the {@link CoreModule}, {@link SharedModule} and {@link SideInfoModule}. */ @NgModule({ - imports: [BrowserModule, BrowserAnimationsModule, CoreModule, SharedModule, SideInfoModule, AppRoutingModule], + imports: [ + BrowserModule, + BrowserAnimationsModule, + CoreModule, + HomeViewModule, + SharedModule, + SideInfoModule, + AppRoutingModule, + ], declarations: [AppComponent, routedAppComponents], providers: [ { provide: LOCALE_ID, useValue: 'de-DE' }, // Change global LOCALE-ID diff --git a/src/app/core/core-data/index.ts b/src/app/core/core-data/index.ts index a2cb1ac44f..e4a66eb815 100644 --- a/src/app/core/core-data/index.ts +++ b/src/app/core/core-data/index.ts @@ -7,7 +7,7 @@ * */ -import { LOGOSDATA } from './logos.data'; -import { METADATA } from './meta.data'; +import { LOGOS_DATA } from './logos.data'; +import { META_DATA } from './meta.data'; -export { METADATA, LOGOSDATA }; +export { LOGOS_DATA, META_DATA }; diff --git a/src/app/core/core-data/logos.data.ts b/src/app/core/core-data/logos.data.ts index ce4497b95d..fe462812cc 100644 --- a/src/app/core/core-data/logos.data.ts +++ b/src/app/core/core-data/logos.data.ts @@ -7,7 +7,7 @@ import { Logos } from '@awg-core/core-models'; * * Available logos: `unibas`, `snf`, `angular`, `bootstrap`. */ -export const LOGOSDATA: Logos = { +export const LOGOS_DATA: Logos = { angular: { id: 'angularlogo', src: 'assets/img/logos/angular.svg', diff --git a/src/app/core/core-data/meta.data.ts b/src/app/core/core-data/meta.data.ts index 06dac61509..f5d944ff21 100644 --- a/src/app/core/core-data/meta.data.ts +++ b/src/app/core/core-data/meta.data.ts @@ -6,7 +6,7 @@ import { Meta, MetaContact, MetaPage, MetaStructure } from '@awg-core/core-model * * It provides metadata used for the page framework. */ -const METAPAGE: MetaPage = { +const META_PAGE: MetaPage = { yearStart: 2015, yearCurrent: new Date().getFullYear(), awgAppUrl: AppConfig.AWG_APP_URL, @@ -20,6 +20,7 @@ const METAPAGE: MetaPage = { salsahUrl: AppConfig.SALSAH_URL, version: AppConfig.AWG_APP_VERSION, versionReleaseDate: AppConfig.AWG_APP_VERSION_RELEASE_DATE, + zenodoUrl: AppConfig.AWG_APP_ZENODO_URL, }; /** @@ -27,7 +28,7 @@ const METAPAGE: MetaPage = { * * It provides metadata used for the structure view. */ -const METASTRUCTURE: MetaStructure = { +const META_STRUCTURE: MetaStructure = { authors: [ { name: 'Stefan Münnich', @@ -42,7 +43,7 @@ const METASTRUCTURE: MetaStructure = { * * It provides metadata used for the contact view. */ -const METACONTACT: MetaContact = { +const META_CONTACT: MetaContact = { address: { institution: 'Musikwissenschaftliches Seminar der Universität Basel', street: 'Petersgraben 27/29', @@ -68,8 +69,8 @@ const METACONTACT: MetaContact = { * * Available main sections: `page`, `edition`, `structure`, `contact`. */ -export const METADATA: Meta = { - page: METAPAGE, - structure: METASTRUCTURE, - contact: METACONTACT, +export const META_DATA: Meta = { + page: META_PAGE, + structure: META_STRUCTURE, + contact: META_CONTACT, }; diff --git a/src/app/core/core-models/meta.model.ts b/src/app/core/core-models/meta.model.ts index 2cd4fc2a27..2b21726406 100644 --- a/src/app/core/core-models/meta.model.ts +++ b/src/app/core/core-models/meta.model.ts @@ -97,6 +97,11 @@ export class MetaPage { * The release date of the latest version of the AWG edition website (awg-app). */ versionReleaseDate: string; + + /** + * The url to the Zenodo repository of the AWG edition website (awg-app). + */ + zenodoUrl: string; } /** diff --git a/src/app/core/footer/footer-copyright/footer-copyright.component.spec.ts b/src/app/core/footer/footer-copyright/footer-copyright.component.spec.ts index 03f419ea96..0cbdc7bc3d 100644 --- a/src/app/core/footer/footer-copyright/footer-copyright.component.spec.ts +++ b/src/app/core/footer/footer-copyright/footer-copyright.component.spec.ts @@ -4,7 +4,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { cleanStylesFromDOM } from '@testing/clean-up-helper'; import { expectToBe, expectToContain, expectToEqual, getAndExpectDebugElementByCss } from '@testing/expect-helper'; -import { METADATA } from '@awg-core/core-data'; +import { META_DATA } from '@awg-core/core-data'; import { MetaPage, MetaSectionTypes } from '@awg-core/core-models'; import { FooterCopyrightComponent } from './footer-copyright.component'; @@ -28,7 +28,7 @@ describe('FooterCopyrightComponent (DONE)', () => { compDe = fixture.debugElement; // Test data - expectedPageMetaData = METADATA[MetaSectionTypes.page]; + expectedPageMetaData = META_DATA[MetaSectionTypes.page]; }); afterAll(() => { diff --git a/src/app/core/footer/footer-declaration/footer-declaration.component.html b/src/app/core/footer/footer-declaration/footer-declaration.component.html index f136f67d12..60f477d552 100644 --- a/src/app/core/footer/footer-declaration/footer-declaration.component.html +++ b/src/app/core/footer/footer-declaration/footer-declaration.component.html @@ -1,4 +1,4 @@ -

Prototyp AWG-Online-Edition

+

AWG-Online-Edition

Version {{ pageMetaData?.version }} ◇ diff --git a/src/app/core/footer/footer-declaration/footer-declaration.component.spec.ts b/src/app/core/footer/footer-declaration/footer-declaration.component.spec.ts index 8573ca84ef..bad0b0ff8c 100644 --- a/src/app/core/footer/footer-declaration/footer-declaration.component.spec.ts +++ b/src/app/core/footer/footer-declaration/footer-declaration.component.spec.ts @@ -12,7 +12,7 @@ import { } from '@testing/expect-helper'; import { RouterLinkStubDirective } from '@testing/router-stubs'; -import { METADATA } from '@awg-core/core-data'; +import { META_DATA } from '@awg-core/core-data'; import { MetaPage, MetaSectionTypes } from '@awg-core/core-models'; import { FooterDeclarationComponent } from './footer-declaration.component'; @@ -39,7 +39,7 @@ describe('FooterDeclarationComponent (DONE)', () => { compDe = fixture.debugElement; // Test data - expectedPageMetaData = METADATA[MetaSectionTypes.page]; + expectedPageMetaData = META_DATA[MetaSectionTypes.page]; }); afterAll(() => { @@ -58,18 +58,28 @@ describe('FooterDeclarationComponent (DONE)', () => { describe('VIEW', () => { it('... should contain 3 paragraphs', () => { getAndExpectDebugElementByCss(compDe, 'p', 3, 3); + + getAndExpectDebugElementByCss(compDe, 'p.awg-version-title', 1, 1); + getAndExpectDebugElementByCss(compDe, 'p.awg-version-desc', 1, 1); + getAndExpectDebugElementByCss(compDe, 'p#awg-contact-link', 1, 1); + }); + + it('... should render version title', () => { + const expectedTitle = 'AWG-Online-Edition'; + + const titleDes = getAndExpectDebugElementByCss(compDe, 'p.awg-version-title', 1, 1); + const titleEl = titleDes[0].nativeElement; + + expectToContain(titleEl.textContent, expectedTitle); }); it('... should not render pageMetaData yet', () => { - // Find debug elements const versionDes = getAndExpectDebugElementByCss(compDe, '#awg-version', 1, 1); const versionDateDes = getAndExpectDebugElementByCss(compDe, '#awg-version-date', 1, 1); - // Find native elements const versionEl = versionDes[0].nativeElement; const versionDateEl = versionDateDes[0].nativeElement; - // Check output expectToBe(versionEl.textContent, ''); expectToBe(versionDateEl.textContent, ''); }); @@ -86,15 +96,13 @@ describe('FooterDeclarationComponent (DONE)', () => { }); describe('VIEW', () => { - it('... should render values', () => { + it('... should render version values', () => { const expectedVersion = expectedPageMetaData.version; const expectedVersionDate = expectedPageMetaData.versionReleaseDate; - // Find debug elements const versionDes = getAndExpectDebugElementByCss(compDe, '#awg-version', 1, 1); const versionDateDes = getAndExpectDebugElementByCss(compDe, '#awg-version-date', 1, 1); - // Find native elements const versionEl = versionDes[0].nativeElement; const versionDateEl = versionDateDes[0].nativeElement; diff --git a/src/app/core/footer/footer-logo/footer-logo.component.spec.ts b/src/app/core/footer/footer-logo/footer-logo.component.spec.ts index 03e230588b..43a9ce7c39 100644 --- a/src/app/core/footer/footer-logo/footer-logo.component.spec.ts +++ b/src/app/core/footer/footer-logo/footer-logo.component.spec.ts @@ -13,7 +13,7 @@ import { getAndExpectDebugElementByCss, } from '@testing/expect-helper'; -import { LOGOSDATA } from '@awg-core/core-data'; +import { LOGOS_DATA } from '@awg-core/core-data'; import { Logo } from '@awg-core/core-models'; import { FooterLogoComponent } from './footer-logo.component'; @@ -44,9 +44,9 @@ describe('FooterLogoComponent (DONE)', () => { compDe = fixture.debugElement; // Test data - expectedLeftMainFooterLogo = LOGOSDATA['unibas']; - expectedRightMainFooterLogo = LOGOSDATA['sagw']; - expectedNonMainFooterLogo = LOGOSDATA['angular']; + expectedLeftMainFooterLogo = LOGOS_DATA['unibas']; + expectedRightMainFooterLogo = LOGOS_DATA['sagw']; + expectedNonMainFooterLogo = LOGOS_DATA['angular']; // Spies on component functions // `.and.callThrough` will track the spy down the nested describes, see @@ -100,7 +100,7 @@ describe('FooterLogoComponent (DONE)', () => { describe('AFTER initial data binding', () => { beforeEach(() => { // Simulate the parent setting the input properties - component.logo = LOGOSDATA['sagw']; + component.logo = LOGOS_DATA['sagw']; // Trigger initial data binding fixture.detectChanges(); diff --git a/src/app/core/footer/footer-logo/footer-logo.component.ts b/src/app/core/footer/footer-logo/footer-logo.component.ts index efcd749fb1..5dadacd3d5 100644 --- a/src/app/core/footer/footer-logo/footer-logo.component.ts +++ b/src/app/core/footer/footer-logo/footer-logo.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { LOGOSDATA } from '@awg-core/core-data'; +import { LOGOS_DATA } from '@awg-core/core-data'; import { Logo } from '@awg-core/core-models'; /** @@ -33,9 +33,9 @@ export class FooterLogoComponent { * @returns {string} The class list for the logo. */ getLogoClass(id: string): string { - const isSnfLogo = id === LOGOSDATA['snf'].id; - const isUnibasLogo = id === LOGOSDATA['unibas'].id; - const isSagwLogo = id === LOGOSDATA['sagw'].id; + const isSnfLogo = id === LOGOS_DATA['snf'].id; + const isUnibasLogo = id === LOGOS_DATA['unibas'].id; + const isSagwLogo = id === LOGOS_DATA['sagw'].id; let classList = ''; if (isUnibasLogo || isSnfLogo || isSagwLogo) { diff --git a/src/app/core/footer/footer-poweredby/footer-poweredby.component.spec.ts b/src/app/core/footer/footer-poweredby/footer-poweredby.component.spec.ts index 430c3c0d45..3e9fbfb73a 100644 --- a/src/app/core/footer/footer-poweredby/footer-poweredby.component.spec.ts +++ b/src/app/core/footer/footer-poweredby/footer-poweredby.component.spec.ts @@ -13,7 +13,7 @@ import { getAndExpectDebugElementByDirective, } from '@testing/expect-helper'; -import { LOGOSDATA, METADATA } from '@awg-core/core-data'; +import { LOGOS_DATA, META_DATA } from '@awg-core/core-data'; import { Logo, Logos, MetaPage, MetaSectionTypes } from '@awg-core/core-models'; import { FooterPoweredbyComponent } from './footer-poweredby.component'; @@ -46,8 +46,8 @@ describe('FooterPoweredbyComponent (DONE)', () => { compDe = fixture.debugElement; // Test data - expectedLogos = LOGOSDATA; - expectedPageMetaData = METADATA[MetaSectionTypes.page]; + expectedLogos = LOGOS_DATA; + expectedPageMetaData = META_DATA[MetaSectionTypes.page]; expectedScrewdriverWrenchIcon = faScrewdriverWrench; }); diff --git a/src/app/core/footer/footer.component.spec.ts b/src/app/core/footer/footer.component.spec.ts index 31e1cde841..649b51b3c8 100644 --- a/src/app/core/footer/footer.component.spec.ts +++ b/src/app/core/footer/footer.component.spec.ts @@ -10,7 +10,7 @@ import { getAndExpectDebugElementByDirective, } from '@testing/expect-helper'; -import { LOGOSDATA, METADATA } from '@awg-core/core-data'; +import { LOGOS_DATA, META_DATA } from '@awg-core/core-data'; import { Logo, Logos, MetaPage, MetaSectionTypes } from '@awg-core/core-models'; import { CoreService } from '@awg-core/services'; @@ -56,7 +56,7 @@ describe('FooterComponent (DONE)', () => { beforeEach(waitForAsync(() => { // Stub service for test purposes mockCoreService = { - getMetaDataSection: sectionType => METADATA[sectionType], + getMetaDataSection: sectionType => META_DATA[sectionType], getLogos: () => expectedLogos, }; @@ -78,8 +78,8 @@ describe('FooterComponent (DONE)', () => { compDe = fixture.debugElement; // Test data - expectedLogos = LOGOSDATA; - expectedPageMetaData = METADATA[MetaSectionTypes.page]; + expectedLogos = LOGOS_DATA; + expectedPageMetaData = META_DATA[MetaSectionTypes.page]; // Spies on component functions // `.and.callThrough` will track the spy down the nested describes, see diff --git a/src/app/core/navbar/navbar.component.html b/src/app/core/navbar/navbar.component.html index 3f040cb8c3..4e1d797eb3 100644 --- a/src/app/core/navbar/navbar.component.html +++ b/src/app/core/navbar/navbar.component.html @@ -25,19 +25,19 @@