diff --git a/frontend/src/components/datetime/datetime.tsx b/frontend/src/components/datetime/datetime.tsx index b49db19a8..9b23e0bb2 100644 --- a/frontend/src/components/datetime/datetime.tsx +++ b/frontend/src/components/datetime/datetime.tsx @@ -1,24 +1,24 @@ import { CalendarIcon, ClockIcon } from '@navikt/aksel-icons'; import { styled } from 'styled-components'; import { isoDateTimeToPretty } from '@app/domain/date'; -import { IEditor } from '@app/types/common-text-types'; +import { IEdit } from '@app/types/common-text-types'; interface Props { created: string; - lastEditor: IEditor | undefined; + lastEdit: IEdit | undefined; } -export const ModifiedCreatedDateTime = ({ lastEditor, created }: Props) => { - const isModified = lastEditor !== undefined; +export const ModifiedCreatedDateTime = ({ lastEdit, created }: Props) => { + const isModified = lastEdit !== undefined; const Icon = isModified ? CalendarIcon : ClockIcon; - const dateTime = isModified ? lastEditor.created : created; + const dateTime = isModified ? lastEdit.created : created; const title = isModified ? 'Sist endret' : 'Opprettet'; return ( } dateTime={dateTime} title={title} /> - {lastEditor === undefined ? null : av {lastEditor.navIdent}} + {lastEdit === undefined ? null : av {lastEdit.actor.navIdent}} ); }; diff --git a/frontend/src/components/editor-name/editor-name.tsx b/frontend/src/components/editor-name/editor-name.tsx deleted file mode 100644 index d6d26f256..000000000 --- a/frontend/src/components/editor-name/editor-name.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { Loader } from '@navikt/ds-react'; -import { skipToken } from '@reduxjs/toolkit/query'; -import { useGetSignatureQuery } from '@app/redux-api/bruker'; - -interface EditorProps { - editorId: string; -} - -export const EditorName = ({ editorId }: EditorProps) => { - const query = editorId === 'LOADING' ? skipToken : editorId; - const { data, isLoading } = useGetSignatureQuery(query); - - return isLoading || data === undefined ? ( - - ) : ( - (data.customLongName ?? data.longName) - ); -}; diff --git a/frontend/src/components/maltekstseksjoner/maltekstseksjon/draft/draft.tsx b/frontend/src/components/maltekstseksjoner/maltekstseksjon/draft/draft.tsx index 290f36a77..fda7c50df 100644 --- a/frontend/src/components/maltekstseksjoner/maltekstseksjon/draft/draft.tsx +++ b/frontend/src/components/maltekstseksjoner/maltekstseksjon/draft/draft.tsx @@ -1,7 +1,6 @@ import { Loader } from '@navikt/ds-react'; import { DateTime } from '@app/components/datetime/datetime'; import { EditableTitle } from '@app/components/editable-title/editable-title'; -import { EditorName } from '@app/components/editor-name/editor-name'; import { Filters } from '@app/components/maltekstseksjoner/filters'; import { MaltekstseksjonTexts } from '@app/components/maltekstseksjoner/maltekstseksjon/texts'; import { @@ -46,7 +45,7 @@ export const DraftMaltekstSection = ({ maltekstseksjon, query, onDraftDeleted }: const isUpdating = isUpdatingTitle || isUpdatingTemplateSections || isUpdatingHjemmelIdList || isUpdatingUtfall; - const lastEditor = maltekstseksjon.editors.at(-1); + const lastEdit = maltekstseksjon.edits.at(-1); return ( @@ -62,7 +61,7 @@ export const DraftMaltekstSection = ({ maltekstseksjon, query, onDraftDeleted }: Sist endret: {isUpdating ? : } - av {lastEditor === undefined ? 'Ukjent' : } + av {lastEdit === undefined ? 'Ukjent' : lastEdit.actor.navn} diff --git a/frontend/src/components/maltekstseksjoner/maltekstseksjon/maltekstseksjon-published.tsx b/frontend/src/components/maltekstseksjoner/maltekstseksjon/maltekstseksjon-published.tsx index 1f2086650..f8a7018c0 100644 --- a/frontend/src/components/maltekstseksjoner/maltekstseksjon/maltekstseksjon-published.tsx +++ b/frontend/src/components/maltekstseksjoner/maltekstseksjon/maltekstseksjon-published.tsx @@ -5,7 +5,6 @@ import { useParams } from 'react-router'; import { styled } from 'styled-components'; import { DateTime } from '@app/components/datetime/datetime'; import { getTitle } from '@app/components/editable-title/editable-title'; -import { EditorName } from '@app/components/editor-name/editor-name'; import { MaltekstseksjonTexts } from '@app/components/maltekstseksjoner/maltekstseksjon/texts'; import { TagContainer, @@ -37,7 +36,7 @@ interface MaltekstProps { export const PublishedMaltekstSection = ({ maltekstseksjon, query, onDraftCreated }: MaltekstProps) => { const { textId: activeTextId } = useParams<{ textId: string }>(); - const { id, title, textIdList, publishedDateTime, versionId, publishedBy } = maltekstseksjon; + const { id, title, textIdList, publishedDateTime, versionId, publishedByActor } = maltekstseksjon; const [createDraft, { isLoading }] = useCreateDraftFromVersionMutation(); const onCreateDraft = useCallback(async () => { @@ -57,7 +56,7 @@ export const PublishedMaltekstSection = ({ maltekstseksjon, query, onDraftCreate Publisert: } /> - av {publishedBy === null ? 'Ukjent' : } + av {publishedByActor.navn} diff --git a/frontend/src/components/maltekstseksjoner/texts/text-draft-footer.tsx b/frontend/src/components/maltekstseksjoner/texts/text-draft-footer.tsx index 08d0b71ea..847996224 100644 --- a/frontend/src/components/maltekstseksjoner/texts/text-draft-footer.tsx +++ b/frontend/src/components/maltekstseksjoner/texts/text-draft-footer.tsx @@ -1,7 +1,6 @@ import { UploadIcon } from '@navikt/aksel-icons'; import { Button, ErrorMessage, Loader } from '@navikt/ds-react'; import { styled } from 'styled-components'; -import { EditorName } from '@app/components/editor-name/editor-name'; import { AllMaltekstseksjonReferences } from '@app/components/malteksteksjon-references/maltekstseksjon-references'; import { DeleteDraftButton } from '@app/components/smart-editor-texts/delete-draft-button'; import { isoDateTimeToPretty } from '@app/domain/date'; @@ -29,7 +28,7 @@ export const DraftTextFooter = ({ }: Props) => { const [, { isLoading: isPublishing }] = usePublishMutation({ fixedCacheKey: text.id }); const { id, title, modified } = text; - const [lastEditor] = text.editors; + const [lastEdit] = text.edits; return ( @@ -57,11 +56,7 @@ export const DraftTextFooter = ({ Sist endret:{' '} {isSaving ? : } - {lastEditor === undefined ? null : ( - - , av: - - )} + {lastEdit === undefined ? null : , av: {lastEdit.actor.navn}} ); diff --git a/frontend/src/components/maltekstseksjoner/texts/text-published-footer.tsx b/frontend/src/components/maltekstseksjoner/texts/text-published-footer.tsx index bd83839f4..517063843 100644 --- a/frontend/src/components/maltekstseksjoner/texts/text-published-footer.tsx +++ b/frontend/src/components/maltekstseksjoner/texts/text-published-footer.tsx @@ -1,7 +1,6 @@ import { Button } from '@navikt/ds-react'; import { useCallback } from 'react'; import { styled } from 'styled-components'; -import { EditorName } from '@app/components/editor-name/editor-name'; import { AllMaltekstseksjonReferences } from '@app/components/malteksteksjon-references/maltekstseksjon-references'; import { useTextQuery } from '@app/components/smart-editor-texts/hooks/use-text-query'; import { isoDateTimeToPretty } from '@app/domain/date'; @@ -42,7 +41,7 @@ export const PublishedTextFooter = ({ text, onDraftCreated, maltekstseksjonId, h /> Publisert: , av:{' '} - + {text.publishedByActor.navn} ); diff --git a/frontend/src/components/smart-editor-texts/edit/changelog.tsx b/frontend/src/components/smart-editor-texts/edit/changelog.tsx index fb1aad5e0..633d0bcee 100644 --- a/frontend/src/components/smart-editor-texts/edit/changelog.tsx +++ b/frontend/src/components/smart-editor-texts/edit/changelog.tsx @@ -3,7 +3,7 @@ import { Fragment, useCallback, useRef } from 'react'; import { styled } from 'styled-components'; import { isoDateTimeToPretty } from '@app/domain/date'; import { TextChangeType } from '@app/types/common-text-types'; -import { IText } from '@app/types/texts/responses'; +import { IPublishedText, IText } from '@app/types/texts/responses'; interface Props { versions: IText[]; @@ -39,11 +39,11 @@ export const Changelog = ({ versions }: Props) => { {versions.flatMap((version) => ( {version.published ? : null} - {version.editors.map(({ created, changeType, navIdent }) => ( - + {version.edits.map(({ created, changeType, actor }) => ( + {isoDateTimeToPretty(created)} {CHANGE_TYPE_NAMES[changeType]} - {navIdent} + {actor.navn} ))} @@ -56,11 +56,11 @@ export const Changelog = ({ versions }: Props) => { ); }; -const Version = ({ publishedBy, publishedDateTime }: IText) => ( +const Version = ({ publishedByActor, publishedDateTime }: IPublishedText) => ( {isoDateTimeToPretty(publishedDateTime)} Publisert - {publishedBy} + {publishedByActor.navn} ); diff --git a/frontend/src/components/smart-editor-texts/edit/edit.tsx b/frontend/src/components/smart-editor-texts/edit/edit.tsx index 7658930d3..6966b8027 100644 --- a/frontend/src/components/smart-editor-texts/edit/edit.tsx +++ b/frontend/src/components/smart-editor-texts/edit/edit.tsx @@ -44,7 +44,7 @@ export const Edit = ({ text, onDraftDeleted, children, status, onPublish, delete const { enhet, templateSection, utfall, ytelseHjemmel } = useMetadataFilters(textType); - const [lastEditor] = text.editors.filter( + const [lastEdit] = text.edits.filter( (e) => e.changeType === TextChangeType.TEXT_ENHETER || e.changeType === TextChangeType.TEXT_SECTIONS || @@ -68,7 +68,7 @@ export const Edit = ({ text, onDraftDeleted, children, status, onPublish, delete Sist endret: - + diff --git a/frontend/src/components/smart-editor-texts/edit/footer.tsx b/frontend/src/components/smart-editor-texts/edit/footer.tsx index 83b0edb97..96d339778 100644 --- a/frontend/src/components/smart-editor-texts/edit/footer.tsx +++ b/frontend/src/components/smart-editor-texts/edit/footer.tsx @@ -2,7 +2,6 @@ import { TrashIcon, UploadIcon } from '@navikt/aksel-icons'; import { Button, ErrorMessage } from '@navikt/ds-react'; import { useMemo, useState } from 'react'; import { styled } from 'styled-components'; -import { EditorName } from '@app/components/editor-name/editor-name'; import { AllMaltekstseksjonReferences } from '@app/components/malteksteksjon-references/maltekstseksjon-references'; import { SavedStatus, SavedStatusProps } from '@app/components/saved-status/saved-status'; import { isoDateTimeToPretty } from '@app/domain/date'; @@ -10,7 +9,7 @@ import { isGodFormuleringType, isRegelverkType, isRichTextType } from '@app/func import { useRedaktoerLanguage } from '@app/hooks/use-redaktoer-language'; import { usePublishMutation } from '@app/redux-api/texts/mutations'; import { useGetTextVersionsQuery } from '@app/redux-api/texts/queries'; -import { IEditor, TextChangeType } from '@app/types/common-text-types'; +import { IEdit, TextChangeType } from '@app/types/common-text-types'; import { TextType } from '@app/types/texts/common'; import { LANGUAGE_NAMES, Language } from '@app/types/texts/language'; import { IText } from '@app/types/texts/responses'; @@ -30,7 +29,7 @@ export const Footer = ({ text, onDraftDeleted, status, onPublish, deleteTranslat const { data: versions = [] } = useGetTextVersionsQuery(text.id); const lastPublishedVersion = useMemo(() => versions.find((version) => version.published), [versions]); - const { id, editors, publishedMaltekstseksjonIdList, draftMaltekstseksjonIdList, textType } = text; + const { id, edits, publishedMaltekstseksjonIdList, draftMaltekstseksjonIdList, textType } = text; const isDraft = text.publishedDateTime === null; @@ -57,7 +56,7 @@ export const Footer = ({ text, onDraftDeleted, status, onPublish, deleteTranslat /> - + ); @@ -95,12 +94,12 @@ const DeleteLanguageVersion = ({ deleteTranslation }: DeleteLanguageVersionProps ); }; -interface LastEditorProps { - editors: IEditor[]; +interface LastEditProps { + edits: IEdit[]; textType: TextType; } -const LastEditor = ({ editors, textType }: LastEditorProps) => { +const LastEdit = ({ edits, textType }: LastEditProps) => { const language = useRedaktoerLanguage(); const changeType: TextChangeType = useMemo(() => { if (isRichTextType(textType) || isGodFormuleringType(textType)) { @@ -114,7 +113,7 @@ const LastEditor = ({ editors, textType }: LastEditorProps) => { return language === Language.NB ? TextChangeType.PLAIN_TEXT_NB : TextChangeType.PLAIN_TEXT_NN; }, [language, textType]); - const [lastEdit] = editors.filter( + const [lastEdit] = edits.filter( (e) => e.changeType === changeType || e.changeType === TextChangeType.TEXT_VERSION_CREATED, ); @@ -123,10 +122,10 @@ const LastEditor = ({ editors, textType }: LastEditorProps) => { } return ( - + Sist endret: , av:{' '} - - + {lastEdit.actor.navn} + ); }; @@ -137,7 +136,7 @@ const Container = styled.div` padding: 16px; `; -const LastEditorContainer = styled.span` +const LastEditContainer = styled.span` display: flex; align-items: center; white-space: pre; diff --git a/frontend/src/components/text-history/text-history.tsx b/frontend/src/components/text-history/text-history.tsx index 1c54221d9..c159a8885 100644 --- a/frontend/src/components/text-history/text-history.tsx +++ b/frontend/src/components/text-history/text-history.tsx @@ -2,45 +2,45 @@ import { CalendarIcon, ClockDashedIcon, PencilWritingIcon, UploadIcon } from '@n import { Button, Tag } from '@navikt/ds-react'; import { useRef, useState } from 'react'; import { styled } from 'styled-components'; -import { EditorName } from '@app/components/editor-name/editor-name'; import { isoDateTimeToPretty } from '@app/domain/date'; import { useOnClickOutside } from '@app/hooks/use-on-click-outside'; import { pushEvent } from '@app/observability'; +import { INavEmployee } from '@app/types/bruker'; import { IEditor } from '@app/types/maltekstseksjoner/responses'; interface PublishedProps { publishedDateTime: string; - publishedBy: string; + publishedByActor: INavEmployee; } interface DraftProps { publishedDateTime: null; - publishedBy: null; + publishedByActor: null; } interface Props { published: boolean; modified: string; created: string; - createdBy: string; - editors: IEditor[]; + createdByActor: INavEmployee; + edits: IEditor[]; isUpdating: boolean; } export const TextHistory = ({ publishedDateTime, - publishedBy, + publishedByActor, created, - createdBy, - editors, + createdByActor, + edits, }: Props & (PublishedProps | DraftProps)) => { - const [showEditors, setShowEditors] = useState(false); + const [showEdits, setShowEdits] = useState(false); const ref = useRef(null); - useOnClickOutside(ref, () => setShowEditors(false)); + useOnClickOutside(ref, () => setShowEdits(false)); return ( - {showEditors && ( + {showEdits && ( {publishedDateTime !== null ? ( @@ -50,19 +50,19 @@ export const TextHistory = ({ {' '} - av {isoDateTimeToPretty(publishedDateTime)} + av {publishedByActor.navn} {isoDateTimeToPretty(publishedDateTime)} ) : null} - {editors.map((editor) => ( - + {edits.map((edit) => ( + Endret {' '} - av {isoDateTimeToPretty(editor.created)} + av {edit.actor.navn} {isoDateTimeToPretty(edit.created)} ))} @@ -73,7 +73,7 @@ export const TextHistory = ({ {' '} - av {isoDateTimeToPretty(created)} + av {createdByActor.navn} {isoDateTimeToPretty(created)} @@ -82,13 +82,13 @@ export const TextHistory = ({ variant="tertiary" size="xsmall" onClick={() => { - const enabled = !showEditors; + const enabled = !showEdits; pushEvent('toggle-text-history', 'texts', { enabled: enabled.toString() }); - setShowEditors(enabled); + setShowEdits(enabled); }} icon={} > - {showEditors ? 'Skjul' : 'Vis'} historikk + {showEdits ? 'Skjul' : 'Vis'} historikk ); diff --git a/frontend/src/redux-api/maltekstseksjoner/mutations.ts b/frontend/src/redux-api/maltekstseksjoner/mutations.ts index 43c8a6b66..f0e5a0089 100644 --- a/frontend/src/redux-api/maltekstseksjoner/mutations.ts +++ b/frontend/src/redux-api/maltekstseksjoner/mutations.ts @@ -14,6 +14,7 @@ import { maltekstseksjonerApi } from '@app/redux-api/maltekstseksjoner/malteksts import { maltekstseksjonerQuerySlice } from '@app/redux-api/maltekstseksjoner/queries'; import { getLastPublishedAndVersionToShowInTrash } from '@app/redux-api/redaktoer-helpers'; import { ConsumerTextsTagTypes, consumerTextsApi } from '@app/redux-api/texts/consumer'; +import { user } from '@app/static-data/static-data'; import { IGetMaltekstseksjonParams, PublishedTextReadOnlyMetadata } from '@app/types/common-text-types'; import { isApiRejectionError } from '@app/types/errors'; import { @@ -198,6 +199,7 @@ const maltekstseksjonerMutationSlice = maltekstseksjonerApi.injectEndpoints({ const textPatches: PatchResult[] = []; const nonTrashQuery = { ...query, trash: false }; + const { navIdent, navn } = await user; const maltekstseksjonerPatch = dispatch( maltekstseksjonerQuerySlice.util.updateQueryData('getMaltekstseksjoner', nonTrashQuery, (draft) => @@ -207,8 +209,8 @@ const maltekstseksjonerMutationSlice = maltekstseksjonerApi.injectEndpoints({ const publishedProps: Pick< PublishedTextReadOnlyMetadata, - 'published' | 'publishedDateTime' | 'publishedBy' - > = { published: true, publishedDateTime, publishedBy: 'LOADING' }; + 'published' | 'publishedDateTime' | 'publishedByActor' + > = { published: true, publishedDateTime, publishedByActor: { navIdent, navn } }; for (const textId of section.textIdList) { textPatches.push( diff --git a/frontend/src/redux-api/texts/mutations.ts b/frontend/src/redux-api/texts/mutations.ts index 9912a4d02..57b3b178c 100644 --- a/frontend/src/redux-api/texts/mutations.ts +++ b/frontend/src/redux-api/texts/mutations.ts @@ -46,7 +46,7 @@ const textsMutationSlice = textsApi.injectEndpoints({ url: `/texts/${id}/publish`, }), onQueryStarted: async ({ id, query }, { queryFulfilled, dispatch }) => { - const { navIdent } = await user; + const { navIdent, navn } = await user; const idPatchResult = dispatch( textsQuerySlice.util.updateQueryData('getTextById', id, (draft) => { @@ -55,7 +55,7 @@ const textsMutationSlice = textsApi.injectEndpoints({ } const publishedDateTime = formatISO(new Date()); - const updated = { ...draft, publishedBy: navIdent, published: true, publishedDateTime }; + const updated = { ...draft, publishedByActor: { navIdent, navn }, published: true, publishedDateTime }; return updated; }), @@ -542,19 +542,19 @@ const update = (id: string, upd: Update | UpdateFn, query: IGetTextsParams) => { }; const pessimisticUpdate = (id: string, data: IText, query: IGetTextsParams, showToast = true) => { - const { modified, title, editors } = data; + const { modified, title, edits } = data; if (showToast) { toast.success(`Malteksten «${title}» ble oppdatert.`); } reduxStore.dispatch( - textsQuerySlice.util.updateQueryData('getTextById', id, (draft) => ({ ...draft, modified, editors })), + textsQuerySlice.util.updateQueryData('getTextById', id, (draft) => ({ ...draft, modified, edits })), ); reduxStore.dispatch( textsQuerySlice.util.updateQueryData('getTexts', { ...query, trash: false }, (draft) => - draft.map((t) => (t.publishedDateTime === null && t.id === id ? { ...t, modified, editors } : t)), + draft.map((t) => (t.publishedDateTime === null && t.id === id ? { ...t, modified, edits } : t)), ), ); @@ -565,7 +565,7 @@ const pessimisticUpdate = (id: string, data: IText, query: IGetTextsParams, show return version; } - return { ...version, modified, editors }; + return { ...version, modified, edits }; }), ), ); diff --git a/frontend/src/types/common-text-types.ts b/frontend/src/types/common-text-types.ts index 6c3b6fabd..e54c831fe 100644 --- a/frontend/src/types/common-text-types.ts +++ b/frontend/src/types/common-text-types.ts @@ -1,3 +1,4 @@ +import { INavEmployee } from '@app/types/bruker'; import { Language, UNTRANSLATED } from '@app/types/texts/language'; export enum TextChangeType { @@ -17,10 +18,10 @@ export enum TextChangeType { UNKNOWN = 'UNKNOWN', } -export interface IEditor { +export interface IEdit { created: string; changeType: TextChangeType; - navIdent: string; + actor: INavEmployee; } export interface ITextBaseMetadata { @@ -35,7 +36,8 @@ interface ReadOnlyMetadata { readonly id: string; // UUID readonly modified: string; // Datetime readonly created: string; // Datetime - readonly editors: IEditor[]; + readonly createdByActor: INavEmployee; + readonly edits: IEdit[]; readonly versionId: string; readonly draftMaltekstseksjonIdList: string[]; readonly publishedMaltekstseksjonIdList: string[]; @@ -43,13 +45,13 @@ interface ReadOnlyMetadata { export interface PublishedTextReadOnlyMetadata extends ReadOnlyMetadata { readonly published: boolean; - readonly publishedBy: string | 'LOADING'; + readonly publishedByActor: INavEmployee; readonly publishedDateTime: string; } export interface DraftTextReadOnlyMetadata extends ReadOnlyMetadata { readonly published: false; - readonly publishedBy: null; + readonly publishedByActor: null; readonly publishedDateTime: null; } diff --git a/frontend/src/types/maltekstseksjoner/responses.ts b/frontend/src/types/maltekstseksjoner/responses.ts index cc3890d63..29b104bda 100644 --- a/frontend/src/types/maltekstseksjoner/responses.ts +++ b/frontend/src/types/maltekstseksjoner/responses.ts @@ -1,3 +1,4 @@ +import { INavEmployee } from '@app/types/bruker'; import { IPublishedRichText } from '../texts/responses'; enum MaltekstseksjonChangeType { @@ -13,7 +14,7 @@ enum MaltekstseksjonChangeType { } export interface IEditor { - navIdent: string; + actor: INavEmployee; created: string; changeType: MaltekstseksjonChangeType; } @@ -30,7 +31,7 @@ interface ReadOnlyMetadata { readonly id: string; // UUID readonly modified: string; // Datetime readonly created: string; // Datetime - readonly editors: IEditor[]; + readonly edits: IEditor[]; readonly versionId: string; readonly draftMaltekstseksjonIdList: string[]; readonly publishedMaltekstseksjonIdList: string[]; @@ -38,13 +39,13 @@ interface ReadOnlyMetadata { interface PublishedReadOnlyMetadata extends ReadOnlyMetadata { readonly published: boolean; - readonly publishedBy: string | 'LOADING'; + readonly publishedByActor: INavEmployee; readonly publishedDateTime: string; } interface DraftReadOnlyMetadata extends ReadOnlyMetadata { readonly published: false; - readonly publishedBy: null; + readonly publishedByActor: null; readonly publishedDateTime: null; } @@ -53,7 +54,7 @@ export type IPublishedMaltekstseksjon = Filters & readonly textIdList: string[]; readonly modified: string; // Datetime readonly created: string; // Datetime - readonly createdBy: string; + readonly createdByActor: INavEmployee; }; export type IDraftMaltekstseksjon = Filters & @@ -61,7 +62,7 @@ export type IDraftMaltekstseksjon = Filters & readonly textIdList: string[]; readonly modified: string; // Datetime readonly created: string; // Datetime - readonly createdBy: string; + readonly createdByActor: INavEmployee; }; export type IMaltekstseksjon = IPublishedMaltekstseksjon | IDraftMaltekstseksjon;