Skip to content

Commit 2afc829

Browse files
Merge branch 'develop' into feature/FWF-5405-tab-designer-flow-history
2 parents c21b3a8 + 8b9737d commit 2afc829

File tree

10 files changed

+499
-20
lines changed

10 files changed

+499
-20
lines changed

.github/workflows/forms-flow-documents-ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ jobs:
7676
SKIP_IN_CI: "True"
7777
USE_DOCKER_MOCK: "True"
7878
JWT_OIDC_TEST_PRIVATE_KEY_PEM: ${{ secrets.JWT_OIDC_TEST_PRIVATE_KEY_PEM }}
79+
FORMIO_TEST_JWT_TOKEN: ${{ secrets.FORMIO_TEST_JWT_TOKEN}}
7980

8081
runs-on: ubuntu-24.04
8182
strategy:

forms-flow-api/tests/unit/api/test_form_process_mapper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1140,7 +1140,7 @@ def test_form_flow_builder_update_invalid_payload(app, client, session, jwt, moc
11401140
# Test with empty payload
11411141
payload = {}
11421142
response = client.put(f"/form/form-flow-builder/{mapper_id}", headers=headers, json=payload)
1143-
assert response.status_code == 200 # Empty payload should still return success
1143+
assert response.status_code == 400
11441144

11451145
# Test with invalid form data (missing _id)
11461146
# Form data must include _id for update

forms-flow-documents/sample.env

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ FORMSFLOW_API_CORS_ORIGINS=*
3636
##Env For Unit Testing
3737
## JWT_OIDC_TEST_PRIVATE_KEY_PEM=
3838
## FLASK_ENV=testing
39+
## FORMIO_TEST_JWT_TOKEN=
3940

4041
#FORMIO configuration
4142
FORMIO_DEFAULT_PROJECT_URL=http://{your-ip-address}:3001

forms-flow-documents/tests/conftest.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""Common setup and fixtures for the pytest suite used by this service."""
2+
import os
23
import time
34

45
import pytest
@@ -106,3 +107,13 @@ def get(self, key):
106107
return_value=mock_redis,
107108
) as _mock: # noqa
108109
yield mock_redis
110+
111+
112+
@pytest.fixture(autouse=True)
113+
def mock_formio_access_token():
114+
"""Mock formio access token."""
115+
with patch(
116+
"formsflow_api_utils.services.external.formio.FormioService.get_formio_access_token",
117+
return_value=os.getenv("FORMIO_TEST_JWT_TOKEN"),
118+
):
119+
yield

forms-flow-web/src/helper/routerHelper.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,30 @@ const navigateToResubmit = (dispatch, tenantId, formId, submissionId ) => {
6363
navigateTo(dispatch,`${getRoute(tenantId).FORM}/${formId}/submissions/${submissionId}/resubmit`);
6464
};
6565

66+
/* --------------------------- Process Creation Routes --------------------------- */
67+
const navigateToSubflowBuild = (dispatch, tenantId) => {
68+
navigateTo(dispatch, `${getRoute(tenantId).SUBFLOW}/build`);
69+
};
6670

71+
const navigateToDecisionTableBuild = (dispatch, tenantId) => {
72+
navigateTo(dispatch, `${getRoute(tenantId).DECISIONTABLE}/build`);
73+
};
6774

75+
const navigateToSubflowCreate = (dispatch, tenantId) => {
76+
navigateTo(dispatch, `${getRoute(tenantId).SUBFLOW}/create`);
77+
};
78+
79+
const navigateToDecisionTableCreate = (dispatch, tenantId) => {
80+
navigateTo(dispatch, `${getRoute(tenantId).DECISIONTABLE}/create`);
81+
};
82+
83+
const navigateToSubflowEdit = (dispatch, tenantId, processKey) => {
84+
navigateTo(dispatch, `${getRoute(tenantId).SUBFLOW}/edit/${processKey}`);
85+
};
86+
87+
const navigateToDecisionTableEdit = (dispatch, tenantId, processKey) => {
88+
navigateTo(dispatch, `${getRoute(tenantId).DECISIONTABLE}/edit/${processKey}`);
89+
};
6890

6991
export {
7092
navigateToDesignFormsListing,
@@ -79,4 +101,10 @@ export {
79101
navigateToDraftEdit,
80102
navigateToViewSubmission,
81103
navigateToResubmit,
104+
navigateToSubflowBuild,
105+
navigateToDecisionTableBuild,
106+
navigateToSubflowCreate,
107+
navigateToDecisionTableCreate,
108+
navigateToSubflowEdit,
109+
navigateToDecisionTableEdit,
82110
};

forms-flow-web/src/routes/Design/Forms/FlowEdit.js

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import React, {
77
} from "react";
88
import {
99
CustomButton,
10-
ConfirmModal,
11-
// HistoryPage,
10+
PromptModal,
1211
// HistoryModal,
1312
//CurlyBracketsIcon,
1413
VariableSelection,
@@ -344,19 +343,23 @@ const enableWorkflowChange = async () => {
344343
<>
345344
{/* <Card> */}
346345
<div>
347-
<ConfirmModal
346+
<PromptModal
348347
show={showDiscardModal}
349348
title={t(`Discard Flow Changes?`)}
350349
message={t(
351350
"Are you sure you want to discard all unsaved changes to the flow of the form?"
352351
)}
353-
messageSecondary={t("This action cannot be undone.")}
354352
primaryBtnAction={handleDiscardConfirm}
355353
onClose={handleDiscardModal}
356354
primaryBtnText={t("Yes, Discard All Unsaved Changes")}
357355
secondaryBtnText={t("No, Keep The Changes")}
358356
secondaryBtnAction={handleDiscardModal}
359-
size="sm"
357+
type="warning"
358+
size="md"
359+
primaryBtndataTestid="discard-confirm-button"
360+
secondoryBtndataTestid="discard-cancel-button"
361+
primaryBtnariaLabel={t("Yes, Discard All Unsaved Changes")}
362+
secondoryBtnariaLabel={t("No, Keep The Changes")}
360363
/>
361364
{/* <div className="head">
362365
{createDesigns && (
@@ -409,9 +412,10 @@ const enableWorkflowChange = async () => {
409412
{/* </Card> */}
410413
</div>
411414
{showMigrationModal && (
412-
<ConfirmModal
415+
<PromptModal
413416
show={showMigrationModal}
414417
title={t("***Migration Notice***")}
418+
size="lg"
415419
message={
416420
<div>
417421
<div className="message-primary mb-3">
@@ -458,7 +462,6 @@ const enableWorkflowChange = async () => {
458462
</div>
459463
}
460464
primaryBtnDisable={!isMigrationChecked}
461-
messageSecondary={null} // You can set this to `null` or remove it entirely if unused
462465
primaryBtnAction={handleMigration}
463466
onClose={handleCloseMigration}
464467
primaryBtnText={t(
@@ -467,7 +470,13 @@ const enableWorkflowChange = async () => {
467470
secondaryBtnText={t("Cancel")}
468471
secondaryBtnAction={handleCloseMigration}
469472
buttonLoading={isMigrationLoading}
470-
size="sm"
473+
type="info"
474+
primaryBtndataTestid="migration-confirm-button"
475+
secondoryBtndataTestid="migration-cancel-button"
476+
primaryBtnariaLabel={t(
477+
"Link this form that will keep the current flow and its history"
478+
)}
479+
secondoryBtnariaLabel={t("Cancel")}
471480
/>
472481
)}
473482

forms-flow-web/src/routes/Design/Process/ProcessCreateEdit.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ import {
2020
createNewDecision,
2121
} from "../../../components/Modeler/helpers/helper";
2222
import {
23-
ConfirmModal,
24-
ErrorModal,
25-
HistoryModal,
23+
PromptModal,
24+
HistoryPage,
2625
V8CustomButton,
2726
FormStatusIcon
2827
} from "@formsflow/components";
@@ -632,17 +631,21 @@ const ProcessCreateEdit = ({ type }) => {
632631
return (
633632
<div>
634633
<NavigateBlocker isBlock={isWorkflowChanged} message={"You have made changes that are not saved yet"} />
635-
<ConfirmModal
634+
<PromptModal
636635
show={showConfirmModal}
637636
title={modalContent.title}
638637
message={modalContent.message}
639-
messageSecondary={modalContent.messageSecondary || ""}
640638
primaryBtnAction={modalContent.primaryBtnAction}
641639
onClose={closeModal}
642640
secondaryBtnAction={modalContent.secondaryBtnAction}
643641
primaryBtnText={modalContent.primaryBtnText}
644642
secondaryBtnText={modalContent.secondaryBtnText}
645-
size="md"
643+
type="warning"
644+
size={modalType === "unpublish" ? "lg" : "md"}
645+
primaryBtndataTestid="confirm-primary-button"
646+
secondoryBtndataTestid="confirm-secondary-button"
647+
primaryBtnariaLabel={modalContent.primaryBtnText}
648+
secondoryBtnariaLabel={modalContent.secondaryBtnText}
646649
/>
647650

648651
<div className="header-section-1">
@@ -745,16 +748,20 @@ const ProcessCreateEdit = ({ type }) => {
745748
errorMessage={exportError}
746749
/>
747750
{showErrorModal && (
748-
<ErrorModal
751+
<PromptModal
749752
show={showErrorModal}
750753
onClose={handleCloseErrorModal}
751754
title={t("Error(s)")}
752755
message={errorMessage}
753756
primaryBtnAction={handleCloseErrorModal}
754757
primaryBtnText={t("Dismiss")}
758+
size="lg"
759+
type="error"
760+
primaryBtndataTestid="error-dismiss-button"
761+
primaryBtnariaLabel={t("Dismiss")}
755762
/>
756763
)}
757-
<HistoryModal
764+
<HistoryPage
758765
show={activeTab.secondary === 'history'}
759766
onClose={() => handleTabClick('layout')}
760767
title={t("History")}

0 commit comments

Comments
 (0)