Skip to content

Commit e2acfc2

Browse files
committed
autosave unsaved global translation connections when publishing
1 parent 4009c68 commit e2acfc2

File tree

4 files changed

+64
-13
lines changed

4 files changed

+64
-13
lines changed

Diff for: packages/bygger/src/Forms/publish/ConfirmPublishModal.tsx

+25-3
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,44 @@
11
import { ConfirmationModal } from '@navikt/skjemadigitalisering-shared-components';
2-
import { Form, localizationUtils } from '@navikt/skjemadigitalisering-shared-domain';
2+
import { Form, FormsApiFormTranslation, localizationUtils } from '@navikt/skjemadigitalisering-shared-domain';
3+
import { useFeedbackEmit } from '../../context/notifications/FeedbackContext';
34
import { useForm } from '../../context/old_form/FormContext';
5+
import { useFormTranslations } from '../../context/translations/FormTranslationsContext';
46

57
interface Props {
68
form: Form;
79
open: boolean;
810
onClose: () => void;
911
publishLanguageCodeList: string[];
12+
unsavedGlobalTranslations: FormsApiFormTranslation[];
1013
}
1114

12-
const ConfirmPublishModal = ({ open, onClose, form, publishLanguageCodeList }: Props) => {
15+
const ConfirmPublishModal = ({ open, onClose, form, publishLanguageCodeList, unsavedGlobalTranslations }: Props) => {
1316
const { publishForm } = useForm();
17+
const { saveTranslation, loadTranslations } = useFormTranslations();
18+
const feedbackEmit = useFeedbackEmit();
19+
1420
const languageCodes = publishLanguageCodeList.map(localizationUtils.getLanguageCodeAsIso639_1);
1521

22+
const handlePublish = async () => {
23+
if (unsavedGlobalTranslations.length > 0) {
24+
try {
25+
await Promise.all(unsavedGlobalTranslations.map(saveTranslation));
26+
await loadTranslations();
27+
} catch (error) {
28+
const message = (error as Error)?.message;
29+
feedbackEmit.error(
30+
`Autolagring av oversettelser feilet. Prøv å laste siden på nytt og forsøk å publisere på nytt. ${message}`,
31+
);
32+
return;
33+
}
34+
}
35+
await publishForm(form, languageCodes);
36+
};
37+
1638
return (
1739
<ConfirmationModal
1840
open={open}
19-
onConfirm={() => publishForm(form, languageCodes)}
41+
onConfirm={handlePublish}
2042
onClose={onClose}
2143
texts={{
2244
title: 'Publiseringsadvarsel',

Diff for: packages/bygger/src/Forms/publish/PublishModalComponents.tsx

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { ConfirmationModal, useModal } from '@navikt/skjemadigitalisering-shared-components';
22
import { Form, navFormUtils } from '@navikt/skjemadigitalisering-shared-domain';
3-
import { useEffect, useState } from 'react';
3+
import { useEffect, useMemo, useState } from 'react';
4+
import { useFormTranslations } from '../../context/translations/FormTranslationsContext';
5+
import { useGlobalTranslations } from '../../context/translations/GlobalTranslationsContext';
6+
import { generateAndPopulateTranslationsForForm } from '../../translations/utils/editFormTranslationsUtils';
47
import LockedFormModal from '../lockedFormModal/LockedFormModal';
58
import ConfirmPublishModal from './ConfirmPublishModal';
69
import PublishSettingsModal from './PublishSettingsModal';
@@ -27,6 +30,8 @@ const PublishModalComponents = ({
2730
const [userMessageModal, setUserMessageModal] = useModal();
2831
const [lockedFormModal, setLockedFormModal] = useModal();
2932
const [selectedLanguageCodeList, setSelectedLanguageCodeList] = useState<string[]>([]);
33+
const { storedTranslations: globalTranslations, isReady: isFormTranslationsReady } = useGlobalTranslations();
34+
const { storedTranslations: formTranslations, isReady: isGlobalTranslationsReady } = useFormTranslations();
3035
const isLockedForm = !!form.lock;
3136

3237
useEffect(() => {
@@ -53,6 +58,16 @@ const PublishModalComponents = ({
5358
setLockedFormModal,
5459
]);
5560

61+
const unsavedGlobalTranslations = useMemo(
62+
() =>
63+
isFormTranslationsReady && isGlobalTranslationsReady
64+
? generateAndPopulateTranslationsForForm(form, {}, globalTranslations).filter(
65+
(translation) => !formTranslations[translation.nb ?? translation.key],
66+
)
67+
: [],
68+
[form, formTranslations, globalTranslations, isFormTranslationsReady, isGlobalTranslationsReady],
69+
);
70+
5671
return (
5772
<>
5873
<PublishSettingsModal
@@ -63,12 +78,14 @@ const PublishModalComponents = ({
6378
setSelectedLanguageCodeList(languageCodes);
6479
}}
6580
form={form}
81+
unsavedGlobalTranslations={unsavedGlobalTranslations}
6682
/>
6783
<ConfirmPublishModal
6884
open={openConfirmPublishModal}
6985
onClose={() => setOpenConfirmPublishModal(false)}
7086
form={form}
7187
publishLanguageCodeList={selectedLanguageCodeList}
88+
unsavedGlobalTranslations={unsavedGlobalTranslations}
7289
/>
7390
<ConfirmationModal
7491
open={userMessageModal}

Diff for: packages/bygger/src/Forms/publish/PublishSettingsModal.tsx

+18-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { Alert, Checkbox, CheckboxGroup, Heading } from '@navikt/ds-react';
22
import { ConfirmationModal, i18nUtils, makeStyles } from '@navikt/skjemadigitalisering-shared-components';
3-
import { Form, I18nTranslations } from '@navikt/skjemadigitalisering-shared-domain';
3+
import { Form, FormsApiFormTranslation, I18nTranslations } from '@navikt/skjemadigitalisering-shared-domain';
44
import { useEffect, useState } from 'react';
55
import { useFormTranslations } from '../../context/translations/FormTranslationsContext';
6+
import { useGlobalTranslations } from '../../context/translations/GlobalTranslationsContext';
67
import { getFormTextsWithoutCountryNames } from '../../translations/utils/formTextsUtils';
78
import FormStatus from '../status/FormStatus';
89
import { allLanguagesInNorwegian } from '../status/PublishedLanguages';
@@ -29,6 +30,7 @@ interface Props {
2930
open: boolean;
3031
onClose: () => void;
3132
onConfirm: (languageCodes: string[]) => void;
33+
unsavedGlobalTranslations: FormsApiFormTranslation[];
3234
}
3335

3436
export const getCompleteTranslationLanguageCodeList = (
@@ -52,8 +54,9 @@ export const getCompleteTranslationLanguageCodeList = (
5254
return completeTranslationList;
5355
};
5456

55-
const PublishSettingsModal = ({ open, onClose, onConfirm, form }: Props) => {
56-
const { translations } = useFormTranslations();
57+
const PublishSettingsModal = ({ open, onClose, onConfirm, form, unsavedGlobalTranslations }: Props) => {
58+
const { translations: formTranslations } = useFormTranslations();
59+
const { translations: globalTranslations } = useGlobalTranslations();
5760
const [allFormOriginalTexts, setAllFormOriginalTexts] = useState<string[]>([]);
5861
const [completeTranslationLanguageCodeList, setCompleteTranslationLanguageCodeList] = useState<string[]>([]);
5962
const [checkedLanguages, setCheckedLanguages] = useState<string[]>([]);
@@ -67,14 +70,23 @@ const PublishSettingsModal = ({ open, onClose, onConfirm, form }: Props) => {
6770
}, [form]);
6871

6972
useEffect(() => {
70-
const i18n = i18nUtils.mapFormsApiTranslationsToI18n(translations);
71-
const completeTranslations = getCompleteTranslationLanguageCodeList(allFormOriginalTexts, i18n);
73+
const i18n = i18nUtils.mapFormsApiTranslationsToI18n([...formTranslations]);
74+
const skipWhenCheckingForCompleteTranslations = unsavedGlobalTranslations.map((translation) => translation.key);
75+
const originalTextsExcludingUnsavedGlobalTranslations = allFormOriginalTexts.filter(
76+
(text) => !skipWhenCheckingForCompleteTranslations.includes(text),
77+
);
78+
79+
const completeTranslations = getCompleteTranslationLanguageCodeList(
80+
originalTextsExcludingUnsavedGlobalTranslations,
81+
i18n,
82+
);
83+
7284
const sanitizedCompleteTranslations = completeTranslations
7385
.map((langCode) => (langCode.length > 2 ? langCode.substring(0, 2) : langCode))
7486
.filter(skipBokmal);
7587
setCompleteTranslationLanguageCodeList([...sanitizedCompleteTranslations, 'nb']);
7688
setCheckedLanguages([...sanitizedCompleteTranslations, 'nb']);
77-
}, [allFormOriginalTexts, translations]);
89+
}, [allFormOriginalTexts, formTranslations, globalTranslations, unsavedGlobalTranslations]);
7890

7991
const PublishStatusPanel = ({ form }: { form: Form }) => {
8092
const statusPanelStyles = useStatusPanelStyles();

Diff for: packages/bygger/src/translations/form/FormTranslationsPage.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ const FormTranslationsPage = ({ form }: Props) => {
3434

3535
const initialChanges = useMemo(() => {
3636
if (isTranslationsReady && isGlobalTranslationsReady) {
37-
return translations
38-
.map((row) => (row.globalTranslationId && !storedTranslations[row.key]?.globalTranslationId ? row : undefined))
39-
.filter((value) => !!value);
37+
return translations.filter(
38+
(translation) => translation.globalTranslationId && !storedTranslations[translation.key]?.globalTranslationId,
39+
);
4040
}
4141
}, [isGlobalTranslationsReady, isTranslationsReady, translations, storedTranslations]);
4242

0 commit comments

Comments
 (0)