form-payload
Version:
Gets form-payload via form.elements
104 lines (85 loc) • 3.07 kB
JavaScript
import { ControlElementType } from '../../../../../libs/enums/enums.js';
import { checkIsOnOf } from '../../../../../libs/helpers/helpers.js';
import {
HTMLFormControlElement,
HTMLFormOperationalControlElement,
} from '../../../../../libs/types/types.js';
import { checkHasValueAsArray } from '../check-has-value-as-array/check-has-value-as-array.helper.js';
import { checkIsReferToAnotherElement } from '../check-is-refer-to-another-element/check-is-refer-to-another-element.helper.js';
import { getControlElementValue } from '../get-control-element-value/get-control-element-value.helper.js';
import { getOperationalControlElements } from '../get-operational-control-elements/get-operational-control-elements.helper.js';
import { normalizeValueAsArrayControlElementName } from '../normalize-value-as-array-control-element-name/normalize-value-as-array-control-element-name.helper.js';
/**
* @template {Record<string, unknown>} T
* @param {(element: HTMLFormOperationalControlElement) => unknown} getFormControlElementPayloadCallback
* @param {HTMLFormControlsCollection} elements
* @returns {T}
*/
const getFormControlElementsPayload = (
getFormControlElementPayloadCallback,
elements,
) => {
const controlElements = /** @type {HTMLFormControlElement[]} */ ([
...elements,
]);
const operationalControlElements =
getOperationalControlElements(controlElements);
const elementsValues = /** @type {T} */ ({});
for (const operationalControlElement of operationalControlElements) {
const isReferToAnotherElement = checkIsReferToAnotherElement(
operationalControlElement,
operationalControlElements,
);
if (isReferToAnotherElement) {
continue;
}
const isRadioNodeList = checkIsOnOf(
operationalControlElement.type,
ControlElementType.RADIO,
);
if (isRadioNodeList) {
const hasValue = Boolean(
elementsValues[operationalControlElement.name],
);
if (!hasValue) {
const key = /** @type {keyof T} */ (
operationalControlElement.name
);
const value = /** @type {T[keyof T]} */ (
getControlElementValue(
/** @type {RadioNodeList} */ (
elements.namedItem(operationalControlElement.name)
),
)
);
elementsValues[key] = value;
}
continue;
}
const hasValueAsArray = checkHasValueAsArray(operationalControlElement);
if (hasValueAsArray) {
const key = /** @type {keyof T} */ (
normalizeValueAsArrayControlElementName(
operationalControlElement,
)
);
const value = /** @type {T[keyof T]} */ ([
.../** @type {unknown[]} */ (elementsValues[key] ?? []),
.../** @type {unknown[]} */ (
getFormControlElementPayloadCallback(
operationalControlElement,
)
),
]);
elementsValues[key] = value;
continue;
}
const key = /** @type {keyof T} */ (operationalControlElement.name);
const value = /** @type {T[keyof T]} */ (
getFormControlElementPayloadCallback(operationalControlElement)
);
elementsValues[key] = value;
}
return elementsValues;
};
export { getFormControlElementsPayload };