1
0
mirror of https://gitlab.nic.cz/turris/reforis/foris-js.git synced 2024-11-14 17:35:35 +01:00

Update Bootstrap library to version 5.3.x

This commit is contained in:
Aleksandr Gumroian 2024-04-19 16:09:03 +02:00
parent 96785f0774
commit c008d7bcc7
No known key found for this signature in database
GPG Key ID: 9E77849C64F0A733
16 changed files with 120 additions and 141 deletions

78
package-lock.json generated
View File

@ -22,11 +22,11 @@
"@babel/plugin-transform-runtime": "^7.9.0", "@babel/plugin-transform-runtime": "^7.9.0",
"@babel/preset-env": "^7.9.0", "@babel/preset-env": "^7.9.0",
"@babel/preset-react": "^7.9.4", "@babel/preset-react": "^7.9.4",
"@fortawesome/fontawesome-free": "^5.13.0", "@fortawesome/fontawesome-free": "^6.5.2",
"@testing-library/react": "^8.0.9", "@testing-library/react": "^8.0.9",
"babel-loader": "^8.1.0", "babel-loader": "^8.1.0",
"babel-polyfill": "^6.26.0", "babel-polyfill": "^6.26.0",
"bootstrap": "^4.6.2", "bootstrap": "^5.3.3",
"css-loader": "^5.2.4", "css-loader": "^5.2.4",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"eslint-config-prettier": "^6.11.0", "eslint-config-prettier": "^6.11.0",
@ -47,7 +47,7 @@
"webpack": "^5.68.0" "webpack": "^5.68.0"
}, },
"peerDependencies": { "peerDependencies": {
"bootstrap": "^4.6.2", "bootstrap": "^5.3.3",
"prop-types": "15.8.1", "prop-types": "15.8.1",
"react": "16.9.0", "react": "16.9.0",
"react-dom": "16.9.0", "react-dom": "16.9.0",
@ -1822,9 +1822,9 @@
} }
}, },
"node_modules/@fortawesome/fontawesome-free": { "node_modules/@fortawesome/fontawesome-free": {
"version": "5.15.3", "version": "6.5.2",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.2.tgz",
"integrity": "sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w==", "integrity": "sha512-hRILoInAx8GNT5IMkrtIt9blOdrqHOnPBH+k70aWUAqPZPgopb9G5EQJFpaBx/S8zp2fC+mPW349Bziuk1o28Q==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"engines": { "engines": {
@ -2814,9 +2814,9 @@
} }
}, },
"node_modules/@popperjs/core": { "node_modules/@popperjs/core": {
"version": "2.11.2", "version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"dev": true, "dev": true,
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
@ -4330,9 +4330,9 @@
} }
}, },
"node_modules/bootstrap": { "node_modules/bootstrap": {
"version": "4.6.2", "version": "5.3.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz",
"integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -4345,8 +4345,7 @@
} }
], ],
"peerDependencies": { "peerDependencies": {
"jquery": "1.9.1 - 3", "@popperjs/core": "^2.11.8"
"popper.js": "^1.16.1"
} }
}, },
"node_modules/brace-expansion": { "node_modules/brace-expansion": {
@ -11673,13 +11672,6 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/jquery": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==",
"dev": true,
"peer": true
},
"node_modules/js-tokens": { "node_modules/js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -13791,18 +13783,6 @@
"integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
"dev": true "dev": true
}, },
"node_modules/popper.js": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
"integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
"deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
"dev": true,
"peer": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/portfinder": { "node_modules/portfinder": {
"version": "1.0.28", "version": "1.0.28",
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
@ -20398,9 +20378,9 @@
} }
}, },
"@fortawesome/fontawesome-free": { "@fortawesome/fontawesome-free": {
"version": "5.15.3", "version": "6.5.2",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.2.tgz",
"integrity": "sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w==", "integrity": "sha512-hRILoInAx8GNT5IMkrtIt9blOdrqHOnPBH+k70aWUAqPZPgopb9G5EQJFpaBx/S8zp2fC+mPW349Bziuk1o28Q==",
"dev": true "dev": true
}, },
"@gar/promisify": { "@gar/promisify": {
@ -21165,9 +21145,9 @@
} }
}, },
"@popperjs/core": { "@popperjs/core": {
"version": "2.11.2", "version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"dev": true "dev": true
}, },
"@sheerun/mutationobserver-shim": { "@sheerun/mutationobserver-shim": {
@ -22452,9 +22432,9 @@
} }
}, },
"bootstrap": { "bootstrap": {
"version": "4.6.2", "version": "5.3.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz",
"integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==",
"dev": true, "dev": true,
"requires": {} "requires": {}
}, },
@ -28040,13 +28020,6 @@
} }
} }
}, },
"jquery": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==",
"dev": true,
"peer": true
},
"js-tokens": { "js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -29672,13 +29645,6 @@
"integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
"dev": true "dev": true
}, },
"popper.js": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
"integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
"dev": true,
"peer": true
},
"portfinder": { "portfinder": {
"version": "1.0.28", "version": "1.0.28",
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",

View File

@ -22,7 +22,7 @@
"react-uid": "^2.2.0" "react-uid": "^2.2.0"
}, },
"peerDependencies": { "peerDependencies": {
"bootstrap": "^4.6.2", "bootstrap": "^5.3.3",
"prop-types": "15.8.1", "prop-types": "15.8.1",
"react": "16.9.0", "react": "16.9.0",
"react-dom": "16.9.0", "react-dom": "16.9.0",
@ -34,11 +34,11 @@
"@babel/plugin-transform-runtime": "^7.9.0", "@babel/plugin-transform-runtime": "^7.9.0",
"@babel/preset-env": "^7.9.0", "@babel/preset-env": "^7.9.0",
"@babel/preset-react": "^7.9.4", "@babel/preset-react": "^7.9.4",
"@fortawesome/fontawesome-free": "^5.13.0", "@fortawesome/fontawesome-free": "^6.5.2",
"@testing-library/react": "^8.0.9", "@testing-library/react": "^8.0.9",
"babel-loader": "^8.1.0", "babel-loader": "^8.1.0",
"babel-polyfill": "^6.26.0", "babel-polyfill": "^6.26.0",
"bootstrap": "^4.6.2", "bootstrap": "^5.3.3",
"css-loader": "^5.2.4", "css-loader": "^5.2.4",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"eslint-config-prettier": "^6.11.0", "eslint-config-prettier": "^6.11.0",

View File

@ -38,16 +38,17 @@ Alert.defaultProps = {
export function Alert({ type, onDismiss, children }) { export function Alert({ type, onDismiss, children }) {
return ( return (
<div <div
className={`alert ${ className={`alert alert-${type} ${
onDismiss ? "alert-dismissible" : "" onDismiss ? "alert-dismissible" : ""
} alert-${type}`} }`.trim()}
> >
{onDismiss ? ( {onDismiss && (
<button type="button" className="close" onClick={onDismiss}> <button
&times; type="button"
</button> className="btn-close"
) : ( onClick={onDismiss}
false aria-label={_("Close")}
/>
)} )}
{children} {children}
</div> </div>

View File

@ -33,7 +33,7 @@ export function Button({
}) { }) {
let buttonClass = className ? `btn ${className}` : "btn btn-primary"; let buttonClass = className ? `btn ${className}` : "btn btn-primary";
if (forisFormSize) { if (forisFormSize) {
buttonClass = `${buttonClass} col-sm-12 col-md-3 col-lg-2`; buttonClass = `${buttonClass} col-12 col-md-3 col-lg-2`;
} }
return ( return (
@ -44,7 +44,7 @@ export function Button({
> >
{loading && ( {loading && (
<span <span
className="spinner-border spinner-border-sm mr-1" className="spinner-border spinner-border-sm me-1"
role="status" role="status"
aria-hidden="true" aria-hidden="true"
/> />

View File

@ -24,25 +24,24 @@ CheckBox.defaultProps = {
export function CheckBox({ label, helpText, disabled, ...props }) { export function CheckBox({ label, helpText, disabled, ...props }) {
const uid = useUID(); const uid = useUID();
return ( return (
<div className="form-group"> <div className="mb-3 form-check">
<div className="custom-control custom-checkbox ">
<input <input
className="custom-control-input" className="form-check-input"
type="checkbox" type="checkbox"
id={uid} id={uid}
disabled={disabled} disabled={disabled}
{...props} {...props}
/> />
<label className="custom-control-label" htmlFor={uid}> <label className="form-check-label" htmlFor={uid}>
{label} {label}
{helpText && (
<small className="form-text text-muted">
{helpText}
</small>
)}
</label> </label>
{helpText && (
<div className="form-text">
<small>{helpText}</small>
</div> </div>
)}
</div> </div>
); );
} }

View File

@ -32,13 +32,16 @@ export const Input = forwardRef(
}`.trim(); }`.trim();
return ( return (
<div className="form-group"> <div className="mb-3">
<label className={labelClassName} htmlFor={uid}> <label
className={`form-label ${labelClassName}`.trim()}
htmlFor={uid}
>
{label} {label}
</label> </label>
<div className={`input-group ${groupClassName || ""}`.trim()}> <div className={`input-group ${groupClassName || ""}`.trim()}>
<input <input
className={inputClassName} className={`form-control ${inputClassName}`.trim()}
type={type} type={type}
id={uid} id={uid}
ref={ref} ref={ref}
@ -46,10 +49,12 @@ export const Input = forwardRef(
/> />
{children} {children}
</div> </div>
{error ? <div className="invalid-feedback">{error}</div> : null} {error && <div className="invalid-feedback">{error}</div>}
{helpText ? ( {helpText && (
<small className="form-text text-muted">{helpText}</small> <div className="form-text">
) : null} <small>{helpText}</small>
</div>
)}
</div> </div>
); );
} }

View File

@ -17,7 +17,7 @@ RadioSet.propTypes = {
/** Choices . */ /** Choices . */
choices: PropTypes.arrayOf( choices: PropTypes.arrayOf(
PropTypes.shape({ PropTypes.shape({
/** Choice lable . */ /** Choice label . */
label: PropTypes.oneOfType([ label: PropTypes.oneOfType([
PropTypes.string, PropTypes.string,
PropTypes.element, PropTypes.element,
@ -64,7 +64,7 @@ export function RadioSet({
}); });
return ( return (
<div className="form-group"> <div className="mb-3">
{label && ( {label && (
<label htmlFor={uid} className="d-block"> <label htmlFor={uid} className="d-block">
{label} {label}
@ -72,7 +72,9 @@ export function RadioSet({
)} )}
{radios} {radios}
{helpText && ( {helpText && (
<small className="form-text text-muted">{helpText}</small> <div className="form-text">
<small>{helpText}</small>
</div>
)} )}
</div> </div>
); );
@ -94,23 +96,23 @@ export function Radio({ label, id, helpText, inline, ...props }) {
return ( return (
<> <>
<div <div
className={`custom-control custom-radio ${ className={`${
inline ? "custom-control-inline" : "" inline ? "form-check form-check-inline" : ""
}`.trim()} }`.trim()}
> >
<input <input
id={id} id={id}
className="custom-control-input" className="form-check-input"
type="radio" type="radio"
{...props} {...props}
/> />
<label className="custom-control-label" htmlFor={id}> <label className="form-check-label" htmlFor={id}>
{label} {label}
</label> </label>
{helpText && ( {helpText && (
<small className="form-text text-muted mt-0 mb-3"> <div className="form-text">
{helpText} <small>{helpText}</small>
</small> </div>
)} )}
</div> </div>
</> </>

View File

@ -30,14 +30,18 @@ export function Select({ label, choices, helpText, ...props }) {
)); ));
return ( return (
<div className="form-group"> <div className="mb-3">
<label htmlFor={uid}>{label}</label> <label className="form-label" htmlFor={uid}>
<select className="custom-select" id={uid} {...props}> {label}
</label>
<select className="form-select" id={uid} {...props}>
{options} {options}
</select> </select>
{helpText ? ( {helpText && (
<small className="form-text text-muted">{helpText}</small> <div className="form-text">
) : null} <small>{helpText}</small>
</div>
)}
</div> </div>
); );
} }

View File

@ -22,28 +22,30 @@ Switch.propTypes = {
export function Switch({ label, helpText, switchHeading, ...props }) { export function Switch({ label, helpText, switchHeading, ...props }) {
const uid = useUID(); const uid = useUID();
return ( return (
<div className={`form-group ${switchHeading ? "switch" : ""}`.trim()}>
<div <div
className={`custom-control custom-switch ${ className={`form-check form-switch mb-3 ${
!helpText ? "custom-control-inline" : "" switchHeading ? "d-flex align-items-center" : null
} ${switchHeading ? "switch-heading" : ""}`.trim()} }`.trim()}
> >
<input <input
type="checkbox" type="checkbox"
className="custom-control-input" className={`form-check-input ${
switchHeading ? "me-2" : ""
}`.trim()}
role="switch"
id={uid} id={uid}
{...props} {...props}
/> />
<label className="custom-control-label" htmlFor={uid}> <label className="form-check-label" htmlFor={uid}>
{label} {label}
</label> </label>
{helpText && ( {helpText && (
<small className="form-text text-muted mt-0 mb-3"> <div className="form-text">
{helpText} <small>{helpText}</small>
</small>
)}
</div> </div>
)}
</div> </div>
); );
} }

View File

@ -29,7 +29,7 @@ exports[`<Button /> Render button with spinner 1`] = `
> >
<span <span
aria-hidden="true" aria-hidden="true"
class="spinner-border spinner-border-sm mr-1" class="spinner-border spinner-border-sm me-1"
role="status" role="status"
/> />
<span> <span>

View File

@ -58,7 +58,7 @@ export function ResetWiFiSettings({ ws, endpoint }) {
"If a number of wireless cards doesn't match, you may try to reset the Wi-Fi settings. Note that this will remove the current Wi-Fi configuration and restore the default values." "If a number of wireless cards doesn't match, you may try to reset the Wi-Fi settings. Note that this will remove the current Wi-Fi configuration and restore the default values."
)} )}
</p> </p>
<div className="text-right"> <div className="text-end">
<Button <Button
className="btn-primary" className="btn-primary"
forisFormSize forisFormSize

View File

@ -92,7 +92,7 @@ function DeviceForm({
return ( return (
<> <>
<Switch <Switch
label={<h2>{_(`Wi-Fi ${deviceID + 1}`)}</h2>} label={<h2 className="mb-0">{_(`Wi-Fi ${deviceID + 1}`)}</h2>}
checked={formData.enabled} checked={formData.enabled}
onChange={setFormValue((value) => ({ onChange={setFormValue((value) => ({
devices: { devices: {

View File

@ -87,7 +87,7 @@ function QRCodeModal({ shown, setShown, SSID, password }) {
createAndDownloadPdf(SSID, password); createAndDownloadPdf(SSID, password);
}} }}
> >
<i className="fas fa-arrow-down mr-2" /> <i className="fas fa-arrow-down me-2" />
{_("Download PDF")} {_("Download PDF")}
</Button> </Button>
</ModalFooter> </ModalFooter>

View File

@ -298,7 +298,7 @@ exports[`<WiFiSettings/> Snapshot both modules disabled. 1`] = `
</div> </div>
</div> </div>
<div <div
class="text-right" class="text-end"
> >
<button <button
class="btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center" class="btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center"
@ -321,7 +321,7 @@ exports[`<WiFiSettings/> Snapshot both modules disabled. 1`] = `
If a number of wireless cards doesn't match, you may try to reset the Wi-Fi settings. Note that this will remove the current Wi-Fi configuration and restore the default values. If a number of wireless cards doesn't match, you may try to reset the Wi-Fi settings. Note that this will remove the current Wi-Fi configuration and restore the default values.
</p> </p>
<div <div
class="text-right" class="text-end"
> >
<button <button
class="btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center" class="btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center"
@ -436,7 +436,7 @@ exports[`<WiFiSettings/> Snapshot guest network. 1`] = `
<div <div
@@ -551,10 +633,11 @@ @@ -551,10 +633,11 @@
<div <div
class=\\"text-right\\" class=\\"text-end\\"
> >
<button <button
class=\\"btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center\\" class=\\"btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center\\"

View File

@ -9,7 +9,7 @@ exports[`<SubmitButton/> Render load 1`] = `
> >
<span <span
aria-hidden="true" aria-hidden="true"
class="spinner-border spinner-border-sm mr-1" class="spinner-border spinner-border-sm me-1"
role="status" role="status"
/> />
<span> <span>
@ -41,7 +41,7 @@ exports[`<SubmitButton/> Render saving 1`] = `
> >
<span <span
aria-hidden="true" aria-hidden="true"
class="spinner-border spinner-border-sm mr-1" class="spinner-border spinner-border-sm me-1"
role="status" role="status"
/> />
<span> <span>

View File

@ -190,7 +190,7 @@ export function ForisForm({
<Prompt message={getMessageOnLeavingPage} /> <Prompt message={getMessageOnLeavingPage} />
<form onSubmit={onSubmit} ref={formReference}> <form onSubmit={onSubmit} ref={formReference}>
{childrenWithFormProps} {childrenWithFormProps}
<div className="text-right"> <div className="text-end">
<SubmitButton <SubmitButton
state={getSubmitButtonState()} state={getSubmitButtonState()}
disabled={submitButtonIsDisabled} disabled={submitButtonIsDisabled}