From fa4f60296382128974344c83c38de8c0cd1814ac Mon Sep 17 00:00:00 2001 From: andreastanderen Date: Mon, 12 Aug 2024 09:24:31 +0200 Subject: [PATCH] Import news loclly from repo insted of from cdn --- .github/scripts/publishNews.sh | 131 ------------------ .github/workflows/publish-news-to-cdn.yaml | 31 ----- .../overview/components/News/News.test.tsx | 77 +++------- .../overview/components/News/News.tsx | 32 +---- .../components/News/NewsContent/news.nb.json | 15 ++ .../news.schema.json} | 0 .../News/NewsContentCDN/news.nb.json | 35 ----- frontend/language/src/nb.json | 3 - 8 files changed, 42 insertions(+), 282 deletions(-) delete mode 100644 .github/scripts/publishNews.sh delete mode 100644 .github/workflows/publish-news-to-cdn.yaml create mode 100644 frontend/app-development/features/overview/components/News/NewsContent/news.nb.json rename frontend/app-development/features/overview/components/News/{NewsContentCDN/News.schema.json => NewsContent/news.schema.json} (100%) delete mode 100644 frontend/app-development/features/overview/components/News/NewsContentCDN/news.nb.json diff --git a/.github/scripts/publishNews.sh b/.github/scripts/publishNews.sh deleted file mode 100644 index c7fec2ed0d1..00000000000 --- a/.github/scripts/publishNews.sh +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -u - -COMMIT=no - -while [[ $# -gt 0 ]]; do - case $1 in - --cdn) - PATH_TO_CDN=$(realpath "$2") - shift # pop option - shift # pop value - ;; - --news) - PATH_TO_NEWS=$(realpath "$2") - shift # pop option - shift # pop value - ;; - --news-schema) - PATH_TO_NEWS_SCHEMA=$(realpath "$2") - shift # pop option - shift # pop value - ;; - --commit) - COMMIT=yes - shift # pop option - ;; - -*|--*) - echo "Unknown option $1" - exit 1 - ;; - *) - echo "Unknown argument $1" - exit 1 - ;; - esac -done - -TARGET_PATH=studio/designer/news -NEWS=news.nb.json -NEWS_SCHEMA=news.schema.json - -<-- Need this? The vars comes from the workflow --> -if ! test -d "$PATH_TO_CDN" || ! test -d "$PATH_TO_CDN/$TARGET_PATH"; then - echo "Unable to find $PATH_TO_CDN/$TARGET_PATH" - echo "Make sure path to CDN has been passed with --cdn " - exit 1 -fi -if ! test -d "$PATH_TO_NEWS" && ! test -d "$PATH_TO_NEWS_SCHEMA"; then - echo "Unable to find $PATH_TO_NEWS or $PATH_TO_NEWS_SCHEMA" - echo "Make sure path to news or news schema has been passed with --news or --news-schema " - exit 1 -fi - -if test -d "$PATH_TO_NEWS" && test -d "$PATH_TO_NEWS_SCHEMA"; then - echo "It is only possible to pass one of the arguments; --news or --news-schema" - echo "Make sure path to news or news schema has been passed with --news or --news-schema , and not both" - exit 1 -fi - -# Make two workflows? one for changes in news and another for changes in schema? -SOURCE_TO_NEWS="$PATH_TO_NEWS" -SOURCE_TO_NEWS_SCHEMA="$PATH_TO_NEWS_SCHEMA" -TARGET="$PATH_TO_CDN/$TARGET_PATH" - -echo "-------------------------------------" -echo "Source to news: $SOURCE_TO_NEWS" -echo "Source to news schema: $SOURCE_TO_NEWS_SCHEMA" -echo "Target: $TARGET" -echo "Commit: $COMMIT (toggle with --commit)" -echo "-------------------------------------" - -AUTHOR_FULL=$(git log -1 | grep Author | sed 's/^Author: //') -AUTHOR_NAME="$(echo "$AUTHOR_FULL" | sed -r 's/<.*//')" -AUTHOR_EMAIL="$(echo "$AUTHOR_FULL" | sed -r 's/^.*?//')" -COMMIT_ID=$(git rev-parse HEAD~0) - -echo "Latest author: $AUTHOR_FULL" -echo "Author name: $AUTHOR_NAME" -echo "Author email: $AUTHOR_EMAIL" -echo "Commit ID: $COMMIT_ID" -echo "-------------------------------------" - -COMMIT_FILE=$(mktemp --suffix=-cdn-commit) -{ - echo "$AUTHOR_FULL updated studio news" - echo "based on commit https://github.com/Altinn/altinn-studio/commit/$COMMIT_ID" - git log -1 | grep -Ev "commit|Author|Date" -} >> "$COMMIT_FILE" - -echo "CDN commit message:" -echo -cat "$COMMIT_FILE" -echo "-------------------------------------" -echo "Files to be copied:" -echo -ls -1 $SOURCE/* -echo "-------------------------------------" -echo "Log:" -echo - -# Needed in order for git commands to work -cd "$TARGET" - -# Adding both files even though news.nb.json is the only one being changed in most cases. -# This is because "git add ." will only add the changed files anyway. -echo " * Copying news" -test -e "$TARGET/$NEWS" && git rm -r "$TARGET/$NEWS" -mkdir -p "$TARGET" -cp -fr SOURCE_TO_NEWS "$TARGET/$NEWS" - - -echo " * Copying news schema" -test -e "$TARGET/$NEWS_SCHEMA" && git rm -r "$TARGET/$NEWS_SCHEMA" -mkdir -p "$TARGET" -cp -fr SOURCE_TO_NEWS_SCHEMA "$TARGET/$NEWS_SCHEMA" - - -cd ../.. - -echo " * Staged for commit:" -git add . -git status --short - -if [[ "$COMMIT" == "yes" ]]; then - echo " * Committing changes" - git -c user.email="$AUTHOR_EMAIL" -c user.name="$AUTHOR_NAME" commit -F "$COMMIT_FILE" -else - echo " * Skipping commit (toggle with --commit)" -fi diff --git a/.github/workflows/publish-news-to-cdn.yaml b/.github/workflows/publish-news-to-cdn.yaml deleted file mode 100644 index 17ff68ac6a8..00000000000 --- a/.github/workflows/publish-news-to-cdn.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: Publish to CDN -on: - push: - branches: - - main - paths: - - 'frontend/app-development/features/overview/components/News/NewsContentCDN/*' - -jobs: - publish-news-to-cdn: - runs-on: ubuntu-latest - name: 'Publish news to CDN' - steps: - - name: 'Checkout Altinn-CDN repository' - uses: actions/checkout@v4 - with: - repository: 'Altinn/altinn-cdn' - token: ${{secrets.ALTINN_CDN_TOKEN}} - path: cdn - - - name: 'Run publish script' - run: | - bash .github/scripts/publishNews.sh \ - --news frontend/app-development/features/overview/components/News/NewsContentCDN/news.nb.json \ - --news-schema frontend/app-development/features/overview/components/News/NewsContentCDN/news.schema.json \ - --cdn ../cdn \ - --commit \ - - - name: Push to CDN - working-directory: cdn - run: git push \ No newline at end of file diff --git a/frontend/app-development/features/overview/components/News/News.test.tsx b/frontend/app-development/features/overview/components/News/News.test.tsx index 6e5183bda81..94795053d40 100644 --- a/frontend/app-development/features/overview/components/News/News.test.tsx +++ b/frontend/app-development/features/overview/components/News/News.test.tsx @@ -1,11 +1,15 @@ import React from 'react'; -import { screen, waitFor, waitForElementToBeRemoved } from '@testing-library/react'; -import { renderWithProviders } from 'app-development/test/testUtils'; -import { APP_DEVELOPMENT_BASENAME, NEWS_EXPIRATION_TIME_IN_DAYS } from 'app-shared/constants'; -import { News } from './News'; +import { render, screen, waitFor } from '@testing-library/react'; import type { NewsList } from 'app-shared/types/api/NewsList'; import { textMock } from '@studio/testing/mocks/i18nMock'; -import type { ServicesContextProps } from 'app-shared/contexts/ServicesContext'; +import { NEWS_EXPIRATION_TIME_IN_DAYS } from 'app-shared/constants'; + +const mockNewsData = (newsList: NewsList) => { + jest.mock('./NewsContent/news.nb.json', () => ({ + __esModule: true, + default: newsList, + })); +}; const formatDate = (date) => { const year = date.getFullYear(); @@ -21,6 +25,9 @@ const formatDateToVisualText = (date: string) => { }; describe('News', () => { + afterEach(() => { + jest.resetModules(); + }); it('section title is always rendered', async () => { const publishDate = new Date(); const newsList: NewsList = { @@ -32,7 +39,7 @@ describe('News', () => { }, ], }; - await render(newsList); + await renderNews(newsList); await screen.findByText('title'); }); @@ -47,7 +54,7 @@ describe('News', () => { }, ], }; - await render(newsList); + await renderNews(newsList); await screen.findByText('title'); await screen.findByText('News content'); @@ -68,10 +75,7 @@ describe('News', () => { }, ], }; - await render(newsList); - await waitForElementToBeRemoved(() => - screen.queryByText(textMock('overview.fetch_news_loading_message')), - ); + await renderNews(newsList); const noNewsTitle = screen.getByText(textMock('overview.no_news_title')); expect(noNewsTitle).toBeInTheDocument(); @@ -79,21 +83,6 @@ describe('News', () => { expect(noNewsContent).toBeInTheDocument(); }); - it('loading spinner is shown while waiting for content', async () => { - const newsList: NewsList = { - news: [ - { - title: 'title', - content: 'News content', - date: '2021-01-01', - }, - ], - }; - render(newsList); - - await screen.findByText(textMock('overview.fetch_news_loading_message')); - }); - it('does not list a news if the date in the news is in the future', async () => { const publishDate = new Date(); publishDate.setDate(publishDate.getDate() + 1); @@ -106,8 +95,7 @@ describe('News', () => { }, ], }; - - await render(newsList); + await renderNews(newsList); await waitFor(() => { screen.queryByText('News content'); @@ -129,8 +117,7 @@ describe('News', () => { }, ], }; - - await render(newsList); + await renderNews(newsList); await waitFor(() => { screen.queryByText('News content'); @@ -139,32 +126,10 @@ describe('News', () => { const news = screen.queryByText('News content'); expect(news).not.toBeInTheDocument(); }); - - it('error message is shown when content fails to load', async () => { - const publishDate = new Date(); - const newsList: NewsList = { - news: [ - { - title: 'title', - content: 'News content', - date: formatDate(publishDate), - }, - ], - }; - await render(newsList, { - getNewsList: jest.fn().mockImplementation(() => Promise.reject()), - }); - - await screen.findByText(textMock('overview.fetch_news_error_message')); - }); }); -const render = async (newsList: NewsList, queries?: Partial) => { - return renderWithProviders(, { - startUrl: `${APP_DEVELOPMENT_BASENAME}/my-org/my-app`, - queries: { - getNewsList: jest.fn().mockImplementation(() => Promise.resolve(newsList)), - ...queries, - }, - }); +const renderNews = async (newsList: NewsList) => { + mockNewsData(newsList); + const { News } = await import('./News'); + return render(); }; diff --git a/frontend/app-development/features/overview/components/News/News.tsx b/frontend/app-development/features/overview/components/News/News.tsx index c3d1568fdfb..9f551f8c304 100644 --- a/frontend/app-development/features/overview/components/News/News.tsx +++ b/frontend/app-development/features/overview/components/News/News.tsx @@ -1,17 +1,17 @@ import * as React from 'react'; import { Card, Heading, Link, Paragraph } from '@digdir/designsystemet-react'; -import { useNewsListQuery } from 'app-development/hooks/queries/useNewsListQuery'; -import { StudioPageError, StudioSpinner } from '@studio/components'; import { useTranslation } from 'react-i18next'; import classes from './News.module.css'; -import { NEWS_EXPIRATION_TIME_IN_DAYS } from 'app-shared/constants'; import { gitHubRoadMapUrl } from 'app-shared/ext-urls'; +import newsData from './NewsContent/news.nb.json'; +import { NEWS_EXPIRATION_TIME_IN_DAYS } from 'app-shared/constants'; export const News = () => { - const { data: newsList, isPending, isError, isSuccess } = useNewsListQuery(); const { t } = useTranslation(); const today = new Date(); + const newsList = newsData.news; + const showNews = (date: string): boolean => { const publishDate = new Date(date); const publishDatePlus30Days = new Date(publishDate); @@ -19,8 +19,7 @@ export const News = () => { return publishDate <= today && today <= publishDatePlus30Days; }; - const thereAreRelevantNews = - isSuccess && newsList.news.filter((news) => showNews(news.date)).length > 0; + const thereAreRelevantNews = newsList.filter((news) => showNews(news.date)).length > 0; const formatDateToText = (date: string) => { // Date comes in this format: YYYY-MM-DD @@ -28,30 +27,11 @@ export const News = () => { return `${day}.${month}.${year}`; }; - if (isPending) { - return ( - - - - ); - } - - if (isError) { - return ( - - - - ); - } - return (
{thereAreRelevantNews ? ( - newsList.news?.map(({ title, content, date }) => { + newsList?.map(({ title, content, date }) => { return ( showNews(date) && ( diff --git a/frontend/app-development/features/overview/components/News/NewsContent/news.nb.json b/frontend/app-development/features/overview/components/News/NewsContent/news.nb.json new file mode 100644 index 00000000000..44eeeab0b4d --- /dev/null +++ b/frontend/app-development/features/overview/components/News/NewsContent/news.nb.json @@ -0,0 +1,15 @@ +{ + "$schema": "news.schema.json", + "news": [ + { + "date": "2024-08-07", + "title": "Prosessverktøyet støtter nå betaling", + "content": "Du kan nå legge til betalingssteg i prosessen." + }, + { + "date": "2024-07-18", + "title": "Vi har fjernet regler for beregninger og betingede visninger", + "content": "Verktøyene er utdaterte, så vi har tatt de bort fra Lage-siden. Du kan fortsatt lage regler for beregninger og betingede visninger i koden, men vi anbefaler å heller bruke dynamiske uttrykk." + } + ] +} diff --git a/frontend/app-development/features/overview/components/News/NewsContentCDN/News.schema.json b/frontend/app-development/features/overview/components/News/NewsContent/news.schema.json similarity index 100% rename from frontend/app-development/features/overview/components/News/NewsContentCDN/News.schema.json rename to frontend/app-development/features/overview/components/News/NewsContent/news.schema.json diff --git a/frontend/app-development/features/overview/components/News/NewsContentCDN/news.nb.json b/frontend/app-development/features/overview/components/News/NewsContentCDN/news.nb.json deleted file mode 100644 index d567fe87181..00000000000 --- a/frontend/app-development/features/overview/components/News/NewsContentCDN/news.nb.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "news.schema.json", - "news": [ - { - "date": "2024-07-18", - "title": "Vi har fjernet regler for beregninger og betingede visninger", - "content": "Verktøyene er utdaterte, så vi har tatt de bort fra Lage-siden. Du kan fortsatt lage regler for beregninger og betingede visninger i koden, men vi anbefaler å heller bruke dynamiske uttrykk." - }, - { - "date": "2024-04-24", - "title": "Automatisk lagring i prosessvising", - "content": "Prosess nå lagres automatisk ved endringer. Legger man til en ny oppgave for utfylling (Altinn 'data'-task) opprettes tilhørende sidegruppe (for oppsett av skjema) nå automatisk." - }, - { - "date": "2024-04-10", - "title": "Ny publiseringsside", - "content": "Nå har vi lansert en oppdatert publiserings-side med nytt design. Oversikt over tjenesten i de forskjellige miljøene er oppdatert, og status på tjenesten i miljøene er nå helt oppdatert til en hver tid." - }, - { - "date": "2024-01-16", - "title": "Prosessvisning", - "content": "Nå er prosess-siden tilgjengelig i BETA! I første omgang blir det mulig å se prosessen sin. Når versjon 8 av støttebibliotekene til applikasjonene er publisert kan de som oppgrader til disse også få mulighet til å redigere prosessen. Nye detaljer og redigeringsmuligheter publiseres fortløpende." - }, - { - "date": "2023-12-11", - "title": "Mer kompakt sidevisning i skjemabyggeren", - "content": "Nå har vi oppdatert sidevisningen i skjemabyggeren til å bli mer kompakt! Dra-og-slipp og valg av komponent for å konfigurere fungerer akkurat som før." - }, - { - "date": "2023-10-20", - "title": "Ny oversikts-side", - "content": "Nå har vi fått en ny oversiktsside i Altinn Studio. Her kan du navigere deg videre rundt i Studio, finne lenker til dokumentasjon, og se status på tjenesten i de forskjellige miljøene. Feltene som tidligere ble vist på denne siden finner du under \"Innstillinger\"-menyen til venstre i toppmenyen." - } - ] -} diff --git a/frontend/language/src/nb.json b/frontend/language/src/nb.json index 411b28ebd9f..58421640ce3 100644 --- a/frontend/language/src/nb.json +++ b/frontend/language/src/nb.json @@ -515,9 +515,6 @@ "overview.download_repo_changes": "Jeg vil ha en zip-fil med mine endrede filer", "overview.download_repo_full": "Jeg vil ha en zip-fil med hele repoet", "overview.download_repo_heading": "Last ned alle endringer?", - "overview.fetch_news_error_message": "Kunne ikke laste inn nyheter. Prøv igjen senere.", - "overview.fetch_news_loading_message": "Laster nyheter...", - "overview.fetch_title_error_message": "Kunne ikke laste inn tittelen for denne appen. Prøv igjen senere.", "overview.go_to_publish": "Gå til <0>Publiser.", "overview.header_loading": "Laster inn navnet på appen", "overview.navigation_title": "Bygg appen med våre verktøy",