diff --git a/modules/data-entry/src/main/frontend/src/questionnaire/FormPagination.jsx b/modules/data-entry/src/main/frontend/src/questionnaire/FormPagination.jsx index f7e73f7bff..e66c425496 100644 --- a/modules/data-entry/src/main/frontend/src/questionnaire/FormPagination.jsx +++ b/modules/data-entry/src/main/frontend/src/questionnaire/FormPagination.jsx @@ -77,13 +77,25 @@ function FormPagination (props) { let [ activePage, setActivePage ] = useState(0); let [ direction, setDirection ] = useState(1); let [ nextActivePage, setNextActivePage ] = useState(); + let [ numberOfSteps, setNumberOfSteps ] = useState(); + let [ activeStep, setActiveStep ] = useState(); + let [ progress, setProgress ] = useState(0); const DIRECTION_NEXT = 1, DIRECTION_PREV = -1; + // The amount of the progress bar that should be complete on page 1 + // Expressed as a multiple of a normal page size. + // The remainder (1 - stub size) will be used as a completion buffer on the last page + const INITIAL_PROGRESS_STUB = 0.7; let previousEntryType; let questionIndex = 0; let pagesResults = {}; let pagesArray = []; + useEffect(() => { + setNumberOfSteps(pages.filter(page => page.canBeVisible).length); + setActiveStep(pages.slice(0, activePage).filter(page => page.canBeVisible).length); + }, [activePage, pages]) + useEffect(() => { setPagesCallback(null); Object.entries(questionnaireData) @@ -207,6 +219,17 @@ function FormPagination (props) { } }, [saveInProgress, pendingSubmission, disableProgress, nextActivePage, direction, activePage]); + useEffect(() => { + if (activeStep != null && numberOfSteps != null) { + // The MaterialUI progress bar expects progress to be out of 100 + const pageSize = 100 / (numberOfSteps); + // Use some of 1 "page" worth of progression for the initial stub on the first page + // The rest will be used for the completion buffer on the last page + const stubSize = pageSize * INITIAL_PROGRESS_STUB; + setProgress(stubSize + (pageSize * activeStep) + (savedLastPage ? pageSize - stubSize : 0)) + } + }, [activeStep, numberOfSteps, savedLastPage]) + let saveButton =