From b8fd6f79f730c7e54dd5fb91a39e8aae44de05ea Mon Sep 17 00:00:00 2001 From: Jakob Ackermann Date: Mon, 27 Sep 2021 12:45:04 +0200 Subject: [PATCH] Merge pull request #5190 from overleaf/jpa-sso-oauth-de-ng [web] de-ng sso/oauth/institutional account linking pages GitOrigin-RevId: 50718cefff68142431aa411cb4f8644a3d8ab93f --- .../js/features/form-helpers/hydrate-form.js | 55 +++++++++++-------- .../js/features/link-helpers/slow-link.js | 5 ++ .../js/features/multi-submit/index.js | 14 +++++ .../js/features/utils/disableElement.js | 9 +++ services/web/frontend/js/marketing.js | 1 + 5 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 services/web/frontend/js/features/multi-submit/index.js create mode 100644 services/web/frontend/js/features/utils/disableElement.js diff --git a/services/web/frontend/js/features/form-helpers/hydrate-form.js b/services/web/frontend/js/features/form-helpers/hydrate-form.js index c76b0a6df7..8e53119f3a 100644 --- a/services/web/frontend/js/features/form-helpers/hydrate-form.js +++ b/services/web/frontend/js/features/form-helpers/hydrate-form.js @@ -2,6 +2,7 @@ import classNames from 'classnames' import { FetchError, postJSON } from '../../infrastructure/fetch-json' import { validateCaptchaV2 } from './captcha' import inputValidator from './input-validator' +import { disableElement, enableElement } from '../utils/disableElement' // Form helper(s) to handle: // - Attaching to the relevant form elements @@ -122,16 +123,12 @@ export function inflightHelper(el) { const showWhenInflight = el.querySelectorAll('[data-ol-inflight="pending"]') el.addEventListener('pending', () => { - disabledInflight.forEach(el => { - el.disabled = true - }) + disabledInflight.forEach(disableElement) toggleDisplay(showWhenNotInflight, showWhenInflight) }) el.addEventListener('idle', () => { - disabledInflight.forEach(el => { - el.disabled = false - }) + disabledInflight.forEach(enableElement) toggleDisplay(showWhenInflight, showWhenNotInflight) }) } @@ -146,20 +143,7 @@ function formSentHelper(el) { }) } -export function toggleDisplay(hide, show) { - hide.forEach(el => { - el.hidden = true - }) - show.forEach(el => { - el.hidden = false - }) -} - -export function hydrateForm(el) { - formSubmitHelper(el) - inflightHelper(el) - formSentHelper(el) - +function formValidationHelper(el) { el.querySelectorAll('input').forEach(inputEl => { if ( inputEl.willValidate && @@ -170,6 +154,31 @@ export function hydrateForm(el) { }) } -document - .querySelectorAll(`[data-ol-async-form]`) - .forEach(form => hydrateForm(form)) +export function toggleDisplay(hide, show) { + hide.forEach(el => { + el.hidden = true + }) + show.forEach(el => { + el.hidden = false + }) +} + +function hydrateAsyncForm(el) { + formSubmitHelper(el) + inflightHelper(el) + formSentHelper(el) + formValidationHelper(el) +} + +function hydrateRegularForm(el) { + inflightHelper(el) + formValidationHelper(el) + + el.addEventListener('submit', () => { + el.dispatchEvent(new Event('pending')) + }) +} + +document.querySelectorAll(`[data-ol-async-form]`).forEach(hydrateAsyncForm) + +document.querySelectorAll(`[data-ol-regular-form]`).forEach(hydrateRegularForm) diff --git a/services/web/frontend/js/features/link-helpers/slow-link.js b/services/web/frontend/js/features/link-helpers/slow-link.js index 501a6ce796..2f40d680cf 100644 --- a/services/web/frontend/js/features/link-helpers/slow-link.js +++ b/services/web/frontend/js/features/link-helpers/slow-link.js @@ -1,8 +1,13 @@ import { inflightHelper } from '../form-helpers/hydrate-form' +import { disableElement } from '../utils/disableElement' function setup(el) { + // Make the element discoverable for multi-submit. + el.setAttribute('data-ol-disabled-inflight', '') + inflightHelper(el) el.addEventListener('click', function () { + disableElement(el) el.dispatchEvent(new Event('pending')) }) } diff --git a/services/web/frontend/js/features/multi-submit/index.js b/services/web/frontend/js/features/multi-submit/index.js new file mode 100644 index 0000000000..039acc8aa4 --- /dev/null +++ b/services/web/frontend/js/features/multi-submit/index.js @@ -0,0 +1,14 @@ +import { disableElement } from '../utils/disableElement' + +document.querySelectorAll('[data-ol-multi-submit]').forEach(el => { + function onSubmit() { + el.querySelectorAll('[data-ol-disabled-inflight]').forEach(disableElement) + } + function setup(childEl) { + childEl.addEventListener('pending', onSubmit) + } + el.querySelectorAll('[data-ol-regular-form]').forEach(setup) + el.querySelectorAll('[data-ol-slow-link]').forEach(setup) + // NOTE: data-ol-async-form is not added explicitly as of now. + // Managing the return to idle is tricky and we can look into that later. +}) diff --git a/services/web/frontend/js/features/utils/disableElement.js b/services/web/frontend/js/features/utils/disableElement.js new file mode 100644 index 0000000000..a60f1e9b98 --- /dev/null +++ b/services/web/frontend/js/features/utils/disableElement.js @@ -0,0 +1,9 @@ +export function disableElement(el) { + el.setAttribute('disabled', '') + el.setAttribute('aria-disabled', 'true') +} + +export function enableElement(el) { + el.removeAttribute('disabled') + el.removeAttribute('aria-disabled') +} diff --git a/services/web/frontend/js/marketing.js b/services/web/frontend/js/marketing.js index 957410d7a8..8aa97e710e 100644 --- a/services/web/frontend/js/marketing.js +++ b/services/web/frontend/js/marketing.js @@ -5,5 +5,6 @@ import './features/form-helpers/hydrate-form' import './features/link-helpers/slow-link' import './features/contact-form' import './features/event-tracking' +import './features/multi-submit' $('[data-ol-lang-selector-tooltip]').tooltip({ trigger: 'hover' })