Skip to content

Commit 2545027

Browse files
committed
Merge branch 'r/17.x' into r/18.x
2 parents 8c939c3 + c0aa2de commit 2545027

8 files changed

Lines changed: 44 additions & 24 deletions

File tree

src/components/events/partials/ModalTabsAndPages/EventDetailsSchedulingTab.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ const EventDetailsSchedulingTab = ({
306306
dateFormat="P"
307307
popperClassName="datepicker-custom"
308308
className="datepicker-custom-input"
309-
portalId="root"
309+
wrapperClassName="datepicker-custom-wrapper"
310310
locale={currentLanguage?.dateLocale}
311311
strictParsing
312312
/>

src/components/events/partials/ModalTabsAndPages/NewAccessPage.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import ModalContentTable from "../../../shared/modals/ModalContentTable";
2424
* This component renders the access page for new events and series in the wizards.
2525
*/
2626
interface RequiredFormProps {
27-
isPartOf: string,
27+
'dublincore/episode_isPartOf': string,
2828
policies: TransformedAcl[],
2929
aclTemplate: string,
3030
// theme: string,
@@ -76,14 +76,15 @@ const NewAccessPage = <T extends RequiredFormProps>({
7676

7777
// If we have to use series ACL, fetch it
7878
useEffect(() => {
79-
if (initEventAclWithSeriesAcl && formik.values.isPartOf) {
80-
dispatch(fetchSeriesDetailsAcls(formik.values.isPartOf));
79+
if (initEventAclWithSeriesAcl && formik.values['dublincore/episode_isPartOf']) {
80+
dispatch(fetchSeriesDetailsAcls(formik.values['dublincore/episode_isPartOf']));
8181
}
82-
}, [formik.values.isPartOf, initEventAclWithSeriesAcl, dispatch]);
82+
// eslint-disable-next-line react-hooks/exhaustive-deps
83+
}, [formik.values['dublincore/episode_isPartOf'], initEventAclWithSeriesAcl, dispatch]);
8384

8485
// If we have to use series ACL, overwrite existing rules
8586
useEffect(() => {
86-
if (initEventAclWithSeriesAcl && formik.values.isPartOf && seriesAcl) {
87+
if (initEventAclWithSeriesAcl && formik.values['dublincore/episode_isPartOf'] && seriesAcl) {
8788
formik.setFieldValue("acls", seriesAcl);
8889
}
8990
// eslint-disable-next-line react-hooks/exhaustive-deps

src/components/events/partials/ModalTabsAndPages/NewSourcePage.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,8 @@ const Upload = <T extends RequiredFormPropsUpload>({
322322
{/* One row for each metadata field*/}
323323
{sourceMetadata.UPLOAD && sourceMetadata.UPLOAD.metadata.map((field, key) => (
324324
<tr key={key}>
325-
<td>
325+
{/* Set fixed width to prevent date picker from opening twice */}
326+
<td style={{ width: "20%" }}>
326327
<span>{t(field.label as ParseKeys)}</span>
327328
{field.required && <i className="required">*</i>}
328329
</td>
@@ -427,7 +428,7 @@ const Schedule = <T extends {
427428
dateFormat="P"
428429
popperClassName="datepicker-custom"
429430
className="datepicker-custom-input"
430-
portalId="root"
431+
wrapperClassName="datepicker-custom-wrapper"
431432
locale={currentLanguage?.dateLocale}
432433
strictParsing
433434
/>
@@ -458,7 +459,7 @@ const Schedule = <T extends {
458459
dateFormat="P"
459460
popperClassName="datepicker-custom"
460461
className="datepicker-custom-input"
461-
portalId="root"
462+
wrapperClassName="datepicker-custom-wrapper"
462463
locale={currentLanguage?.dateLocale}
463464
strictParsing
464465
/>

src/components/events/partials/modals/EventDetails.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { useEffect } from "react";
22
import { useTranslation } from "react-i18next";
33
import cn from "classnames";
4-
import { hasAccess } from "../../../../utils/utils";
4+
import { confirmUnsaved, hasAccess } from "../../../../utils/utils";
55
import EventDetailsCommentsTab from "../ModalTabsAndPages/EventDetailsCommentsTab";
66
import EventDetailsAccessPolicyTab from "../ModalTabsAndPages/EventDetailsAccessPolicyTab";
77
import EventDetailsWorkflowTab from "../ModalTabsAndPages/EventDetailsWorkflowTab";
@@ -218,8 +218,16 @@ const EventDetails = ({
218218
];
219219

220220
const openTab = (tabNr: EventDetailsPage) => {
221-
dispatch(removeNotificationWizardForm());
222-
dispatch(openModalTab(tabNr, "workflow-details", "entry"));
221+
let isUnsavedChanges = false;
222+
isUnsavedChanges = policyChanged;
223+
if (formikRef.current && formikRef.current.dirty !== undefined && formikRef.current.dirty) {
224+
isUnsavedChanges = true;
225+
}
226+
227+
if (!isUnsavedChanges || confirmUnsaved(t)) {
228+
dispatch(removeNotificationWizardForm());
229+
dispatch(openModalTab(tabNr, "workflow-details", "entry"));
230+
}
223231
};
224232

225233
return (

src/components/events/partials/modals/EventDetailsModal.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { getModalEvent } from "../../../../selectors/eventDetailsSelectors";
77
import { setModalEvent, setShowModal } from "../../../../slices/eventDetailsSlice";
88
import { Modal } from "../../../shared/modals/Modal";
99
import { FormikProps } from "formik";
10+
import { confirmUnsaved } from "../../../../utils/utils";
1011

1112
/**
1213
* This component renders the modal for displaying event details
@@ -21,10 +22,6 @@ const EventDetailsModal = () => {
2122

2223
const event = useAppSelector(state => getModalEvent(state))!;
2324

24-
const confirmUnsaved = () => {
25-
return window.confirm(t("CONFIRMATIONS.WARNINGS.UNSAVED_CHANGES"));
26-
};
27-
2825
const hideModal = () => {
2926
dispatch(setModalEvent(null));
3027
dispatch(setShowModal(false));
@@ -37,7 +34,7 @@ const EventDetailsModal = () => {
3734
isUnsavedChanges = true;
3835
}
3936

40-
if (!isUnsavedChanges || confirmUnsaved()) {
37+
if (!isUnsavedChanges || confirmUnsaved(t)) {
4138
setPolicyChanged(false);
4239
dispatch(removeNotificationWizardForm());
4340
hideModal();

src/components/events/partials/modals/SeriesDetails.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
hasStatistics as seriesHasStatistics,
1212
} from "../../../../selectors/seriesDetailsSelectors";
1313
import { getOrgProperties, getUserInformation } from "../../../../selectors/userInfoSelectors";
14-
import { hasAccess } from "../../../../utils/utils";
14+
import { confirmUnsaved, hasAccess } from "../../../../utils/utils";
1515
import SeriesDetailsAccessTab from "../ModalTabsAndPages/SeriesDetailsAccessTab";
1616
import SeriesDetailsThemeTab from "../ModalTabsAndPages/SeriesDetailsThemeTab";
1717
import SeriesDetailsStatisticTab from "../ModalTabsAndPages/SeriesDetailsStatisticTab";
@@ -113,7 +113,15 @@ const SeriesDetails = ({
113113
];
114114

115115
const openTab = (tabNr: number) => {
116-
setPage(tabNr);
116+
let isUnsavedChanges = false;
117+
isUnsavedChanges = policyChanged;
118+
if (formikRef.current && formikRef.current.dirty !== undefined && formikRef.current.dirty) {
119+
isUnsavedChanges = true;
120+
}
121+
122+
if (!isUnsavedChanges || confirmUnsaved(t)) {
123+
setPage(tabNr);
124+
}
117125
};
118126

119127
return (
@@ -139,6 +147,7 @@ const SeriesDetails = ({
139147
metadata={[metadataFields]}
140148
updateResource={updateSeriesMetadata}
141149
editAccessRole="ROLE_UI_SERIES_DETAILS_METADATA_EDIT"
150+
formikRef={formikRef}
142151
header={tabs[page].tabNameTranslation}
143152
formikRef={formikRef}
144153
/>

src/components/events/partials/modals/SeriesDetailsModal.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import SeriesDetails from "./SeriesDetails";
44
import { removeNotificationWizardForm } from "../../../../slices/notificationSlice";
55
import { useAppDispatch } from "../../../../store";
66
import { Modal, ModalHandle } from "../../../shared/modals/Modal";
7+
import { confirmUnsaved } from "../../../../utils/utils";
78
import { FormikProps } from "formik";
89

910
/**
@@ -25,18 +26,14 @@ const SeriesDetailsModal = ({
2526
const [policyChanged, setPolicyChanged] = useState(false);
2627
const formikRef = useRef<FormikProps<any>>(null);
2728

28-
const confirmUnsaved = () => {
29-
return window.confirm(t("CONFIRMATIONS.WARNINGS.UNSAVED_CHANGES"));
30-
};
31-
3229
const close = () => {
3330
let isUnsavedChanges = false;
3431
isUnsavedChanges = policyChanged;
3532
if (formikRef.current && formikRef.current.dirty !== undefined && formikRef.current.dirty) {
3633
isUnsavedChanges = true;
3734
}
3835

39-
if (!isUnsavedChanges || confirmUnsaved()) {
36+
if (!isUnsavedChanges || confirmUnsaved(t)) {
4037
setPolicyChanged(false);
4138
dispatch(removeNotificationWizardForm());
4239
return true;

src/utils/utils.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,4 +146,11 @@ export const translateOverrideFallback = (asset: UploadOption, t: TFunction, suf
146146
}
147147

148148
return result;
149+
}
150+
151+
/**
152+
* Have the browser show a warning dialog for unsaved changes
153+
*/
154+
export const confirmUnsaved = (t: TFunction) => {
155+
return window.confirm(t("CONFIRMATIONS.WARNINGS.UNSAVED_CHANGES"));
149156
};

0 commit comments

Comments
 (0)